zoukankan      html  css  js  c++  java
  • HttpClient 使用

    Api支持

    HttpClient 是基于Task的异步方法组,支持取消、超时异步特性,其可以分类为以下:

    Restful: GetAsync,PostAsync,DeleteAsync,PutAsync

    HttpHeaders属性:DefaultRequestHeaders

    Timeout属性:Timeout,相比HttpRequest的参数,更加地智能,用TimeSpan替换了int。

    Get扩展(本质上是封装了GetAsync()):GetStringAsync,GetStreamAsync,

    GetByteArrayAsync

    SendAsync:Restful的实现应该是封装了此方法。需要一个HttpRequestMessage作为参数。

    HttpContent

    使用post方式请求示例:

    
    public static async Task<string> CreateUrlAsync(string url, Dictionary<string, string> parameters, string accessToken, int timeount = 10)
    {
        HttpClient httpClient = new HttpClient(new MyHttpClientHandlerProxy(accessToken));
        httpClient.DefaultRequestHeaders.Add("Authorization", "Bearer " + accessToken);
        httpClient.Timeout = TimeSpan.FromSeconds(timeount);
    
        FormUrlEncodedContent content = new FormUrlEncodedContent(parameters);
        var response = await httpClient.PostAsync(url, content);
        var str = await response.Content.ReadAsStringAsync();
    
        return str;
    }
    

    其他的Content类型:

    StreamContent,StringContent,MutilpartContent,MultipartFormDataContent

    HttpClientHandler

    作为一个代理角色,可以支持自定义的处理方式。

    public class MyHttpClientHandlerProxy : HttpClientHandler
    {
        private string accessToken;
        public MyHttpClientHandlerProxy(string accessToken)
        {
            this.accessToken = accessToken;
        }
    
        protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken)
        {
            //处理Headers
            request.Headers.Referrer = new Uri("www.imctf.com");
            request.Headers.Add("Authorization", "Bearer " + accessToken);
            request.Headers.Add("UserAgent", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727)");
    
            //执行
            var response = await base.SendAsync(request, cancellationToken);
    
            //处理编码
            var contentType = response.Content.Headers.ContentType;
            if (string.IsNullOrEmpty(contentType.CharSet))
            {
                contentType.CharSet = "GBK";
            }
    
            return response;
        }
    }
    

    使用:

    HttpClient httpClient = new HttpClient(new MyHttpClientHandlerProxy(accessToken));
    
  • 相关阅读:
    C# Winform 运行异常 CefSharp.core.dll 找不到指定的模块
    WCF TCP通信方式 通过IIS承载调试
    [译]Modern Core Graphics with Swift系列
    博客搬家
    [ios] 定位报错Error Domain=kCLErrorDomain Code=0 "The operation couldn’t be completed. (kCLErrorDomain error 0.)"
    [IOS] 'Double' is not convertible to 'CGFloat'
    [IOS]swift 使用AVOS的API
    [IOS]使用了cocoapods 抱错Pods was rejected as an implicit dependency for ‘libPods.a’ because its architectures ......
    [IOS]cocoapos 两个ruby源的对比
    [IOS]Swift 遍历预制的本地资源文件
  • 原文地址:https://www.cnblogs.com/pengzhen/p/5784804.html
Copyright © 2011-2022 走看看