首页 > 编程语言 >C#-Http协议通讯(五)-HttpClient_Get、Post、Put、Delete方法

C#-Http协议通讯(五)-HttpClient_Get、Post、Put、Delete方法

时间:2022-12-25 12:33:55浏览次数:38  
标签:Http string Get C# response new using public HttpClient

/**
*┌──────────────────────────────────────────────────────────────┐
*│ 描    述:C#-HttpClient帮助类                                                  
*│ 作    者:执笔小白                                              
*│ 版    本:1.0                                       
*│ 创建时间:2022-11-20 15:40:56                            
*└──────────────────────────────────────────────────────────────┘
*┌──────────────────────────────────────────────────────────────┐
*│ 命名空间: Util.WebClient                               
*│ 类    名:HttpClientHelper                                     
*└──────────────────────────────────────────────────────────────┘
*/
using Microsoft.VisualBasic;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Text.Json;
using System.Threading.Tasks;

namespace leap_uav_information_platform_Util.WebClient
{
    public class HttpClientHelper
    {
        /// <summary>
        /// Http客户端
        /// HttpClient是.NET4.5引入的一个HTTP客户端库
        /// HttpClient利用了最新的面向任务模式,使得处理异步请求非常容易。
        /// 它适合用于多次请求操作,一般设置好默认头部后,可以进行重复多次的请求,基本上用一个实例可以提交任何的HTTP请求。
        /// HttpClient有预热机制,第一次进行访问时比较慢,所以不应该用到HttpClient就new一个出来,应该使用单例或其他方式获取HttpClient的实例
        /// </summary>
        HttpClient _client;

        /// <summary>
        /// 传输载体
        /// </summary>
        JsonSerializerOptions _serializerOptions;

        public HttpClientHelper()
        {
            _client = new HttpClient();
            _serializerOptions = new JsonSerializerOptions  // 配置从 Web 服务接收并发送到 Web 服务的 JSON 有效负载的格式
            {
                PropertyNamingPolicy = JsonNamingPolicy.CamelCase,  // 属性命名策略-驼峰命名法
                WriteIndented = true,     // 自动缩进
            };
        }

        #region 示例
        /// <summary>
        /// Get方法示例
        /// </summary>
        /// <returns></returns>
        public async Task<List<TodoItem>> GetDemo_Async()
        {
            List<TodoItem> Items = new();

            string urlStr = "";
            Uri uri = new Uri(urlStr);
            try
            {
                HttpResponseMessage response = await _client.GetAsync(uri);
                if (response.IsSuccessStatusCode)  // 调用成功
                {
                    string content = await response.Content.ReadAsStringAsync();
                    Items = JsonSerializer.Deserialize<List<TodoItem>>(content, _serializerOptions);  // 按照指定json格式解析json
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(@"\tERROR {0}", ex.Message);
            }
            return Items;
        }

        /// <summary>
        /// Post方法示例
        /// Put方法示例
        /// 
        /// 201 (CREATED) – 请求导致在发送响应之前创建新资源。
        /// 204(NO CONTENT) – 请求已成功处理,响应有意为空。
        /// 400 (BAD REQUEST) – 服务器无法理解请求。
        /// 404 (找不到) – 请求的资源不存在于服务器上。
        /// 409 (CONFLICT) – 由于服务器上的冲突,无法执行请求
        /// </summary>
        /// <param name="item"></param>
        /// <param name="isNewItem"></param>
        /// <returns></returns>
        public async Task PostOrPutDome_Async(TodoItem item, bool isNewItem = false)
        {
            string urlStr = "";
            Uri uri = new Uri(urlStr);

            try
            {
                string json = JsonSerializer.Serialize<TodoItem>(item, _serializerOptions);
                StringContent content = new StringContent(json, Encoding.UTF8, "application/json");

                HttpResponseMessage response = null;
                if (isNewItem)
                    response = await _client.PostAsync(uri, content);
                else
                    response = await _client.PutAsync(uri, content);

                if (response.IsSuccessStatusCode)
                    Debug.WriteLine(@"\tTodoItem successfully saved.");
            }
            catch (Exception ex)
            {
                Debug.WriteLine(@"\tERROR {0}", ex.Message);
            }
        }

        /// <summary>
        /// Delete方法示例
        /// 
        /// 204 (NO CONTENT) – 请求已成功处理,响应有意为空。
        /// 400 (BAD REQUEST) – 服务器无法理解请求。
        /// 404 (找不到) – 请求的资源不存在于服务器上。
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        public async Task DeleteDome_Async(string id)
        {
            string urlStr = "";
            Uri uri = new Uri(urlStr);

            try
            {
                HttpResponseMessage response = await _client.DeleteAsync(uri);
                if (response.IsSuccessStatusCode)
                    Debug.WriteLine(@"\tTodoItem successfully deleted.");
            }
            catch (Exception ex)
            {
                Debug.WriteLine(@"\tERROR {0}", ex.Message);
            }
        }
        #endregion 示例
    }

    /// <summary>
    /// 测试类
    /// </summary>
    public class TodoItem
    {
        /// <summary>
        /// id
        /// </summary>
        public string ID { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string Name { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public string Notes { get; set; }
        /// <summary>
        /// 
        /// </summary>
        public bool Done { get; set; }
    }
}

 

标签:Http,string,Get,C#,response,new,using,public,HttpClient
From: https://www.cnblogs.com/qq2806933146xiaobai/p/17003873.html

相关文章

  • 线程锁的使用 lock
    importthreadingimporttimelock=threading.Lock()num=0lock=threading.Lock()defplay(name):globalnumforiinrange(100):print(f"{name}正在......
  • AnswerOpenCV学习_Opencv multiple circle detection in a image
    ​​https://answers.opencv.org/question/234920/opencv-multiple-circle-detection-in-a-image/​​​​​​原图如上,目标是从这副图片中寻找“细胞”......
  • Microsoft 365开发:如何通过PnP PowerShell禁用Social bar
    Blog链接:​​​https://blog.51cto.com/13969817​​我们都知道所有Communications和Teams网站的页面底部都有一个Socialbar,在该SocialBar中,用户可以对页面进行点赞、查......
  • Vue 中的 nextTick 有什么作用?
    大家好,我是CoderBin前言这段时间在写Vue的项目,有些地方难免会用到nextTick的地方,所以本文将浅析nextTick的作用、使用场景和背后的原理实现,希望对大家有所帮助,谢谢!如果文......
  • Microsoft 365 开发:2种通用方法禁用SPO Search Bar
    Blog链接:​​​https://blog.51cto.com/13969817​​我们都知道SharePointSearchBar位于每个页面顶部,Microsoft允许网站集管理员使用PowerShell隐藏它,本文将给大家介绍一......
  • [LeetCode] 2389. Longest Subsequence With Limited Sum
    Youaregivenanintegerarray nums oflength n,andanintegerarray queries oflength m.Return anarray answer oflength m where answer[i] ist......
  • C++模板
    //-std=c++14//-O2//#pragmaGCCoptimize("Ofast")//next_permutation(a+1,a+1+n)#include<bits/stdc++.h>#definebintBigInteger#definehhputs("");#definey......
  • k8s本地联调工具kt-connect
    1、KtConnect简介KTConnect(KubernetesDeveloperTool)是轻量级的面向Kubernetes用户的开发测试环境治理辅助工具。其核心是通过建立本地到集群以及集群到本地......
  • ABC 283 ABCD
    https://atcoder.jp/contests/abc283A-Power题目大意:输出a的b次方。SampleInput143SampleOutput164#include<bits/stdc++.h>usingnamespacestd;......
  • C/S结构的软件对测试有什么影响?
    Howdoesaclient/serverenvironmentaffecttesting?Client/serverapplicationscanbequitecomplexduetothemultipledependenciesamongclients,datacom......