翼度科技»论坛 编程开发 .net 查看内容

.Net Core WebApi

5

主题

5

帖子

15

积分

新手上路

Rank: 1

积分
15

目录

MiniMalAPi



  • 最小的api, 请求都写在Program.cs中, 可以做微服务
Demo

Program.cs
  1. //基本请求
  2. app.MapGet("/GetTest", () => new { result = "123", code = 200 }).WithTags("General Request");
  3. app.MapPost("/PostTest", () => new { result = "123", code = 200 }).WithTags("General Request");
  4. app.MapPut("/PutTest", () => new { result = "123", code = 200 }).WithTags("General Request");
  5. app.MapDelete("DeletePut", () => new { result = "123", code = 200 }).WithTags("General Request");
  6. //注入
  7. app.MapGet("/GetTestIoc", (IStudent student,IWrite pen) => student.Calligraphy(pen)).WithTags("Ioc");
  8. app.MapGet("/GetTestIocById", (IStudent student,IWrite pen,int? id) => student.Calligraphy(pen)).WithTags("Ioc");
  9. app.MapPost("/GetTestIocByObject", (IStudent student,IWrite pen,Result result) => student.Calligraphy(pen)).WithTags("Ioc");
复制代码
Swagger

文档+信息

Program.cs
  1. builder.Services.AddSwaggerGen(setup =>
  2. {
  3.     setup.SwaggerDoc("V1", new()
  4.     {
  5.         Title = "qfccc",
  6.         Version = "V1",
  7.         Description = "qfccc description",
  8.     });
  9. });
  10. app.UseSwaggerUI(setup =>
  11. {
  12.     setup.SwaggerEndpoint("/swagger/V1/swagger.json", "V1");
  13. });
复制代码
API版本控制



  • 该例子仅供参考
ApiVersion.cs
  1. namespace WebApiDemo.VersionControl
  2. {
  3.     public class ApiVersion
  4.     {
  5.         public static string? Version1;
  6.         public static string? Version2;
  7.         public static string? Version3;
  8.         public static string? Version4;
  9.         public static string? Version5;
  10.     }
  11. }
复制代码
Version1Controller.cs



  • 这里其他版本api 修改ApiVersion.Version1即可
  1. using Microsoft.AspNetCore.Http;
  2. using Microsoft.AspNetCore.Mvc;
  3. using WebApiDemo.VersionControl;
  4. namespace WebApiDemo.Controllers
  5. {
  6.     [ApiExplorerSettings(GroupName = nameof(ApiVersion.Version1))]
  7.     [Route($"api/[controller]/[action]/api.{nameof(ApiVersion.Version1)}")]
  8.     [ApiController]
  9.     public class Version1Controller : ControllerBase
  10.     {
  11.         [HttpGet]
  12.         public IActionResult GetString() => new JsonResult(new { result = "Success" });
  13.         [HttpPost]
  14.         public IActionResult PostString() => new JsonResult(new { result = "Success" });
  15.         [HttpPut]
  16.         public IActionResult PutString() => new JsonResult(new { result = "Success" });
  17.         [HttpDelete]
  18.         public IActionResult DeleteString() => new JsonResult(new { result = "Success" });
  19.     }
  20. }
复制代码
Program.cs
  1. builder.Services.AddSwaggerGen(setup =>
  2. {
  3.     foreach (var field in typeof(ApiVersion).GetFields())
  4.     {
  5.         setup.SwaggerDoc(field.Name, new()
  6.         {
  7.             Title = "qfccc",
  8.             Version = field.Name,
  9.             Description = $"qfccc api {field.Name}",
  10.         });
  11.     }
  12. });
  13. app.UseSwaggerUI(setup =>
  14. {
  15.     foreach (var field in typeof(ApiVersion).GetFields())
  16.     {
  17.         setup.SwaggerEndpoint($"/swagger/{field.Name}/swagger.json", field.Name);
  18.     }
  19. });
复制代码
生成注释


  • 项目点击右键 -> 属性 -> 输出 -> 勾选(文档文件)
  • 在AddSwaggerGen中间件添加下方代码
  1. string? basePath = Path.GetDirectoryName(typeof(Program).Assembly.Location);
  2. if(basePath is not null)
  3. {
  4.     string apiPath = Path.Combine(basePath, "项目名称.xml");
  5.     setup.IncludeXmlComments(apiPath);
  6. }
复制代码
解决跨域


  • 调用方调用自己后台,然后用后台请求目标接口解决跨域
  • 服务器支持跨域请求

    • 在Action中添加这行代码:
    • HttpContext.Response.Headers.Add("Access-Control-Allow-Origin", "*");

  • 使用ActionFilter 实现过滤器,代码与上方一致, 然后在Program.cs 文件中全局注册一下该过滤器,但是不支持Post,Put,Delete这种请求
  • 所有请求都支持跨域可以在Program.cs中增加下方代码:
  1. builder.Services.AddCors( setup =>
  2. {
  3.     setup.AddPolicy("SolveCrossOrigin", policy =>
  4.     {
  5.         policy.AllowAnyHeader().AllowAnyMethod().AllowAnyOrigin();
  6.     });
  7. });
  8. app.UseCors("SolveCrossOrigin");
复制代码
.Net 后台请求封装
  1. using Newtonsoft.Json;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Net.Http;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace NET5WebApplication.Utility
  8. {
  9.     public static class HttpClientHelper
  10.     {
  11.         /// <summary>
  12.         /// 发起POST同步请求
  13.         /// </summary>
  14.         /// <param name="url"></param>
  15.         /// <param name="postData"></param>
  16.         /// <param name="contentType">application/xml、application/json、application/text、application/x-www-form-urlencoded</param>
  17.         /// <param name="headers">填充消息头</param>
  18.         /// <returns></returns>
  19.         public static string HttpPost(string url, string postData = null, string contentType = "application/json", int timeOut = 30, Dictionary<string, string> headers = null)
  20.         {
  21.             postData = postData ?? "";
  22.             using (HttpClient client = new System.Net.Http.HttpClient())
  23.             {
  24.                 if (headers != null)
  25.                 {
  26.                     foreach (var header in headers)
  27.                         client.DefaultRequestHeaders.Add(header.Key, header.Value);
  28.                 }
  29.                 using (HttpContent httpContent = new StringContent(postData, Encoding.UTF8))
  30.                 {
  31.                     if (contentType != null)
  32.                         httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(contentType);
  33.                     HttpResponseMessage response = client.PostAsync(url, httpContent).Result;
  34.                     return response.Content.ReadAsStringAsync().Result;
  35.                 }
  36.             }
  37.         }
  38.         /// <summary>
  39.         /// 发起POST异步请求
  40.         /// </summary>
  41.         /// <param name="url"></param>
  42.         /// <param name="postData"></param>
  43.         /// <param name="contentType">application/xml、application/json、application/text、application/x-www-form-urlencoded</param>
  44.         /// <param name="headers">填充消息头</param>
  45.         /// <returns></returns>
  46.         public static async Task<string> HttpPostAsync(string url, string postData = null, string contentType = "application/json", int timeOut = 30, Dictionary<string, string> headers = null)
  47.         {
  48.             postData = postData ?? "";
  49.             using (System.Net.Http.HttpClient client = new System.Net.Http.HttpClient())
  50.             {
  51.                 client.Timeout = new TimeSpan(0, 0, timeOut);
  52.                 if (headers != null)
  53.                 {
  54.                     foreach (var header in headers)
  55.                         client.DefaultRequestHeaders.Add(header.Key, header.Value);
  56.                 }
  57.                 using (HttpContent httpContent = new StringContent(postData, Encoding.UTF8))
  58.                 {
  59.                     if (contentType != null)
  60.                         httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(contentType);
  61.                     HttpResponseMessage response = await client.PostAsync(url, httpContent);
  62.                     return await response.Content.ReadAsStringAsync();
  63.                 }
  64.             }
  65.         }
  66.         /// <summary>
  67.         /// 发起GET同步请求
  68.         /// </summary>
  69.         /// <param name="url"></param>
  70.         /// <param name="headers"></param>
  71.         /// <param name="contentType"></param>
  72.         /// <returns></returns>
  73.         public static string HttpGet(string url, string contentType = "application/json", Dictionary<string, string> headers = null)
  74.         {
  75.             using (HttpClient client = new HttpClient())
  76.             {
  77.                 if (contentType != null)
  78.                     client.DefaultRequestHeaders.Add("ContentType", contentType);
  79.                 if (headers != null)
  80.                 {
  81.                     foreach (var header in headers)
  82.                         client.DefaultRequestHeaders.Add(header.Key, header.Value);
  83.                 }
  84.                 HttpResponseMessage response = client.GetAsync(url).Result;
  85.                 return response.Content.ReadAsStringAsync().Result;
  86.             }
  87.         }
  88.         /// <summary>
  89.         /// 发起GET异步请求
  90.         /// </summary>
  91.         /// <param name="url"></param>
  92.         /// <param name="headers"></param>
  93.         /// <param name="contentType"></param>
  94.         /// <returns></returns>
  95.         public static async Task<string> HttpGetAsync(string url, string contentType = "application/json", Dictionary<string, string> headers = null)
  96.         {
  97.             using (System.Net.Http.HttpClient client = new System.Net.Http.HttpClient())
  98.             {
  99.                 if (contentType != null)
  100.                     client.DefaultRequestHeaders.Add("ContentType", contentType);
  101.                 if (headers != null)
  102.                 {
  103.                     foreach (var header in headers)
  104.                         client.DefaultRequestHeaders.Add(header.Key, header.Value);
  105.                 }
  106.                 HttpResponseMessage response = await client.GetAsync(url);
  107.                 return await response.Content.ReadAsStringAsync();
  108.             }
  109.         }
  110.         /// <summary>
  111.         /// 发起POST同步请求
  112.         /// </summary>
  113.         /// <param name="url"></param>
  114.         /// <param name="postData"></param>
  115.         /// <param name="contentType">application/xml、application/json、application/text、application/x-www-form-urlencoded</param>
  116.         /// <param name="headers">填充消息头</param>
  117.         /// <returns></returns>
  118.         public static T HttpPost<T>(string url, string postData = null, string contentType = "application/json", int timeOut = 30, Dictionary<string, string> headers = null)
  119.         {
  120.             return HttpPost(url, postData, contentType, timeOut, headers).ToEntity<T>();
  121.         }
  122.         /// <summary>
  123.         /// 发起POST异步请求
  124.         /// </summary>
  125.         /// <param name="url"></param>
  126.         /// <param name="postData"></param>
  127.         /// <param name="contentType">application/xml、application/json、application/text、application/x-www-form-urlencoded</param>
  128.         /// <param name="headers">填充消息头</param>
  129.         /// <returns></returns>
  130.         public static async Task<T> HttpPostAsync<T>(string url, string postData = null, string contentType = "application/json", int timeOut = 30, Dictionary<string, string> headers = null)
  131.         {
  132.             var res = await HttpPostAsync(url, postData, contentType, timeOut, headers);
  133.             return res.ToEntity<T>();
  134.         }
  135.         /// <summary>
  136.         /// 发起GET同步请求
  137.         /// </summary>
  138.         /// <param name="url"></param>
  139.         /// <param name="headers"></param>
  140.         /// <param name="contentType"></param>
  141.         /// <returns></returns>
  142.         public static T HttpGet<T>(string url, string contentType = "application/json", Dictionary<string, string> headers = null)
  143.         {
  144.             return HttpGet(url, contentType, headers).ToEntity<T>();
  145.         }
  146.         /// <summary>
  147.         /// 发起GET异步请求
  148.         /// </summary>
  149.         /// <param name="url"></param>
  150.         /// <param name="headers"></param>
  151.         /// <param name="contentType"></param>
  152.         /// <returns></returns>
  153.         public static async Task<T> HttpGetAsync<T>(string url, string contentType = "application/json", Dictionary<string, string> headers = null)
  154.         {
  155.             var res = await HttpGetAsync(url, contentType, headers);
  156.             return res.ToEntity<T>();
  157.         }
  158.     }
  159.     public static class HttpExtension
  160.     {
  161.         /// <summary>
  162.         /// 发起GET同步请求
  163.         /// </summary>
  164.         /// <param name="client"></param>
  165.         /// <param name="url"></param>
  166.         /// <param name="headers"></param>
  167.         /// <param name="contentType"></param>
  168.         /// <returns></returns>
  169.         public static string HttpGet(this System.Net.Http.HttpClient client, string url, string contentType = "application/json",
  170.                                      Dictionary<string, string> headers = null)
  171.         {
  172.             if (contentType != null)
  173.                 client.DefaultRequestHeaders.Add("ContentType", contentType);
  174.             if (headers != null)
  175.             {
  176.                 foreach (var header in headers)
  177.                     client.DefaultRequestHeaders.Add(header.Key, header.Value);
  178.             }
  179.             HttpResponseMessage response = client.GetAsync(url).Result;
  180.             return response.Content.ReadAsStringAsync().Result;
  181.         }
  182.         /// <summary>
  183.         /// 发起GET异步请求
  184.         /// </summary>
  185.         /// <param name="client"></param>
  186.         /// <param name="url"></param>
  187.         /// <param name="headers"></param>
  188.         /// <param name="contentType"></param>
  189.         /// <returns></returns>
  190.         public static async Task<string> HttpGetAsync(this System.Net.Http.HttpClient client, string url, string contentType = "application/json", Dictionary<string, string> headers = null)
  191.         {
  192.             if (contentType != null)
  193.                 client.DefaultRequestHeaders.Add("ContentType", contentType);
  194.             if (headers != null)
  195.             {
  196.                 foreach (var header in headers)
  197.                     client.DefaultRequestHeaders.Add(header.Key, header.Value);
  198.             }
  199.             HttpResponseMessage response = await client.GetAsync(url);
  200.             return await response.Content.ReadAsStringAsync();
  201.         }
  202.         /// <summary>
  203.         /// 发起POST同步请求
  204.         /// </summary>
  205.         /// <param name="client"></param>
  206.         /// <param name="url"></param>
  207.         /// <param name="postData"></param>
  208.         /// <param name="contentType">application/xml、application/json、application/text、application/x-www-form-urlencoded</param>
  209.         /// <param name="timeOut"></param>
  210.         /// <param name="headers">填充消息头</param>
  211.         /// <returns></returns>
  212.         public static string HttpPost(this System.Net.Http.HttpClient client, string url, string postData = null,
  213.                                       string contentType = "application/json", int timeOut = 30, Dictionary<string, string> headers = null)
  214.         {
  215.             postData = postData ?? "";
  216.             if (headers != null)
  217.             {
  218.                 foreach (var header in headers)
  219.                     client.DefaultRequestHeaders.Add(header.Key, header.Value);
  220.             }
  221.             using (HttpContent httpContent = new StringContent(postData, Encoding.UTF8))
  222.             {
  223.                 if (contentType != null)
  224.                     httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(contentType);
  225.                 HttpResponseMessage response = client.PostAsync(url, httpContent).Result;
  226.                 return response.Content.ReadAsStringAsync().Result;
  227.             }
  228.         }
  229.         /// <summary>
  230.         /// 发起POST异步请求
  231.         /// </summary>
  232.         /// <param name="client"></param>
  233.         /// <param name="url"></param>
  234.         /// <param name="postData"></param>
  235.         /// <param name="contentType">application/xml、application/json、application/text、application/x-www-form-urlencoded</param>
  236.         /// <param name="headers">填充消息头</param>
  237.         /// <returns></returns>
  238.         public static async Task<string> HttpPostAsync(this System.Net.Http.HttpClient client, string url, string postData = null, string contentType = "application/json", int timeOut = 30, Dictionary<string, string> headers = null)
  239.         {
  240.             postData = postData ?? "";
  241.             client.Timeout = new TimeSpan(0, 0, timeOut);
  242.             if (headers != null)
  243.             {
  244.                 foreach (var header in headers)
  245.                     client.DefaultRequestHeaders.Add(header.Key, header.Value);
  246.             }
  247.             using (HttpContent httpContent = new StringContent(postData, Encoding.UTF8))
  248.             {
  249.                 if (contentType != null)
  250.                     httpContent.Headers.ContentType = new System.Net.Http.Headers.MediaTypeHeaderValue(contentType);
  251.                 HttpResponseMessage response = await client.PostAsync(url, httpContent);
  252.                 return await response.Content.ReadAsStringAsync();
  253.             }
  254.         }
  255.         /// <summary>
  256.         /// 发起POST同步请求
  257.         /// </summary>
  258.         /// <param name="url"></param>
  259.         /// <param name="postData"></param>
  260.         /// <param name="contentType">application/xml、application/json、application/text、application/x-www-form-urlencoded</param>
  261.         /// <param name="headers">填充消息头</param>
  262.         /// <returns></returns>
  263.         public static T HttpPost<T>(this System.Net.Http.HttpClient client, string url, string postData = null, string contentType = "application/json", int timeOut = 30, Dictionary<string, string> headers = null)
  264.         {
  265.             return client.HttpPost(url, postData, contentType, timeOut, headers).ToEntity<T>();
  266.         }
  267.         /// <summary>
  268.         /// 发起POST异步请求
  269.         /// </summary>
  270.         /// <param name="url"></param>
  271.         /// <param name="postData"></param>
  272.         /// <param name="contentType">application/xml、application/json、application/text、application/x-www-form-urlencoded</param>
  273.         /// <param name="headers">填充消息头</param>
  274.         /// <returns></returns>
  275.         public static async Task<T> HttpPostAsync<T>(this System.Net.Http.HttpClient client, string url, string postData = null, string contentType = "application/json", int timeOut = 30, Dictionary<string, string> headers = null)
  276.         {
  277.             var res = await client.HttpPostAsync(url, postData, contentType, timeOut, headers);
  278.             return res.ToEntity<T>();
  279.         }
  280.         /// <summary>
  281.         /// 发起GET同步请求
  282.         /// </summary>
  283.         /// <param name="url"></param>
  284.         /// <param name="headers"></param>
  285.         /// <param name="contentType"></param>
  286.         /// <returns></returns>
  287.         public static T HttpGet<T>(this System.Net.Http.HttpClient client, string url, string contentType = "application/json", Dictionary<string, string> headers = null)
  288.         {
  289.             return client.HttpGet(url, contentType, headers).ToEntity<T>();
  290.         }
  291.         /// <summary>
  292.         /// 发起GET异步请求
  293.         /// </summary>
  294.         /// <param name="url"></param>
  295.         /// <param name="headers"></param>
  296.         /// <param name="contentType"></param>
  297.         /// <returns></returns>
  298.         public static async Task<T> HttpGetAsync<T>(this System.Net.Http.HttpClient client, string url, string contentType = "application/json", Dictionary<string, string> headers = null)
  299.         {
  300.             var res = await client.HttpGetAsync(url, contentType, headers);
  301.             return res.ToEntity<T>();
  302.         }
  303.     }
  304.     public static class JsonExtends
  305.     {
  306.         public static T ToEntity<T>(this string val)
  307.         {
  308.             return JsonConvert.DeserializeObject<T>(val);
  309.         }
  310.         public static string ToJson<T>(this T entity, Formatting formatting = Formatting.None)
  311.         {
  312.             return JsonConvert.SerializeObject(entity, formatting);
  313.         }
  314.     }
  315. }
复制代码
返回数据压缩



  • 在Program.cs中添加下面代码
默认压缩
  1. builder.Services.AddResponseCompression();
  2. app.UseResponseCompression();
复制代码
Gzip压缩
  1. builder.Services.AddResponseCompression(config =>
  2. {
  3.     config.Providers.Add<GzipCompressionProvider>();
  4. });
  5. builder.Services.Configure<GzipCompressionProviderOptions>(config =>
  6. {
  7.     config.Level = CompressionLevel.SmallestSize;
  8. });
复制代码
缓存

接口缓存



  • 使用特性或者直接在返回头中添加Cache-Control效果一样
  1. [HttpGet]
  2. [ResponseCache(Duration = 600)]
  3. public IActionResult GetString() => new JsonResult(new { result = "Success" });
  4. [HttpGet]
  5. public IActionResult GetStringEx()
  6. {
  7.     HttpContext.Response.Headers.Add("Cache-Control", "public,max-age=600");
  8.     return new JsonResult(new { result = "Success" });
  9. }
复制代码
静态文件缓存
  1. app.UseStaticFiles(new StaticFileOptions()
  2. {
  3.     OnPrepareResponse = Prepare =>
  4.     {
  5.         Prepare.Context.Response.Headers.Add(HeaderNames.CacheControl, "public,max-age=600");
  6.     }
  7. });
复制代码

来源:https://www.cnblogs.com/qfccc/archive/2023/08/08/17615157.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

举报 回复 使用道具