最近在写项目,这里打算整理出项目中比较常用的功能。
通常我们发送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(); } }