ASP.NET Core WebAPI学習-3
Content Negotiation AutoMapperの使用
コンテンツ交渉は、1つの応答に対して、複数の記述フォーマットが使用可能である場合に、最適な記述を選択するプロセスです.データ形式はjson、xml等の形式Media Type:-アプリケーション/json-アプリケーション/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の使用
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()
.ForMember(
destinationMember: dest => dest.CompanyName,
memberOptions: opt => opt.MapFrom(mapExpression: src => src.Name));
CreateMap();
}
}
}
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));
}
var companyDtos = mapper.Map>(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
ヘッダーはGetとほぼ同じですが、bodyを返さず、HEADはリソースの取得に使用できます.