• .net core HttpClient


    最近在写项目,这里打算整理出项目中比较常用的功能。

    通常我们发送http请求是在前端使用表单或者ajax,那么.net core后台发送http请求该如何呢?

    这里我使用HttpClient

    因为通常提交的方法是post或者get,我使用简单工厂模式来设计此功能。

    using System;
    using System.Collections.Generic;
    using System.Text;
    
    namespace Tools.HttpClientHelper
    {
        public abstract class AbsHttpHelper
        {
            //请求的主机
            public string baseAddr = string.Empty;
            //是否启用验证
            public bool isAuth = false;
            //验证字符串
            public string auth = string.Empty;//"Bearer "+token
            //请求路径
            public string path = string.Empty;
    
            public abstract string GetResult();
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Net.Http;
    using System.Text;
    
    namespace Tools.HttpClientHelper
    {
        public class GetHelper: AbsHttpHelper
        {
    
            /// <summary>
            /// 
            /// </summary>
            /// <param name="baseAddr">访问的主机</param>
            /// <param name="auth">验证字符串</param>
            /// <param name="path">请求的路径</param>
            public GetHelper(string baseAddr, string auth, string path)
            {
                this.baseAddr = baseAddr;
                this.auth = auth;
                this.path = path;
            }
    
            public override string GetResult()
            {
                string resultContent = string.Empty;
                using (HttpClient client = new HttpClient())
                {
                    client.BaseAddress = new Uri(baseAddr);
                    var t = client.GetAsync(path);
                    t.Wait();
                    var result = t.Result;
                    resultContent = result.Content.ReadAsStringAsync().Result;
                }
                return resultContent;
            }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Net.Http;
    using System.Text;
    
    namespace Tools.HttpClientHelper
    {
        public class PostHelper:AbsHttpHelper
        {
            //发送的数据
            private FormUrlEncodedContent content = null;
    
            /// <summary>
            /// 构造方法
            /// </summary>
            /// <param name="baseAddr">请求的主机</param>
            /// <param name="auth">验证字符串</param>
            /// <param name="path">请求路径</param>
            /// <param name="isAuth">是否启用验证</param>
            /// <param name="content">发送的数据</param>
            public PostHelper(string baseAddr, string auth, string path, bool isAuth, FormUrlEncodedContent content)
            {
                this.baseAddr = baseAddr;
                this.auth = auth;
                this.content = content;
                this.path = path;
                this.isAuth = isAuth;
            }
    
            public override string GetResult()
            {
                string resultContent = string.Empty;
                using (HttpClient client = new HttpClient())
                {
                    client.BaseAddress = new Uri(baseAddr);
                    if (isAuth)
                    {
                        client.DefaultRequestHeaders.Add("Authorization", auth);
                    }
                    var t = client.PostAsync(path, content);
                    t.Wait();
                    var result = t.Result;
                    resultContent = result.Content.ReadAsStringAsync().Result;
                }
                return resultContent;
            }
        }
    }
    using System;
    using System.Collections.Generic;
    using System.Net.Http;
    using System.Text;
    
    namespace Tools.HttpClientHelper
    {
        /// <summary>
        /// 创建http请求对象的工厂类
        /// </summary>
        public class HttpFactory
        {
            /// <summary>
            /// 创建http请求对象
            /// </summary>
            /// <param name="method">get/post</param>
            /// <param name="baseAddr">请求的主机</param>
            /// <param name="auth">验证字符串</param>
            /// <param name="path">请求路径</param>
            /// <param name="isAuth">是否启用验证,get请求时为false</param>
            /// <param name="content">发送的数据,get请求时为null</param>
            /// <returns></returns>
            public AbsHttpHelper CreateHttpHelper(string method, string baseAddr, string auth, string path, bool isAuth, FormUrlEncodedContent content)
            {
                AbsHttpHelper helper = null;
                method = method.ToLower();
                switch (method)
                {
                    case "get":
                        helper = new GetHelper(baseAddr, auth, path);
                        break;
                    case "post":
                        helper = new PostHelper(baseAddr, auth, path, isAuth, content);
                        break;
                }
                return helper;
            }
        }
    }

    调用:

    HttpFactory httpFactory = new HttpFactory();
                AbsHttpHelper helper = httpFactory.CreateHttpHelper("get", baseAddr, "", path, false, null);
                string rs = helper.GetResult();

    注意,这里的post方法只支持表单的键值对提交,content 如下

                var content = new FormUrlEncodedContent(new[] {
                        new KeyValuePair<string, string>("apiCode", "GetUser"),
                        new KeyValuePair<string, string>("pCount", "10"),
                        new KeyValuePair<string, string>("pNum", "1")
                        });

    如果要传json,则需使用StringContent,如下:

    protected async Task SendMsgAsync(string touser, string msg)
            {
                string sendMsgPath = AppConfig.CreateConfig().sendMsgPath + AccessTokenJob.token; //发送的路径
                var msgObj = new { content = msg };
    
                var content = new
                {
                    touser = touser,
                    msgtype = "text",
                    AppConfig.CreateConfig().agentid,
                    text = msgObj,
                    safe = 0
                };
                var jsonStr = Newtonsoft.Json.JsonConvert.SerializeObject(content);
                StringContent contentStr = new StringContent(jsonStr);
                using (HttpClient client = new HttpClient())
                {
                    var respMsg = await client.PostAsync(sendMsgPath, contentStr);
                    string msgBody = await respMsg.Content.ReadAsStringAsync();
                }
            }
  • 相关阅读:
    Stream 常规操作
    Stream Introduction
    那些从阿里巴巴走出的创业牛人们
    码农转型传统行业更容易成功?
    创业者怎么讲故事打动投资人?
    李明远:移动互联网的创业时代
    想当年,那些抄我们试卷的坏分子,如今个个都当了老板.
    为什么说淘宝创业已难赚钱?
    让低版本IE支持Html5的新语义标签
    译文:TypeScript新手指南
  • 原文地址:https://www.cnblogs.com/SasaL/p/11155614.html
Copyright © 2020-2023  润新知