- ASP.NET Core WebAPI学习-1
- ASP.NET Core WebAPI学习-2
- ASP.NET Core WebAPI学习-3
- ASP.NET Core WebAPI学习-4
- ASP.NET Core WebAPI学习-5
- 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
- 安装包:AutoMapper.Extensions.Microsoft.DependencyInjection 7.0.0
- 在Starup的ConfigureServices方法中中配置服务:
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
- 添加配置文件
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>();
}
}
}
- 在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));
}
- 使用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可以用来在资源的获取上