ASP.NET Core WebAPI学习-3

  1. ASP.NET Core WebAPI学习-1
  2. ASP.NET Core WebAPI学习-2
  3. ASP.NET Core WebAPI学习-3
  4. ASP.NET Core WebAPI学习-4
  5. ASP.NET Core WebAPI学习-5
  6. ASP.NET Core WebAPI学习-6

内容协商(Content Negotiation) AutoMapper的使用

内容协商是这样一个过程:针对一个响应,当有多种表述格式可用的时候,选取最佳的一个表述。数据格式是json,xml等格式
Media Type(媒体类型):
- applicaion/json
- application/xml
输出格式在Startup.cs中定义,当请求的格式与输出的格式不匹配的时候,会返回406 Not Acceptable状态码
在ASP.NET Core中Startup的ConfigureServices方法中定义:

services.AddControllers(configure: setup =>
                        {
                            setup.ReturnHttpNotAcceptable = true;
                            //默认格式为json,也支持json
                            setup.OutputFormatters.Add(new XmlDataContractSerializerOutputFormatter());
                            //设置默认的返回格式为xml
                            //setup.OutputFormatters.Insert(index:0,new XmlDataContractSerializerOutputFormatter());
                        });

在WebAPI中使用ActionResult,可以在swashbuckle时,注释更明确,尽量使用ActionResult

使用AutoMapper

  1. 安装包:AutoMapper.Extensions.Microsoft.DependencyInjection 7.0.0
  2. 在Starup的ConfigureServices方法中中配置服务:
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
  1. 添加配置文件
using AutoMapper;
using Routine.Api.Dtos;
using Routine.Api.Entity;

namespace Routine.Api.Profiles
{
    public class CompanyProfile : Profile
    {
        public CompanyProfile()
        {
            CreateMap<Company, CompanyDto>()
                .ForMember(
                    destinationMember: dest => dest.CompanyName,
                    memberOptions: opt => opt.MapFrom(mapExpression: src => src.Name));

            CreateMap<CompanyAddDto, Company>();

        }
    }
}

  1. 在Controller中的构造函数中注入AutoMappe服务
private readonly ICompanyRepository companyRepository;
private readonly IMapper mapper;
public CompaniesController(ICompanyRepository companyRepository, IMapper mapper)
{
    this.companyRepository = companyRepository ??
        throw new ArgumentNullException(nameof(companyRepository));
    this.mapper = mapper ??
        throw new ArgumentNullException(nameof(mapper));
}
  1. 使用AutoMapper:
var companyDtos = mapper.Map<IEnumerable<CompanyDto>>(companies);

自定义错误信息

ASP.NET Core WebAPI内置的api,如果服务端出现运行错误,在Development环境下,会报出详细错误信息,在Production环境下,会返回500状态码,body内无任何信息,可以在Startup.cs的Configure方法中配置:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseExceptionHandler(appBuilder =>
                                {
                                    appBuilder.Run(handler: async context =>
                                                   {
                                                       context.Response.StatusCode = 500;
                                                       await context.Response.WriteAsync(text: "Unexpected Error!");
                                                   });
                                });
    }

    app.UseRouting();

    app.UseAuthorization();

    app.UseEndpoints(endpoints =>
                     {
                         endpoints.MapControllers();
                     });
}

Http Head

header和Get几乎一样,但是不返回body,HEAD可以用来在资源的获取上

原文地址:https://www.cnblogs.com/AlexanderZhao/p/12878831.html