1、打开net core项目中的Startup.cs文件,找到ConfigureServices方法,添加HttpClient
services.AddHttpClient();//注入httpclient 用于调用外部api

2、控制器中注入IHttpClientFactory
1. 注入方式
using System.Net.Http;private IHttpClientFactory _httpClient;public WeChatController( IHttpClientFactory httpClient){this._httpClient = httpClient;}

2. 继承StringContent(命名空间为:System.Net.Http)的类
public class JsonContent : StringContent{public JsonContent(object obj) :base(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json"){ }}
1.Get请求
//设置请求的路径var url = "";//使用注入的httpclientfactory获取clientvar client = _httpClient.CreateClient();client.BaseAddress = new Uri(url);//设置请求体中的内容,并以post的方式请求var response = await client.GetAsync(url);//获取请求到数据,并转化为字符串var result = response.Content.ReadAsStringAsync().Result;
2. Post请求
//设置请求的路径var url = "";//使用注入的httpclientfactory获取clientvar client = _httpClient.CreateClient();client.BaseAddress = new Uri(url);//设置请求体中的内容,并以post的方式请求var response = await client.PostAsync(url,new JsonContent(new { PayId= pay_id, DeviceId= sbid, DeviceMode="1", PayMode="0", PayDataId= "1234567890123456", PayData=pd, PayTime = datetime , PayAmount =amt, PayNum =1}));//获取请求到数据,并转化为字符串back = response.Content.ReadAsStringAsync().Result;
3、调用get方式api
1. httpClient注入的方式使用
/// <summary>/// 获取微信ID/// </summary>/// <returns></returns>[HttpGet]public async Task<dynamic> GetWechatID(string js_code) {try{var url = $"https://api.weixin.qq.com/sns/jscode2session?appid=123&secret=123&js_code={js_code}&grant_type=authorization_code";//使用注入的httpclientfactory获取client//using (HttpClient client = new HttpClient())如果不使用注入client的方式可以直接new client对象var client = _httpClient.CreateClient();client.BaseAddress = new Uri(url);//设置请求体中的内容,并以post的方式请求var response = await client.GetAsync(url);//if (response.StatusCode == HttpStatusCode.OK) 可以获取调用服务器是否正常 200 400 500 状态码//获取请求到数据,并转化为字符串//var result = response.Content.ReadAsStringAsync().Result;var result = response.Content.ReadAsStringAsync();return Ok(result.Result);}catch (Exception e){return Ok( e.Message );}}
2. 非注入方式使用httpClient
/// <summary>/// Get请求/// </summary>/// <param name="url"></param>/// <param name="token"></param>/// <param name="httpClient"></param>/// <returns></returns>public static async Task<T验证授权返回> DoGetRequestAsync(string url, string token){try{using (HttpClient client = new HttpClient()){client.BaseAddress = new Uri(url);if (!string.IsNullOrEmpty(token)) client.DefaultRequestHeaders.Add("Authorization", token);//设置请求体中的内容,并以gost的方式请求var response = await client.GetAsync(url);//获取请求到数据,并转化为字符串var result = response.Content.ReadAsStringAsync().Result;if (response.StatusCode == HttpStatusCode.OK){return new T验证授权返回{ ok = true, msg = "响应成功", data = result };}return new T验证授权返回 { ok = false, msg = "请求异常", data = result };}}catch (Exception e){return new T验证授权返回 { ok = false, msg = e.Message, data = null };}}
4、调用post方式api
post请求内容类型(ContentType) 常见的就几种
- application/json
- application/x-www-form-urlencoded
- text/xml
1. application/json类型
/// <summary>/// post请求/// </summary>/// <param name="Url"></param>/// <param name="message"></param>/// <returns></returns>public static async Task<dynamic> DoPost<dynamic>(string Url, object message){string jsonContent = JsonConvert.SerializeObject(message);//message为要提交的数据 例new {name="张三",sex="男"}string responseBody = string.Empty;using (HttpClient httpClient = new HttpClient()){var content = new StringContent(jsonContent, Encoding.UTF8, "application/json");//请求参数 请求消息内容httpClient.DefaultRequestHeaders.Add("Method", "Post");string authorization = $"{userName}:{password}";//basic认证方式 用户名:密码 然后base64加密. 如果是其它认证方式 请修改 如果接口未加密省略此行var authorizationBased64 = "Basic " + Convert.ToBase64String(newASCIIEncoding().GetBytes(authorization));//如果接口未加密省略此行httpClient.DefaultRequestHeaders.Add("Authorization", authorizationBased64); //basic认证basc认证 如果接口未加密省略此行HttpResponseMessage response = await httpClient.PostAsync(Url, content);//response.EnsureSuccessStatusCode();建议不要使用 一旦相应失败会直接抛出异常 参考官方文档https://docs.microsoft.com/zh-cn/dotnet/api/system.net.http.httpresponsemessage.ensuresuccessstatuscode?redirectedfrom=MSDN&view=net-5.0#System_Net_Http_HttpResponseMessage_EnsureSuccessStatusCodeif (response.StatusCode==HttpStatusCode.OK){responseBody = await response.Content.ReadAsStringAsync();dynamic res = (dynamic)JsonConvert.DeserializeObject<dynamic>(responseBody);return res;}}}
2. application/x-www-form-urlencoded
这里有些注意的地方 一开始参数我是直接用的
//parameter 为 a=1&b=2&c=3 的形式 但是返回结果总是报400错误
var content = new StringContent(parameter, Encoding.UTF8, “application/x-www-form-urlencoded “);//请求参数
后来就改成了 FormUrlEncodedContent这种形式 可以正常提交
public static async Task<dynamic> DoPostRequest(string Url, string token, IHttpClientFactory httpClient){try{using (var client = httpClient.CreateClient()){string responseBody = string.Empty;//var content = new StringContent(parameter, Encoding.UTF8, ContentType);//请求参数 请求消息内容 application/x-www-form-urlencoded "application/json"请求类型client.DefaultRequestHeaders.Add("Method", "Post");var content = new FormUrlEncodedContent(new Dictionary<string, string>(){{"username", "aadasd"},{"password", "123123"}});if (!string.IsNullOrEmpty(token)){client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); //Bearer认证 如果接口未加密省略此行//var authorizationBased64 = "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes($"{userName}:{password}"));//basic认证方式 用户名:密码 然后base64加密//client.DefaultRequestHeaders.Add("Authorization", authorizationBased64);}content.Headers.Add("ContentType", "application/x-www-form-urlencoded");HttpResponseMessage response = await client.PostAsync(Url, content);//response.EnsureSuccessStatusCode();建议不要使用 一旦相应失败会直接抛出异常 参考官方文档https://docs.microsoft.com/zh-cn/dotnet/api/system.net.http.httpresponsemessage.ensuresuccessstatuscode?redirectedfrom=MSDN&view=net-5.0#System_Net_Http_HttpResponseMessage_EnsureSuccessStatusCodeif (response.StatusCode==HttpStatusCode.OK){responseBody = response.Content.ReadAsStringAsync().Result;dynamic res = JsonConvert.DeserializeObject<dynamic>(responseBody);return res;}return new {result="请求异常" };}}catch (Exception e){return new { result = "请求异常" };}}
3. 非注入方式使用httpClient
/// <summary>/// post请求/// </summary>/// <param name="Url"></param>/// <param name="parameter">序列化之后的json</param>/// <param name="ContentType">例如:"application/json" application/x-www-form-urlencoded text/xml</param>/// <param name="token"></param>/// <param name="httpClient"></param>/// <returns></returns>public static async Task<dynamic> DoPostRequest(string Url, string parameter, string ContentType, string token ){try{using (HttpClient client = new HttpClient()){string responseBody = string.Empty;client.DefaultRequestHeaders.Add("Method", "Post");var content = new StringContent(parameter, Encoding.UTF8, ContentType);if (!string.IsNullOrEmpty(token)){client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); //Bearer认证 如果接口未加密省略此行//var authorizationBased64 = "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes($"{userName}:{password}"));//basic认证方式 用户名:密码 然后base64加密//client.DefaultRequestHeaders.Add("Authorization", authorizationBased64);}HttpResponseMessage response = await client.PostAsync(Url, content);//response.EnsureSuccessStatusCode();if (response.StatusCode == HttpStatusCode.OK){responseBody = response.Content.ReadAsStringAsync().Result;dynamic res = JsonConvert.DeserializeObject<dynamic>(responseBody);return new { ok = true, isTryException = false, data = res };}else{responseBody = response.Content.ReadAsStringAsync().Result;//Response结果 res = JsonConvert.DeserializeObject<Response结果>(responseBody);return new { ok = false, isTryException = false, data = responseBody };}}}catch (Exception e){return new { ok = false, isTryException = true, msg = e.Message, data = "" };}}
调用方法的时候要加await 方法改成async
public async Task<dynamic> GetPHtokenAsync(T_login login) {try{dynamic aaa=await PublicMethods.DoPostRequest("http://localhost:123123/connect/token", parameter, _httpClient);return aaa;}catch (Exception e){throw;}
