1、打开net core项目中的Startup.cs文件,找到ConfigureServices方法,添加HttpClient

  1. services.AddHttpClient();//注入httpclient 用于调用外部api

.NET Core | 请求外部api接口 - 图1

2、控制器中注入IHttpClientFactory

1. 注入方式

  1. using System.Net.Http;
  2. private IHttpClientFactory _httpClient;
  3. public WeChatController( IHttpClientFactory httpClient)
  4. {
  5. this._httpClient = httpClient;
  6. }

.NET Core | 请求外部api接口 - 图2

2. 继承StringContent(命名空间为:System.Net.Http)的类

  1. public class JsonContent : StringContent
  2. {
  3. public JsonContent(object obj) :
  4. base(JsonConvert.SerializeObject(obj), Encoding.UTF8, "application/json")
  5. { }
  6. }
1.Get请求
  1. //设置请求的路径
  2. var url = "";
  3. //使用注入的httpclientfactory获取client
  4. var client = _httpClient.CreateClient();
  5. client.BaseAddress = new Uri(url);
  6. //设置请求体中的内容,并以post的方式请求
  7. var response = await client.GetAsync(url);
  8. //获取请求到数据,并转化为字符串
  9. var result = response.Content.ReadAsStringAsync().Result;
2. Post请求
  1. //设置请求的路径
  2. var url = "";
  3. //使用注入的httpclientfactory获取client
  4. var client = _httpClient.CreateClient();
  5. client.BaseAddress = new Uri(url);
  6. //设置请求体中的内容,并以post的方式请求
  7. 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}));
  8. //获取请求到数据,并转化为字符串
  9. back = response.Content.ReadAsStringAsync().Result;

3、调用get方式api

1. httpClient注入的方式使用

  1. /// <summary>
  2. /// 获取微信ID
  3. /// </summary>
  4. /// <returns></returns>
  5. [HttpGet]
  6. public async Task<dynamic> GetWechatID(string js_code) {
  7. try
  8. {
  9. var url = $"https://api.weixin.qq.com/sns/jscode2session?appid=123&secret=123&js_code={js_code}&grant_type=authorization_code";
  10. //使用注入的httpclientfactory获取client
  11. //using (HttpClient client = new HttpClient())如果不使用注入client的方式可以直接new client对象
  12. var client = _httpClient.CreateClient();
  13. client.BaseAddress = new Uri(url);
  14. //设置请求体中的内容,并以post的方式请求
  15. var response = await client.GetAsync(url);
  16. //if (response.StatusCode == HttpStatusCode.OK) 可以获取调用服务器是否正常 200 400 500 状态码
  17. //获取请求到数据,并转化为字符串
  18. //var result = response.Content.ReadAsStringAsync().Result;
  19. var result = response.Content.ReadAsStringAsync();
  20. return Ok(result.Result);
  21. }
  22. catch (Exception e)
  23. {
  24. return Ok( e.Message );
  25. }
  26. }

2. 非注入方式使用httpClient

  1. /// <summary>
  2. /// Get请求
  3. /// </summary>
  4. /// <param name="url"></param>
  5. /// <param name="token"></param>
  6. /// <param name="httpClient"></param>
  7. /// <returns></returns>
  8. public static async Task<T验证授权返回> DoGetRequestAsync(string url, string token)
  9. {
  10. try
  11. {
  12. using (HttpClient client = new HttpClient())
  13. {
  14. client.BaseAddress = new Uri(url);
  15. if (!string.IsNullOrEmpty(token)) client.DefaultRequestHeaders.Add("Authorization", token);
  16. //设置请求体中的内容,并以gost的方式请求
  17. var response = await client.GetAsync(url);
  18. //获取请求到数据,并转化为字符串
  19. var result = response.Content.ReadAsStringAsync().Result;
  20. if (response.StatusCode == HttpStatusCode.OK)
  21. {
  22. return new T验证授权返回{ ok = true, msg = "响应成功", data = result };
  23. }
  24. return new T验证授权返回 { ok = false, msg = "请求异常", data = result };
  25. }
  26. }
  27. catch (Exception e)
  28. {
  29. return new T验证授权返回 { ok = false, msg = e.Message, data = null };
  30. }
  31. }

4、调用post方式api

post请求内容类型(ContentType) 常见的就几种

  • application/json
  • application/x-www-form-urlencoded
  • text/xml

1. application/json类型

  1. /// <summary>
  2. /// post请求
  3. /// </summary>
  4. /// <param name="Url"></param>
  5. /// <param name="message"></param>
  6. /// <returns></returns>
  7. public static async Task<dynamic> DoPost<dynamic>(string Url, object message)
  8. {
  9. string jsonContent = JsonConvert.SerializeObject(message);//message为要提交的数据 例new {name="张三",sex="男"}
  10. string responseBody = string.Empty;
  11. using (HttpClient httpClient = new HttpClient())
  12. {
  13. var content = new StringContent(jsonContent, Encoding.UTF8, "application/json");//请求参数 请求消息内容
  14. httpClient.DefaultRequestHeaders.Add("Method", "Post");
  15. string authorization = $"{userName}:{password}";//basic认证方式 用户名:密码 然后base64加密. 如果是其它认证方式 请修改 如果接口未加密省略此行
  16. var authorizationBased64 = "Basic " + Convert.ToBase64String(newASCIIEncoding().GetBytes(authorization));//如果接口未加密省略此行
  17. httpClient.DefaultRequestHeaders.Add("Authorization", authorizationBased64); //basic认证basc认证 如果接口未加密省略此行
  18. HttpResponseMessage response = await httpClient.PostAsync(Url, content);
  19. //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_EnsureSuccessStatusCode
  20. if (response.StatusCode==HttpStatusCode.OK)
  21. {
  22. responseBody = await response.Content.ReadAsStringAsync();
  23. dynamic res = (dynamic)JsonConvert.DeserializeObject<dynamic>(responseBody);
  24. return res;
  25. }
  26. }
  27. }

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这种形式 可以正常提交

  1. public static async Task<dynamic> DoPostRequest(string Url, string token, IHttpClientFactory httpClient)
  2. {
  3. try
  4. {
  5. using (var client = httpClient.CreateClient())
  6. {
  7. string responseBody = string.Empty;
  8. //var content = new StringContent(parameter, Encoding.UTF8, ContentType);//请求参数 请求消息内容 application/x-www-form-urlencoded "application/json"请求类型
  9. client.DefaultRequestHeaders.Add("Method", "Post");
  10. var content = new FormUrlEncodedContent(new Dictionary<string, string>()
  11. {
  12. {"username", "aadasd"},
  13. {"password", "123123"}
  14. });
  15. if (!string.IsNullOrEmpty(token))
  16. {
  17. client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); //Bearer认证 如果接口未加密省略此行
  18. //var authorizationBased64 = "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes($"{userName}:{password}"));//basic认证方式 用户名:密码 然后base64加密
  19. //client.DefaultRequestHeaders.Add("Authorization", authorizationBased64);
  20. }
  21. content.Headers.Add("ContentType", "application/x-www-form-urlencoded");
  22. HttpResponseMessage response = await client.PostAsync(Url, content);
  23. //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_EnsureSuccessStatusCode
  24. if (response.StatusCode==HttpStatusCode.OK)
  25. {
  26. responseBody = response.Content.ReadAsStringAsync().Result;
  27. dynamic res = JsonConvert.DeserializeObject<dynamic>(responseBody);
  28. return res;
  29. }
  30. return new {result="请求异常" };
  31. }
  32. }
  33. catch (Exception e)
  34. {
  35. return new { result = "请求异常" };
  36. }
  37. }

3. 非注入方式使用httpClient

  1. /// <summary>
  2. /// post请求
  3. /// </summary>
  4. /// <param name="Url"></param>
  5. /// <param name="parameter">序列化之后的json</param>
  6. /// <param name="ContentType">例如:"application/json" application/x-www-form-urlencoded text/xml</param>
  7. /// <param name="token"></param>
  8. /// <param name="httpClient"></param>
  9. /// <returns></returns>
  10. public static async Task<dynamic> DoPostRequest(string Url, string parameter, string ContentType, string token )
  11. {
  12. try
  13. {
  14. using (HttpClient client = new HttpClient())
  15. {
  16. string responseBody = string.Empty;
  17. client.DefaultRequestHeaders.Add("Method", "Post");
  18. var content = new StringContent(parameter, Encoding.UTF8, ContentType);
  19. if (!string.IsNullOrEmpty(token))
  20. {
  21. client.DefaultRequestHeaders.Add("Authorization", "Bearer " + token); //Bearer认证 如果接口未加密省略此行
  22. //var authorizationBased64 = "Basic " + Convert.ToBase64String(new ASCIIEncoding().GetBytes($"{userName}:{password}"));//basic认证方式 用户名:密码 然后base64加密
  23. //client.DefaultRequestHeaders.Add("Authorization", authorizationBased64);
  24. }
  25. HttpResponseMessage response = await client.PostAsync(Url, content);
  26. //response.EnsureSuccessStatusCode();
  27. if (response.StatusCode == HttpStatusCode.OK)
  28. {
  29. responseBody = response.Content.ReadAsStringAsync().Result;
  30. dynamic res = JsonConvert.DeserializeObject<dynamic>(responseBody);
  31. return new { ok = true, isTryException = false, data = res };
  32. }
  33. else
  34. {
  35. responseBody = response.Content.ReadAsStringAsync().Result;
  36. //Response结果 res = JsonConvert.DeserializeObject<Response结果>(responseBody);
  37. return new { ok = false, isTryException = false, data = responseBody };
  38. }
  39. }
  40. }
  41. catch (Exception e)
  42. {
  43. return new { ok = false, isTryException = true, msg = e.Message, data = "" };
  44. }
  45. }

调用方法的时候要加await 方法改成async

  1. public async Task<dynamic> GetPHtokenAsync(T_login login) {
  2. try
  3. {
  4. dynamic aaa=await PublicMethods.DoPostRequest("http://localhost:123123/connect/token", parameter, _httpClient);
  5. return aaa;
  6. }
  7. catch (Exception e)
  8. {
  9. throw;
  10. }