Note
ãã®ãã¼ã¸ã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ è¦ã§ãã ãµã¤ã³ã¤ã³ã¾ãã¯ãã£ã¬ã¯ããªã®å¤æ´ã試ããã¨ãã§ãã¾ãã
ãã®ãã¼ã¸ã«ã¢ã¯ã»ã¹ããã«ã¯ãæ¿èªãå¿ è¦ã§ãã ãã£ã¬ã¯ããªã®å¤æ´ã試ããã¨ãã§ãã¾ãã
ASP.NET Core MVC ã§ã¯ãæå®ããå½¢å¼ã使ç¨ããããã¯ã©ã¤ã¢ã³ãã®è¦æ±ã«å¿ãã¦ãå¿çãã¼ã¿ãæ¸å¼è¨å®ãããã¨ããµãã¼ãããã¦ãã¾ãã
æ¸å¼åºæã¢ã¯ã·ã§ã³ã®çµæ
ã¢ã¯ã·ã§ã³ã®çµæã«ã¯ãJsonResult ã ContentResult ã®ããã«ãç¹å®ã®å½¢å¼ã«åºæã¨ãªãåãããã¾ãã ã¢ã¯ã·ã§ã³ã§ã¯ãæå®ãããå½¢å¼ã常ã«ä½¿ç¨ãã¦çµæãè¿ãããã«ããã¯ã©ã¤ã¢ã³ãããå¥ã®å½¢å¼ãè¦æ±ããã¦ãç¡è¦ãããã¨ãã§ãã¾ãã ãã¨ãã°ãJsonResult ãè¿ãã¨ãã«ã¯ JSON å½¢å¼ã®ãã¼ã¿ãè¿ãããContentResult ãè¿ãã¨ãã«ã¯ãã¬ã¼ã³ããã¹ãå½¢å¼ã®æååãã¼ã¿ãè¿ããã¾ãã
ã¢ã¯ã·ã§ã³ãç¹å®ã®åãè¿ãå¿ è¦ã¯ããã¾ããã ASP.NET Core ã«ãã£ã¦ããã¹ã¦ã®ãªãã¸ã§ã¯ãã®æ»ãå¤ããµãã¼ãããã¾ãã åã IActionResult ã§ã¯ãªããªãã¸ã§ã¯ããè¿ãã¢ã¯ã·ã§ã³ããã®çµæã¯ãé©å㪠IOutputFormatter å®è£ ãå©ç¨ãã¦ã·ãªã¢ã«åããã¾ãã 詳細ã«ã¤ãã¦ã¯ããASP.NET Core Web API ã®ã³ã³ããã¼ã©ã¼ ã¢ã¯ã·ã§ã³ã®æ»ãå¤ã®åããåç §ãã¦ãã ããã
æ¢å®ã§ã¯ãçµã¿è¾¼ã¿ãã«ãã¼ ã¡ã½ãã ControllerBase.Ok ã§ã¯ãJSON å½¢å¼ã®ãã¼ã¿ãè¿ããã¾ãã
[HttpGet]
public IActionResult Get() =>
Ok(_todoItemStore.GetList());
ãã®ãµã³ãã« ã³ã¼ãã§ã¯ãToDo é ç®ã®ä¸è¦§ãè¿ããã¾ãã F12 ãã©ã¦ã¶ã¼éçºè ãã¼ã«ã¾ã㯠http-repl ã§åã®ã³ã¼ãã使ãã¨ã次ã®ããã«è¡¨ç¤ºããã¾ãã
-
content-type:
application/json; charset=utf-8ãå«ãå¿çãããã¼ã - è¦æ±ãããã¼ã ãã¨ãã°ã
Acceptãããã¼ã§ããAcceptãããã¼ã¯åã®ã³ã¼ãã§ã¯ç¡è¦ããã¾ãã
ãã¬ã¼ã³ããã¹ãã§æ¸å¼è¨å®ããããã¼ã¿ãè¿ãã«ã¯ãContentResult 㨠Content ãã«ãã¼ã使ç¨ãã¾ãã
[HttpGet("Version")]
public ContentResult GetVersion() =>
Content("v1.0.0");
åã®ã³ã¼ãã§ãè¿ããã Content-Type 㯠text/plain ã§ãã
æ»ãå¤ã®åãè¤æ°ããã¢ã¯ã·ã§ã³ã®å ´åã¯ãIActionResult ãè¿ãã¾ãã ãã¨ãã°ãæä½ã®çµæã«åºã¥ãã¦ç°ãªã HTTP ç¶æ
ã³ã¼ããè¿ãã¨ãã§ãã
ã³ã³ãã³ã ãã´ã·ã¨ã¼ã·ã§ã³
ã¯ã©ã¤ã¢ã³ãã«ãã Accept ãããã¼ãæå®ãããã¨ãã³ã³ãã³ã ãã´ã·ã¨ã¼ã·ã§ã³ãçºçãã¾ãã ASP.NET Core ã§ä½¿ç¨ãããæ¢å®ã®å½¢å¼ã¯ JSON ã§ãã ã³ã³ãã³ã ãã´ã·ã¨ã¼ã·ã§ã³ã®èª¬æã以ä¸ã«ç¤ºãã¾ãã
- ObjectResult ã«ãã£ã¦å®è£ ããã¾ãã
- ãã«ãã¼ ã¡ã½ããããè¿ãããã¹ãã¼ã¿ã¹ ã³ã¼ãåºæã®ã¢ã¯ã·ã§ã³ã®çµæã«çµã¿è¾¼ã¾ãã¾ãã ã¢ã¯ã·ã§ã³ã®çµæã®ãã«ãã¼ ã¡ã½ããã¯
ObjectResultã«åºã¥ãã¦ãã¾ãã
ã¢ãã«ã®ç¨®é¡ãè¿ãããã¨ãæ»ãå¤ã®å㯠ObjectResult ã«ãªãã¾ãã
次ã®ã¢ã¯ã·ã§ã³ ã¡ã½ããã§ã¯ããã«ãã¼ ã¡ã½ããã® Ok 㨠NotFound ã使ç¨ããã¾ãã
[HttpGet("{id:long}")]
public IActionResult GetById(long id)
{
var todo = _todoItemStore.GetById(id);
if (todo is null)
{
return NotFound();
}
return Ok(todo);
}
æ¢å®ã§ã¯ãASP.NET Core ã§ã¯æ¬¡ã®ã¡ãã£ã¢ã®ç¨®é¡ããµãã¼ãããã¦ãã¾ãã
application/jsontext/jsontext/plain
Fiddler ã curl ã®ãããªãã¼ã«ã§ã¯ãAccept è¦æ±ãããã¼ãè¨å®ãã¦æ»ãå¤ã®å½¢å¼ãæå®ã§ãã¾ãã ãµã¼ãã¼ã§ãµãã¼ãããã¦ããåã Accept ãããã¼ã«å«ã¾ãã¦ããå ´åã¯ããã®åãè¿ããã¾ãã ãã©ã¼ããã¿ã®è¿½å æ¹æ³ã¯æ¬¡ã®ã»ã¯ã·ã§ã³ã§èª¬æãã¾ãã
ã³ã³ããã¼ã©ã¼ ã¢ã¯ã·ã§ã³ã¯ POCO (åç´ãªå¾æ¥ã® CLR ãªãã¸ã§ã¯ã) ãè¿ããã¨ãã§ãã¾ãã POCO ãè¿ãããã¨ãã©ã³ã¿ã¤ã ã¯ãã®ãªãã¸ã§ã¯ããã©ãããã ObjectResult ãèªåçã«ä½æãã¾ãã ã¯ã©ã¤ã¢ã³ãã¯ãæ¸å¼è¨å®ãããã·ãªã¢ã«åãªãã¸ã§ã¯ããåå¾ãã¾ãã è¿ããããªãã¸ã§ã¯ãã null ã®å ´åã¯ã204 No Content ã¨ããå¿çãè¿ããã¾ãã
次ã®ä¾ã§ã¯ãªãã¸ã§ã¯ãã®ç¨®é¡ãè¿ããã¾ãã
[HttpGet("{id:long}")]
public TodoItem? GetById(long id) =>
_todoItemStore.GetById(id);
åã®ã³ã¼ãã§ã¯ãæå¹ãª ToDo é
ç®ãè¦æ±ããã¨ã200 OK ã¨ããå¿çãè¿ããã¾ãã ç¡å¹ãª ToDo é
ç®ãè¦æ±ããã¨ã204 No Content ã¨ããå¿çãè¿ããã¾ãã
Accept ãããã¼
ã³ã³ãã³ã "ãã´ã·ã¨ã¼ã·ã§ã³" ã¯ãAccept ãããã¼ãè¦æ±ã«å«ã¾ããã¨ãã«çºçãã¾ãã è¦æ±ã« Accept ãããã¼ãå«ã¾ããã¨ããASP.NET Core ã¯æ¬¡ã®ããã«å¦çãã¾ãã
- Accept ãããã¼ã®ã¡ãã£ã¢ã®ç¨®é¡ãåªå é ã§åæãã¾ãã
- æå®ãããå½¢å¼ã®ããããã§å¿çãçæã§ãããã©ã¼ããã¿ãè¦ã¤ãããã¨ãã¾ãã
ã¯ã©ã¤ã¢ã³ãã®è¦æ±ãæºãããã¨ãã§ãããã©ã¼ããã¿ãè¦ã¤ãããªãå ´åã¯ãASP.NET Core ã¯æ¬¡ã®ããã«ãã¾ãã
-
406 Not Acceptableã MvcOptions.ReturnHttpNotAcceptable ã«è¨å®ããã¦ããå ´åã¯ãtrueãè¿ãã¾ãã - å¿çãçæã§ããæåã®ãã©ã¼ããã¿ãè¦ã¤ãããã¨ãã¾ãã
è¦æ±ãããå½¢å¼ã«å¯¾å¿ãããã©ã¼ããã¿ãæ§æããã¦ããªãå ´åããªãã¸ã§ã¯ããæ¸å¼è¨å®ã§ããæåã®ãã©ã¼ããã¿ã使ç¨ããã¾ãã è¦æ±ã« Accept ãããã¼ã表示ãããªãå ´åã¯ã次ã®ããã«ãªãã¾ãã
- ãªãã¸ã§ã¯ããå¦çã§ããæåã®ãã©ã¼ããã¿ã使ç¨ããã¦ãå¿çãã·ãªã¢ã«åãã¾ãã
- ãã´ã·ã¨ã¼ã·ã§ã³ã¯çºçãã¾ããã ãµã¼ãã¼ãè¿ãå½¢å¼ã決å®ãã¾ãã
Accept ãããã¼ã« */* ãå«ã¾ããå ´åãRespectBrowserAcceptHeader ã MvcOptions ã§ true ã«è¨å®ããã¦ããªãéãããããã¼ãç¡è¦ããã¾ãã
ãã©ã¦ã¶ã¼ã¨ã³ã³ãã³ã ãã´ã·ã¨ã¼ã·ã§ã³
ä¸è¬ç㪠API ã¯ã©ã¤ã¢ã³ãã¨ã¯ç°ãªããWeb ãã©ã¦ã¶ã¼ã¯ Accept ãããã¼ãæä¾ãã¾ãã Web ãã©ã¦ã¶ã¼ã§ã¯ãã¯ã¤ã«ãã«ã¼ããå«ããå¤ãã®å½¢å¼ãæå®ããã¾ãã æ¢å®ã§ã¯ãè¦æ±ããã©ã¦ã¶ã¼ããéä¿¡ããã¦ãããã¨ããã¬ã¼ã ã¯ã¼ã¯ãæ¤åºããã¨ã次ã®ããã«ãªãã¾ãã
-
Acceptãããã¼ã¯ç¡è¦ããã¾ãã - ç¹ã«æ§æããã¦ããªãéããã³ã³ãã³ã㯠JSON ã§è¿ããã¾ãã
ãã®ã¢ããã¼ãã«ãããAPI ã使ç¨ããã¨ãã«ãã©ã¦ã¶ã¼éã§ããã«ä¸è²«æ§ã®é«ãã¨ã¯ã¹ããªã¨ã³ã¹ãæä¾ããã¾ãã
ãã©ã¦ã¶ã¼ã® Accept ãããã¼ãé å®ããããã«ã¢ããªãæ§æããã«ã¯ãRespectBrowserAcceptHeader ããããã£ã true ã«è¨å®ãã¾ãã
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(options =>
{
options.RespectBrowserAcceptHeader = true;
});
ãã©ã¼ããã¿ã®æ§æ
追å ã®å½¢å¼ããµãã¼ãããå¿ è¦ãããã¢ããªã§ã¯ãé©å㪠NuGet ããã±ã¼ã¸ã追å ãããµãã¼ããæ§æã§ãã¾ãã å ¥åã¨åºåã§å¥ã ã®ãã©ã¼ããã¿ãããã¾ãã å ¥åãã©ã¼ããã¿ã¯ãã¢ãã« ãã¤ã³ãã«ãã£ã¦ä½¿ç¨ããã¾ãã åºåãã©ã¼ããã¿ã¯ãå¿çã®æ¸å¼è¨å®ã«ä½¿ç¨ããã¾ãã ã«ã¹ã¿ã ãã©ã¼ããã¿ã®ä½æã®è©³ç´°ã«ã¤ãã¦ã¯ãã«ã¹ã¿ã ãã©ã¼ããã¿ã«é¢ãããã¼ã¸ãåç §ãã¦ãã ããã
XML å½¢å¼ã®ãµãã¼ãã追å ãã
XmlSerializer ã使ç¨ãã¦å®è£ ããã XML ãã©ã¼ããã¿ãæ§æããã«ã¯ãAddXmlSerializerFormatters ãå¼ã³åºãã¾ãã
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddXmlSerializerFormatters();
åã®ã³ã¼ãã使ç¨ããå ´åãã³ã³ããã¼ã©ã¼ ã¡ã½ããã¯è¦æ±ã® Accept ãããã¼ã«åºã¥ãã¦é©åãªå½¢å¼ãè¿ãã¾ãã
System.Text.Json ãã¼ã¹ã®ãã©ã¼ããã¿ãæ§æãã
System.Text.Json ãã¼ã¹ã®ãã©ã¼ããã¿ã®æ©è½ãæ§æããã«ã¯ãMicrosoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptions ã使ç¨ãã¾ãã æ¬¡ã®å¼·èª¿è¡¨ç¤ºãããã³ã¼ãã§ã¯ãæ¢å®ã®ãã£ã¡ã«ã±ã¼ã¹æ¸å¼è¨å®ã®ä»£ããã«ããã¹ã«ã«ã±ã¼ã¹æ¸å¼è¨å®ãæ§æãã¾ãã
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = null;
});
次ã®ã¢ã¯ã·ã§ã³ ã¡ã½ããã§ã¯ãControllerBase.Problem ãå¼ã³åºã㦠ProblemDetails å¿çã使ããã¦ãã¾ãã
[HttpGet("Error")]
public IActionResult GetError() =>
Problem("Something went wrong.");
ProblemDetails å¿çã¯ãã¢ããªã§æ¸å¼ããã¹ã«ã«ã±ã¼ã¹ã«è¨å®ããã¦ããå ´åã§ãã常ã«ãã£ã¡ã«ã±ã¼ã¹ã«ãªãã¾ãã
ProblemDetails ãå¾ã RFC 7807 ã§ã¯ãå°æåãæå®ããã¦ãã¾ãã
ç¹å®ã®ã¢ã¯ã·ã§ã³ã®åºåã·ãªã¢ã«åãªãã·ã§ã³ãæ§æããã«ã¯ãJsonResult ã使ç¨ãã¾ãã ä¾ãã°æ¬¡ãæãããã¾ãã
[HttpGet]
public IActionResult Get() =>
new JsonResult(
_todoItemStore.GetList(),
new JsonSerializerOptions
{
PropertyNamingPolicy = null
});
Newtonsoft.Json ãã¼ã¹ã® JSON å½¢å¼ã®ãµãã¼ãã追å ãã
æ¢å®ã® JSON ãã©ã¼ããã¿ã§ã¯ãSystem.Text.Json ã使ç¨ããã¾ãã
Newtonsoft.Json ãã¼ã¹ã®ãã©ã¼ããã¿ã使ç¨ããã«ã¯ãMicrosoft.AspNetCore.Mvc.NewtonsoftJson NuGet ããã±ã¼ã¸ãã¤ã³ã¹ãã¼ã«ããProgram.cs å
ã§ãããæ§æãã¾ãã
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddNewtonsoftJson();
åã®ã³ã¼ãã§ã¯ãAddNewtonsoftJson ãå¼ã³åºããã¨ã§ã次㮠Web APIãMVCãRazor Pages ã®åæ©è½ããNewtonsoft.Json ã使ç¨ããããã«æ§æããã¾ãã
- JSON ã®èªã¿åãã¨æ¸ãè¾¼ã¿ãè¡ãå ¥åãã©ã¼ããã¿ã¨åºåãã©ã¼ããã¿
- JsonResult
- JSON ããã
- IJsonHelper
- TempData
ä¸é¨ã®æ©è½ã¯ System.Text.Json ãã¼ã¹ã®ãã©ã¼ããã¿ã§ãã¾ãåä½ãããNewtonsoft.Json ãã¼ã¹ã®ãã©ã¼ããã¿ã®åç
§ãå¿
è¦ã¨ãªãå ´åãããã¾ãã ã¢ããªã以ä¸ã®å ´åã«ã¯ãNewtonsoft.Json ãã¼ã¹ã®ãã©ã¼ããã¿ã®ä½¿ç¨ãç¶ãã¾ãã
-
Newtonsoft.Json屿§ã使ç¨ããã ãã¨ãã°ã[JsonProperty]ã¾ãã¯[JsonIgnore]ã§ãã - ã·ãªã¢ã«åã®è¨å®ãã«ã¹ã¿ãã¤ãºããã
-
Newtonsoft.Jsonã§æä¾ãããæ©è½ã«ä¾åããã
Newtonsoft.Json ãã¼ã¹ã®ãã©ã¼ããã¿ã®æ©è½ãæ§æããã«ã¯ãSerializerSettings ã使ç¨ãã¾ãã
builder.Services.AddControllers()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
});
ç¹å®ã®ã¢ã¯ã·ã§ã³ã®åºåã·ãªã¢ã«åãªãã·ã§ã³ãæ§æããã«ã¯ãJsonResult ã使ç¨ãã¾ãã ä¾ãã°æ¬¡ãæãããã¾ãã
[HttpGet]
public IActionResult GetNewtonsoftJson() =>
new JsonResult(
_todoItemStore.GetList(),
new JsonSerializerSettings
{
ContractResolver = new DefaultContractResolver()
});
å½¢å¼ãæå®ãã
å¿çã®å½¢å¼ãå¶éããã«ã¯ã[Produces] ãã£ã«ã¿ã¼ãé©ç¨ãã¾ãã ã»ã¨ãã©ã®ãã£ã«ã¿ã¼ã¨åæ§ã«ã[Produces] ãã¢ã¯ã·ã§ã³ãã³ã³ããã¼ã©ã¼ãã°ãã¼ãã« ã¹ã³ã¼ãã«é©ç¨ã§ãã¾ãã
[ApiController]
[Route("api/[controller]")]
[Produces("application/json")]
public class TodoItemsController : ControllerBase
åã® [Produces] ãã£ã«ã¿ã¼ã§ã¯ä»¥ä¸ã®å¦çãè¡ããã¾ãã
- ã³ã³ããã¼ã©ã¼å ã®ãã¹ã¦ã®ã¢ã¯ã·ã§ã³ã§ãPOCO (åç´ãªå¾æ¥ã® CLR ãªãã¸ã§ã¯ã) ã¾ã㯠ObjectResult ã¨ãã®æ´¾çåã«å¯¾ã㦠JSON å½¢å¼ã®å¿çãå¼·å¶çã«è¿ãã¾ãã
- ä»ã®ãã©ã¼ããã¿ãæ§æããã¦ãã¦ãã¯ã©ã¤ã¢ã³ããå¥ã®å½¢å¼ãæå®ãã¦ããå ´åã§ããJSON å½¢å¼ã®å¿çãè¿ãã¾ãã
詳細ã«ã¤ãã¦ã¯ããã£ã«ã¿ã¼ã«é¢ãããã¼ã¸ãåç §ãã¦ãã ããã
ç¹æ®ãªã±ã¼ã¹ã®ãã©ã¼ããã¿
ä¸é¨ã®ç¹æ®ãªã±ã¼ã¹ãçµã¿è¾¼ã¿ã®ãã©ã¼ããã¿ã§å®è£
ããã¾ãã æ¢å®ã§ã¯ãæ»ãå¤ã®å string 㯠text/plain ã¨ãã¦æ¸å¼è¨å®ããã¾ã ( ãããã¼çµç±ã§è¦æ±ãããå ´å㯠Accept)ã ãã®åä½ã¯ StringOutputFormatter ãåé¤ãããã¨ã§åé¤ã§ãã¾ãã ãã©ã¼ããã¿ã¯ Program.cs ã§åé¤ããã¾ãã æ»ãå¤ã®åã¨ãã¦ã¢ãã« ãªãã¸ã§ã¯ããã¨ããªãã¢ã¯ã·ã§ã³ã¯ã204 No Content ãè¿ãã¨ããnull ãè¿ãã¾ãã ãã®åä½ã¯ HttpNoContentOutputFormatter ãåé¤ãããã¨ã§åé¤ã§ãã¾ãã æ¬¡ã®ã³ã¼ãã§ã¯ãStringOutputFormatter 㨠HttpNoContentOutputFormatter ãåé¤ããã¾ãã
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(options =>
{
// using Microsoft.AspNetCore.Mvc.Formatters;
options.OutputFormatters.RemoveType<StringOutputFormatter>();
options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
});
StringOutputFormatter ããªãå ´åã¯ãçµã¿è¾¼ã¿ã® JSON ãã©ã¼ããã¿ã«ãã£ã¦æ»ãå¤ã®å string ãæ¸å¼è¨å®ããã¾ãã çµã¿è¾¼ã¿ã® JSON ãã©ã¼ããã¿ãåé¤ãããXML ãã©ã¼ããã¿ã使ç¨ã§ããå ´åã¯ãXML ãã©ã¼ããã¿ã«ãã£ã¦æ»ãå¤ã®å string ãæ¸å¼è¨å®ããã¾ãã ãã以å¤ã®å ´åã¯ãæ»ãå¤ã®å string ã§ 406 Not Acceptable ãè¿ããã¾ãã
HttpNoContentOutputFormatter ããªãå ´åãæ§æããã¦ãããã©ã¼ããã¿ãå©ç¨ããnull ãªãã¸ã§ã¯ããæ¸å¼è¨å®ããã¾ãã ä¾ãã°æ¬¡ãæãããã¾ãã
- JSON ãã©ã¼ããã¿ã¯ãæ¬æã
nullã®å¿çãè¿ãã¾ãã - XML ãã©ã¼ããã¿ã¯ã屿§
xsi:nil="true"ãè¨å®ããã空㮠XML è¦ç´ ãè¿ãã¾ãã
å¿çå½¢å¼ã® URL ãããã³ã°
ã¯ã©ã¤ã¢ã³ãã¯ãURL ã®ä¸é¨ã¨ãã¦ç¹å®ã®å½¢å¼ãè¦æ±ã§ãã¾ããæ¬¡ã«ä¾ã示ãã¾ãã
- ã¯ã¨ãªæååã¾ãã¯ãã¹ã®ä¸é¨ã
- .xml ã¾ã㯠.json ãªã©å½¢å¼åºæã®ãã¡ã¤ã«æ¡å¼µåã®ä½¿ç¨ã
è¦æ±ãã¹ããã®ãããã³ã°ã¯ãAPI ã§ä½¿ç¨ãããã«ã¼ãã«æå®ããå¿ è¦ãããã¾ãã ä¾ãã°æ¬¡ãæãããã¾ãã
[ApiController]
[Route("api/[controller]")]
[FormatFilter]
public class TodoItemsController : ControllerBase
{
private readonly TodoItemStore _todoItemStore;
public TodoItemsController(TodoItemStore todoItemStore) =>
_todoItemStore = todoItemStore;
[HttpGet("{id:long}.{format?}")]
public TodoItem? GetById(long id) =>
_todoItemStore.GetById(id);
åã®ã«ã¼ãã使ç¨ããã¨ãè¦æ±ãããå½¢å¼ããªãã·ã§ã³ã®ãã¡ã¤ã«æ¡å¼µåã使ç¨ãã¦æå®ã§ãã¾ãã
[FormatFilter] 屿§ã¯ RouteData ã«å½¢å¼å¤ããªãã確èªããå¿çã使ãããã¨ãå¿çå½¢å¼ãé©åãªãã©ã¼ããã¿ã«ãããã³ã°ãã¾ãã
| Route | Formatter |
|---|---|
/api/todoitems/5 |
æ¢å®ã®åºåãã©ã¼ããã¿ |
/api/todoitems/5.json |
JSON ãã©ã¼ããã¿ (æ§æãããå ´å) |
/api/todoitems/5.xml |
XML ãã©ã¼ããã¿ (æ§æãããå ´å) |
ããªã¢ã¼ãã£ãã¯éã·ãªã¢ã«å
çµã¿è¾¼ã¿æ©è½ã§ã¯ãããªã¢ã¼ãã£ãã¯ãªã·ãªã¢ã«åã¯éãããç¯å²ã§æä¾ããã¦ãã¾ãããéã·ãªã¢ã«åã¯ã¾ã£ãããµãã¼ãããã¦ãã¾ããã éã·ãªã¢ã«åãè¡ãã«ã¯ãã«ã¹ã¿ã ã³ã³ãã¼ã¿ã¼ãå¿ è¦ã§ãã ããªã¢ã¼ãã£ãã¯ãªéã·ãªã¢ã«åã®å®å ¨ãªãµã³ãã«ã«ã¤ãã¦ã¯ããããªã¢ã¼ãã£ãã¯ãªéã·ãªã¢ã«åããåç §ãã¦ãã ããã
ãã®ä»ã®ãªã½ã¼ã¹
ASP.NET Core MVC ã§ã¯ãå¿çãã¼ã¿ã®æ¸å¼è¨å®ããµãã¼ãããã¾ãã å¿çãã¼ã¿ã¯ãç¹å®ã®å½¢å¼ã使ç¨ãã¦ãã¾ãã¯ã¯ã©ã¤ã¢ã³ããè¦æ±ããå½¢å¼ã«å¿ãã¦æ¸å¼è¨å®ã§ãã¾ãã
ãµã³ãã« ã³ã¼ãã表示ã¾ãã¯ãã¦ã³ãã¼ããã¾ã (ãã¦ã³ãã¼ãæ¹æ³)ã
æ¸å¼åºæã¢ã¯ã·ã§ã³ã®çµæ
ã¢ã¯ã·ã§ã³ã®çµæã«ã¯ãJsonResult ã ContentResult ã®ããã«ãç¹å®ã®å½¢å¼ã«åºæã¨ãªãåãããã¾ãã ã¢ã¯ã·ã§ã³ã§ã¯ãã¯ã©ã¤ã¢ã³ãã®è¨å®ã«é¢ä¿ãªããç¹å®ã®å½¢å¼ã§æ¸å¼è¨å®ãããçµæãè¿ããã¨ãã§ãã¾ãã ãã¨ãã°ãJsonResult ãè¿ãã¨ãJSON å½¢å¼ã®ãã¼ã¿ãè¿ããã¾ãã
ContentResult ã¾ãã¯æååãè¿ãã¨ããã¬ã¼ã³ããã¹ãå½¢å¼ã®æååãã¼ã¿ãè¿ããã¾ãã
ã¢ã¯ã·ã§ã³ãç¹å®ã®åãè¿ãå¿ è¦ã¯ããã¾ããã ASP.NET Core ã«ãã£ã¦ããã¹ã¦ã®ãªãã¸ã§ã¯ãã®æ»ãå¤ããµãã¼ãããã¾ãã åã IActionResult ã§ã¯ãªããªãã¸ã§ã¯ããè¿ãã¢ã¯ã·ã§ã³ããã®çµæã¯ãé©å㪠IOutputFormatter å®è£ ãå©ç¨ãã¦ã·ãªã¢ã«åããã¾ãã 詳細ã«ã¤ãã¦ã¯ããASP.NET Core Web API ã®ã³ã³ããã¼ã©ã¼ ã¢ã¯ã·ã§ã³ã®æ»ãå¤ã®åããåç §ãã¦ãã ããã
çµã¿è¾¼ã¿ãã«ãã¼ ã¡ã½ãã Ok ã§ã¯ãJSON å½¢å¼ã®ãã¼ã¿ãè¿ããã¾ãã
// GET: api/authors
[HttpGet]
public ActionResult Get()
{
return Ok(_authors.List());
}
ãµã³ãã« ãã¦ã³ãã¼ãã§ã¯ä½æè ã®ä¸è¦§ãè¿ããã¾ãã F12 ãã©ã¦ã¶ã¼éçºè ãã¼ã«ã¾ã㯠http-repl ã§åã®ã³ã¼ãã使ãã¨ã次ã®ããã«ãªãã¾ãã
-
content-type:
application/json; charset=utf-8ãå«ãå¿çãããã¼ã表示ããã¾ãã - è¦æ±ãããã¼ã表示ããã¾ãã ãã¨ãã°ã
Acceptãããã¼ã§ããAcceptãããã¼ã¯åã®ã³ã¼ãã§ã¯ç¡è¦ããã¾ãã
ãã¬ã¼ã³ããã¹ãã§æ¸å¼è¨å®ããããã¼ã¿ãè¿ãã«ã¯ãContentResult 㨠Content ãã«ãã¼ã使ç¨ãã¾ãã
// GET api/authors/about
[HttpGet("About")]
public ContentResult About()
{
return Content("An API listing authors of docs.asp.net.");
}
åã®ã³ã¼ãã§ãè¿ããã Content-Type 㯠text/plain ã§ãã æååãè¿ãã¨ãContent-Type ã® text/plain ãéããã¾ãã
// GET api/authors/version
[HttpGet("version")]
public string Version()
{
return "Version 1.0.0";
}
æ»ãå¤ã®åãè¤æ°ããã¢ã¯ã·ã§ã³ã®å ´åã¯ãIActionResult ãè¿ãã¾ãã ãã¨ãã°ãå®è¡ãããæä½ã®çµæã«åºã¥ãã¦ããã¾ãã¾ãª HTTP ç¶æ
ã³ã¼ããè¿ãã¾ãã
ã³ã³ãã³ã ãã´ã·ã¨ã¼ã·ã§ã³
ã¯ã©ã¤ã¢ã³ãã«ãã Accept ãããã¼ãæå®ãããã¨ãã³ã³ãã³ã ãã´ã·ã¨ã¼ã·ã§ã³ãçºçãã¾ãã ASP.NET Core ã§ä½¿ç¨ãããæ¢å®ã®å½¢å¼ã¯ JSON ã§ãã ã³ã³ãã³ã ãã´ã·ã¨ã¼ã·ã§ã³ã®èª¬æã以ä¸ã«ç¤ºãã¾ãã
- ObjectResult ã«ãã£ã¦å®è£ ããã¾ãã
- ãã«ãã¼ ã¡ã½ããããè¿ãããã¹ãã¼ã¿ã¹ ã³ã¼ãåºæã®ã¢ã¯ã·ã§ã³ã®çµæã«çµã¿è¾¼ã¾ãã¾ãã ã¢ã¯ã·ã§ã³ã®çµæã®ãã«ãã¼ ã¡ã½ããã¯
ObjectResultã«åºã¥ãã¦ãã¾ãã
ã¢ãã«ã®ç¨®é¡ãè¿ãããã¨ãæ»ãå¤ã®å㯠ObjectResult ã«ãªãã¾ãã
次ã®ã¢ã¯ã·ã§ã³ ã¡ã½ããã§ã¯ããã«ãã¼ ã¡ã½ããã® Ok 㨠NotFound ã使ç¨ããã¾ãã
// GET: api/authors/search?namelike=th
[HttpGet("Search")]
public IActionResult Search(string namelike)
{
var result = _authors.GetByNameSubstring(namelike);
if (!result.Any())
{
return NotFound(namelike);
}
return Ok(result);
}
ASP.NET Core ã§ã¯ãè¦å®ã§ application/jsonãtext/jsonãtext/plain ã®ã¡ãã£ã¢ã®ç¨®é¡ããµãã¼ãããã¦ãã¾ãã
Fiddler ã http-repl ã®ãããªãã¼ã«ã使ãã¨ãAccept è¦æ±ãããã¼ãè¨å®ãã¦æ»ãå¤ã®å½¢å¼ãæå®ã§ãã¾ãã ãµã¼ãã¼ã§ãµãã¼ãããã¦ããåã Accept ãããã¼ã«å«ã¾ãã¦ããå ´åã¯ããã®åãè¿ããã¾ãã ãã©ã¼ããã¿ã®è¿½å æ¹æ³ã¯æ¬¡ã®ã»ã¯ã·ã§ã³ã§èª¬æãã¾ãã
ã³ã³ããã¼ã©ã¼ ã¢ã¯ã·ã§ã³ã¯ POCO (åç´ãªå¾æ¥ã® CLR ãªãã¸ã§ã¯ã) ãè¿ããã¨ãã§ãã¾ãã POCO ãè¿ãããã¨ãã©ã³ã¿ã¤ã ã¯ãã®ãªãã¸ã§ã¯ããã©ãããã ObjectResult ãèªåçã«ä½æãã¾ãã ã¯ã©ã¤ã¢ã³ãã¯ãæ¸å¼è¨å®ãããã·ãªã¢ã«åãªãã¸ã§ã¯ããåå¾ãã¾ãã è¿ããããªãã¸ã§ã¯ãã null ã®å ´åã¯ã204 No Content ã¨ããå¿çãè¿ããã¾ãã
ãªãã¸ã§ã¯ãã®åãè¿ã:
// GET api/authors/RickAndMSFT
[HttpGet("{alias}")]
public Author Get(string alias)
{
return _authors.GetByAlias(alias);
}
åã®ã³ã¼ãã§ã¯ãæå¹ãªä½æè
ã¨ã¤ãªã¢ã¹ã®è¦æ±ã«å¯¾ãã¦ã200 OK ã¨ããå¿çã¨ä½æè
ã®ãã¼ã¿ãè¿ããã¾ãã ç¡å¹ãªã¨ã¤ãªã¢ã¹ã®è¦æ±ã«å¯¾ãã¦ã¯ã204 No Content ã¨ããå¿çãè¿ããã¾ãã
Accept ãããã¼
ã³ã³ãã³ã "ãã´ã·ã¨ã¼ã·ã§ã³" ã¯ãAccept ãããã¼ãè¦æ±ã«å«ã¾ããã¨ãã«çºçãã¾ãã è¦æ±ã« Accept ãããã¼ãå«ã¾ããã¨ããASP.NET Core ã¯æ¬¡ã®ããã«å¦çãã¾ãã
- Accept ãããã¼ã®ã¡ãã£ã¢ã®ç¨®é¡ãåªå é ã§åæãã¾ãã
- æå®ãããå½¢å¼ã®ããããã§å¿çãçæã§ãããã©ã¼ããã¿ãè¦ã¤ãããã¨ãã¾ãã
ã¯ã©ã¤ã¢ã³ãã®è¦æ±ãæºãããã¨ãã§ãããã©ã¼ããã¿ãè¦ã¤ãããªãå ´åã¯ãASP.NET Core ã¯æ¬¡ã®ããã«ãã¾ãã
-
406 Not Acceptableã MvcOptions.ReturnHttpNotAcceptable ã«è¨å®ããã¦ããå ´åã¯ãtrueãè¿ãã¾ãã - å¿çãçæã§ããæåã®ãã©ã¼ããã¿ãè¦ã¤ãããã¨ãã¾ãã
è¦æ±ãããå½¢å¼ã«å¯¾å¿ãããã©ã¼ããã¿ãæ§æããã¦ããªãå ´åããªãã¸ã§ã¯ããæ¸å¼è¨å®ã§ããæåã®ãã©ã¼ããã¿ã使ç¨ããã¾ãã è¦æ±ã« Accept ãããã¼ã表示ãããªãå ´åã¯ã次ã®ããã«ãªãã¾ãã
- ãªãã¸ã§ã¯ããå¦çã§ããæåã®ãã©ã¼ããã¿ã使ç¨ããã¦ãå¿çãã·ãªã¢ã«åãã¾ãã
- ãã´ã·ã¨ã¼ã·ã§ã³ã¯çºçãã¾ããã ãµã¼ãã¼ãè¿ãå½¢å¼ã決å®ãã¾ãã
Accept ãããã¼ã« */* ãå«ã¾ããå ´åãRespectBrowserAcceptHeader ã MvcOptions ã§ true ã«è¨å®ããã¦ããªãéãããããã¼ãç¡è¦ããã¾ãã
ãã©ã¦ã¶ã¼ã¨ã³ã³ãã³ã ãã´ã·ã¨ã¼ã·ã§ã³
ä¸è¬ç㪠API ã¯ã©ã¤ã¢ã³ãã¨ã¯ç°ãªããWeb ãã©ã¦ã¶ã¼ã¯ Accept ãããã¼ãæä¾ãã¾ãã Web ãã©ã¦ã¶ã¼ã§ã¯ãã¯ã¤ã«ãã«ã¼ããå«ããå¤ãã®å½¢å¼ãæå®ããã¾ãã æ¢å®ã§ã¯ãè¦æ±ããã©ã¦ã¶ã¼ããéä¿¡ããã¦ãããã¨ããã¬ã¼ã ã¯ã¼ã¯ãæ¤åºããã¨ã次ã®ããã«ãªãã¾ãã
-
Acceptãããã¼ã¯ç¡è¦ããã¾ãã - ç¹ã«æ§æããã¦ããªãéããã³ã³ãã³ã㯠JSON ã§è¿ããã¾ãã
ãã®ã¢ããã¼ãã«ãããAPI ã使ç¨ããã¨ãã«ãã©ã¦ã¶ã¼éã§ããã«ä¸è²«æ§ã®é«ãã¨ã¯ã¹ããªã¨ã³ã¹ãæä¾ããã¾ãã
ãã©ã¦ã¶ã¼ã® Accept ãããã¼ãåªå
ããããã«ã¢ããªãæ§æããã«ã¯ãRespectBrowserAcceptHeader ã true ã«è¨å®ãã¾ãã
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
options.RespectBrowserAcceptHeader = true; // false by default
});
}
ãã©ã¼ããã¿ã®æ§æ
追å ã®å½¢å¼ããµãã¼ãããå¿ è¦ãããã¢ããªã¯ãé©å㪠NuGet ããã±ã¼ã¸ã追å ãããµãã¼ããæ§æã§ãã¾ãã å ¥åã¨åºåã§å¥ã ã®ãã©ã¼ããã¿ãããã¾ãã å ¥åãã©ã¼ããã¿ã¯ãã¢ãã« ãã¤ã³ãã«ãã£ã¦ä½¿ç¨ããã¾ãã åºåãã©ã¼ããã¿ã¯ãå¿çã®æ¸å¼è¨å®ã«ä½¿ç¨ããã¾ãã ã«ã¹ã¿ã ãã©ã¼ããã¿ã®ä½æã®è©³ç´°ã«ã¤ãã¦ã¯ãã«ã¹ã¿ã ãã©ã¼ããã¿ã«é¢ãããã¼ã¸ãåç §ãã¦ãã ããã
XML å½¢å¼ã®ãµãã¼ãã追å ãã
XmlSerializer ã使ç¨ãã¦å®è£ ããã XML ãã©ã¼ããã¿ã¯ãAddXmlSerializerFormatters ãå¼ã³åºããã¨ã§æ§æã§ãã¾ãã
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddXmlSerializerFormatters();
}
åã®ã³ã¼ãã¯ãXmlSerializer ã使ç¨ãã¦çµæãã·ãªã¢ã«åãã¾ãã
åã®ã³ã¼ãã使ç¨ããå ´åãã³ã³ããã¼ã©ã¼ ã¡ã½ããã¯è¦æ±ã® Accept ãããã¼ã«åºã¥ãã¦é©åãªå½¢å¼ãè¿ãã¾ãã
System.Text.Json ãã¼ã¹ã®ãã©ã¼ããã¿ãæ§æãã
System.Text.Json ãã¼ã¹ã®ãã©ã¼ããã¿ã®æ©è½ã¯ãMicrosoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptions ã使ç¨ãã¦æ§æãããã¨ãã§ãã¾ãã æ¢å®ã®æ¸å¼è¨å®ã¯ãã£ã¡ã«ã±ã¼ã¹ã§ãã æ¬¡ã®å¼·èª¿ãããã³ã¼ãã¯ããã¹ã«ã«ã±ã¼ã¹ã§æ¸å¼ãè¨å®ããã¦ãã¾ãã
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddJsonOptions(options =>
options.JsonSerializerOptions.PropertyNamingPolicy = null);
}
次ã®ã¢ã¯ã·ã§ã³ ã¡ã½ããã§ã¯ãControllerBase.Problem ãå¼ã³åºã㦠ProblemDetails å¿çã使ããã¦ãã¾ãã
[HttpGet("error")]
public IActionResult GetError()
{
return Problem("Something went wrong!");
}
ä¸ã®ã³ã¼ãã§ã¯:
-
https://localhost:5001/WeatherForecast/temperatureããã¯ãã¹ã«ã«ã±ã¼ã¹ãè¿ããã¾ãã -
https://localhost:5001/WeatherForecast/errorããã¯ãã£ã¡ã«ã±ã¼ã¹ãè¿ããã¾ãã ã¨ã©ã¼å¿çã¯ãã¢ããªã§æ¸å¼ããã¹ã«ã«ã±ã¼ã¹ã«è¨å®ããã¦ããå ´åã§ãã常ã«ãã£ã¡ã«ã±ã¼ã¹ã«ãªãã¾ããProblemDetailsãå¾ã RFC 7807 ã§ã¯ãå°æåãæå®ããã¦ãã¾ã
次ã®ã³ã¼ãã§ã¯ããã¹ã«ã«ã±ã¼ã¹ãè¨å®ããã¦ãã«ã¹ã¿ã ã³ã³ãã¼ã¿ã¼ã追å ããã¾ãã
services.AddControllers().AddJsonOptions(options =>
{
// Use the default property (Pascal) casing.
options.JsonSerializerOptions.PropertyNamingPolicy = null;
// Configure a custom converter.
options.JsonSerializerOptions.Converters.Add(new MyCustomJsonConverter());
});
åºåã®ã·ãªã¢ã«åãªãã·ã§ã³ã¯ãã¢ã¯ã·ã§ã³ãã¨ã« JsonResult ã使ç¨ãã¦æ§æãããã¨ãã§ãã¾ãã ä¾ãã°æ¬¡ãæãããã¾ãã
public IActionResult Get()
{
return Json(model, new JsonSerializerOptions
{
WriteIndented = true,
});
}
Newtonsoft.Json ãã¼ã¹ã® JSON å½¢å¼ã®ãµãã¼ãã追å ãã
æ¢å®ã® JSON ãã©ã¼ããã¿ã¯ System.Text.Json ã«åºã¥ãã¦ãã¾ãã
Newtonsoft.Json ãã¼ã¹ã®ãã©ã¼ããã¿ã¨æ©è½ã®ãµãã¼ãã¯ãMicrosoft.AspNetCore.Mvc.NewtonsoftJson NuGet ããã±ã¼ã¸ãã¤ã³ã¹ãã¼ã«ããStartup.ConfigureServices ã§ãããæ§æãããã¨ã«ããå©ç¨ã§ãã¾ãã
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers()
.AddNewtonsoftJson();
}
åã®ã³ã¼ãã§ã¯ãAddNewtonsoftJson ãå¼ã³åºããã¨ã§ã次㮠Web APIãMVCãRazor Pages ã®åæ©è½ããNewtonsoft.Json ã使ç¨ããããã«æ§æããã¾ãã
- JSON ã®èªã¿åãã¨æ¸ãè¾¼ã¿ãè¡ãå ¥åãã©ã¼ããã¿ã¨åºåãã©ã¼ããã¿
- JsonResult
- JSON ããã
- IJsonHelper
- TempData
ä¸é¨ã®æ©è½ã¯ System.Text.Json ãã¼ã¹ã®ãã©ã¼ããã¿ã§ãã¾ãåä½ãããNewtonsoft.Json ãã¼ã¹ã®ãã©ã¼ããã¿ã®åç
§ãå¿
è¦ã¨ãªãå ´åãããã¾ãã ã¢ããªã以ä¸ã®å ´åã«ã¯ãNewtonsoft.Json ãã¼ã¹ã®ãã©ã¼ããã¿ã®ä½¿ç¨ãç¶ãã¾ãã
-
Newtonsoft.Json屿§ã使ç¨ããã ãã¨ãã°ã[JsonProperty]ã¾ãã¯[JsonIgnore]ã§ãã - ã·ãªã¢ã«åã®è¨å®ãã«ã¹ã¿ãã¤ãºããã
-
Newtonsoft.Jsonã§æä¾ãããæ©è½ã«ä¾åããã
Newtonsoft.Json ãã¼ã¹ã®ãã©ã¼ããã¿ã®æ©è½ã¯ãMicrosoft.AspNetCore.Mvc.MvcNewtonsoftJsonOptions.SerializerSettings ã使ç¨ãã¦æ§æãããã¨ãã§ãã¾ãã
services.AddControllers().AddNewtonsoftJson(options =>
{
// Use the default property (Pascal) casing
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
// Configure a custom converter
options.SerializerSettings.Converters.Add(new MyCustomJsonConverter());
});
åºåã®ã·ãªã¢ã«åãªãã·ã§ã³ã¯ãã¢ã¯ã·ã§ã³ãã¨ã« JsonResult ã使ç¨ãã¦æ§æãããã¨ãã§ãã¾ãã ä¾ãã°æ¬¡ãæãããã¾ãã
public IActionResult Get()
{
return Json(model, new JsonSerializerSettings
{
Formatting = Formatting.Indented,
});
}
å½¢å¼ãæå®ãã
å¿çã®å½¢å¼ãå¶éããã«ã¯ã[Produces] ãã£ã«ã¿ã¼ãé©ç¨ãã¾ãã ã»ã¨ãã©ã®ãã£ã«ã¿ã¼ã¨åæ§ã«ã[Produces] ãã¢ã¯ã·ã§ã³ãã³ã³ããã¼ã©ã¼ãã°ãã¼ãã« ã¹ã³ã¼ãã«é©ç¨ã§ãã¾ãã
[ApiController]
[Route("[controller]")]
[Produces("application/json")]
public class WeatherForecastController : ControllerBase
{
åã® [Produces] ãã£ã«ã¿ã¼ã§ã¯ä»¥ä¸ã®å¦çãè¡ããã¾ãã
- ã³ã³ããã¼ã©ã¼å ã®ãã¹ã¦ã®ã¢ã¯ã·ã§ã³ã§ãPOCO (åç´ãªå¾æ¥ã® CLR ãªãã¸ã§ã¯ã) ã¾ã㯠ObjectResult ã¨ãã®æ´¾çåã«å¯¾ã㦠JSON å½¢å¼ã®å¿çãå¼·å¶çã«è¿ãã¾ãã
- ä»ã®ãã©ã¼ããã¿ãæ§æããã¦ãã¦ãã¯ã©ã¤ã¢ã³ããå¥ã®å½¢å¼ãæå®ããå ´åã§ããJSON ãè¿ããã¾ãã
詳細ã«ã¤ãã¦ã¯ããã£ã«ã¿ã¼ã«é¢ãããã¼ã¸ãåç §ãã¦ãã ããã
ç¹æ®ãªã±ã¼ã¹ã®ãã©ã¼ããã¿
ä¸é¨ã®ç¹æ®ãªã±ã¼ã¹ãçµã¿è¾¼ã¿ã®ãã©ã¼ããã¿ã§å®è£
ããã¾ãã æ¢å®ã§ã¯ãæ»ãå¤ã®å string 㯠text/plain ã¨ãã¦æ¸å¼è¨å®ããã¾ã ( ãããã¼çµç±ã§è¦æ±ãããå ´å㯠Accept)ã ãã®åä½ã¯ StringOutputFormatter ãåé¤ãããã¨ã§åé¤ã§ãã¾ãã ãã©ã¼ããã¿ã¯ ConfigureServices ã¡ã½ããã§åé¤ãã¾ãã æ»ãå¤ã®åã¨ãã¦ã¢ãã« ãªãã¸ã§ã¯ããã¨ããªãã¢ã¯ã·ã§ã³ã¯ã204 No Content ãè¿ãã¨ããnull ãè¿ãã¾ãã ãã®åä½ã¯ HttpNoContentOutputFormatter ãåé¤ãããã¨ã§åé¤ã§ãã¾ãã æ¬¡ã®ã³ã¼ãã§ã¯ãStringOutputFormatter 㨠HttpNoContentOutputFormatter ãåé¤ããã¾ãã
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers(options =>
{
// requires using Microsoft.AspNetCore.Mvc.Formatters;
options.OutputFormatters.RemoveType<StringOutputFormatter>();
options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
});
}
StringOutputFormatter ããªãå ´åã¯ãçµã¿è¾¼ã¿ã® JSON ãã©ã¼ããã¿ã«ãã£ã¦æ»ãå¤ã®å string ãæ¸å¼è¨å®ããã¾ãã çµã¿è¾¼ã¿ã® JSON ãã©ã¼ããã¿ãåé¤ãããXML ãã©ã¼ããã¿ã使ç¨ã§ããå ´åã¯ãXML ãã©ã¼ããã¿ã«ãã£ã¦æ»ãå¤ã®å string ãæ¸å¼è¨å®ããã¾ãã ãã以å¤ã®å ´åã¯ãæ»ãå¤ã®å string ã§ 406 Not Acceptable ãè¿ããã¾ãã
HttpNoContentOutputFormatter ããªãå ´åãæ§æããã¦ãããã©ã¼ããã¿ãå©ç¨ããnull ãªãã¸ã§ã¯ããæ¸å¼è¨å®ããã¾ãã ä¾ãã°æ¬¡ãæãããã¾ãã
- JSON ãã©ã¼ããã¿ã¯ãæ¬æã
nullã®å¿çãè¿ãã¾ãã - XML ãã©ã¼ããã¿ã¯ã屿§
xsi:nil="true"ãè¨å®ããã空㮠XML è¦ç´ ãè¿ãã¾ãã
å¿çå½¢å¼ã® URL ãããã³ã°
ã¯ã©ã¤ã¢ã³ãã¯ãURL ã®ä¸é¨ã¨ãã¦ç¹å®ã®å½¢å¼ãè¦æ±ã§ãã¾ããæ¬¡ã«ä¾ã示ãã¾ãã
- ã¯ã¨ãªæååã¾ãã¯ãã¹ã®ä¸é¨ã
- .xml ã¾ã㯠.json ãªã©å½¢å¼åºæã®ãã¡ã¤ã«æ¡å¼µåã®ä½¿ç¨ã
è¦æ±ãã¹ããã®ãããã³ã°ã¯ãAPI ã§ä½¿ç¨ãããã«ã¼ãã«æå®ããå¿ è¦ãããã¾ãã ä¾ãã°æ¬¡ãæãããã¾ãã
[Route("api/[controller]")]
[ApiController]
[FormatFilter]
public class ProductsController : ControllerBase
{
[HttpGet("{id}.{format?}")]
public Product Get(int id)
{
åã®ã«ã¼ãã使ç¨ããã¨ãè¦æ±ãããå½¢å¼ããªãã·ã§ã³ã®ãã¡ã¤ã«æ¡å¼µåã¨ãã¦æå®ã§ãã¾ãã
[FormatFilter] 屿§ã¯ RouteData ã«å½¢å¼å¤ããªãã確èªããå¿çã使ãããã¨ãå¿çå½¢å¼ãé©åãªãã©ã¼ããã¿ã«ãããã³ã°ãã¾ãã
| Route | Formatter |
|---|---|
/api/products/5 |
æ¢å®ã®åºåãã©ã¼ããã¿ |
/api/products/5.json |
JSON ãã©ã¼ããã¿ (æ§æãããå ´å) |
/api/products/5.xml |
XML ãã©ã¼ããã¿ (æ§æãããå ´å) |
ASP.NET Core MVC ã§ã¯ãæå®ããå½¢å¼ã使ç¨ããããã¯ã©ã¤ã¢ã³ãã®è¦æ±ã«å¿ãã¦ãå¿çãã¼ã¿ãæ¸å¼è¨å®ãããã¨ããµãã¼ãããã¦ãã¾ãã
æ¸å¼åºæã¢ã¯ã·ã§ã³ã®çµæ
ã¢ã¯ã·ã§ã³ã®çµæã«ã¯ãJsonResult ã ContentResult ã®ããã«ãç¹å®ã®å½¢å¼ã«åºæã¨ãªãåãããã¾ãã ã¢ã¯ã·ã§ã³ã§ã¯ãæå®ãããå½¢å¼ã常ã«ä½¿ç¨ãã¦çµæãè¿ãããã«ããã¯ã©ã¤ã¢ã³ãããå¥ã®å½¢å¼ãè¦æ±ããã¦ãç¡è¦ãããã¨ãã§ãã¾ãã ãã¨ãã°ãJsonResult ãè¿ãã¨ãã«ã¯ JSON å½¢å¼ã®ãã¼ã¿ãè¿ãããContentResult ãè¿ãã¨ãã«ã¯ãã¬ã¼ã³ããã¹ãå½¢å¼ã®æååãã¼ã¿ãè¿ããã¾ãã
ã¢ã¯ã·ã§ã³ãç¹å®ã®åãè¿ãå¿ è¦ã¯ããã¾ããã ASP.NET Core ã«ãã£ã¦ããã¹ã¦ã®ãªãã¸ã§ã¯ãã®æ»ãå¤ããµãã¼ãããã¾ãã åã IActionResult ã§ã¯ãªããªãã¸ã§ã¯ããè¿ãã¢ã¯ã·ã§ã³ããã®çµæã¯ãé©å㪠IOutputFormatter å®è£ ãå©ç¨ãã¦ã·ãªã¢ã«åããã¾ãã 詳細ã«ã¤ãã¦ã¯ããASP.NET Core Web API ã®ã³ã³ããã¼ã©ã¼ ã¢ã¯ã·ã§ã³ã®æ»ãå¤ã®åããåç §ãã¦ãã ããã
æ¢å®ã§ã¯ãçµã¿è¾¼ã¿ãã«ãã¼ ã¡ã½ãã ControllerBase.Ok ã§ã¯ãJSON å½¢å¼ã®ãã¼ã¿ãè¿ããã¾ãã
[HttpGet]
public IActionResult Get()
=> Ok(_todoItemStore.GetList());
ãã®ãµã³ãã« ã³ã¼ãã§ã¯ãToDo é ç®ã®ä¸è¦§ãè¿ããã¾ãã F12 ãã©ã¦ã¶ã¼éçºè ãã¼ã«ã¾ã㯠http-repl ã§åã®ã³ã¼ãã使ãã¨ã次ã®ããã«è¡¨ç¤ºããã¾ãã
-
content-type:
application/json; charset=utf-8ãå«ãå¿çãããã¼ã - è¦æ±ãããã¼ã ãã¨ãã°ã
Acceptãããã¼ã§ããAcceptãããã¼ã¯åã®ã³ã¼ãã§ã¯ç¡è¦ããã¾ãã
ãã¬ã¼ã³ããã¹ãã§æ¸å¼è¨å®ããããã¼ã¿ãè¿ãã«ã¯ãContentResult 㨠Content ãã«ãã¼ã使ç¨ãã¾ãã
[HttpGet("Version")]
public ContentResult GetVersion()
=> Content("v1.0.0");
åã®ã³ã¼ãã§ãè¿ããã Content-Type 㯠text/plain ã§ãã
æ»ãå¤ã®åãè¤æ°ããã¢ã¯ã·ã§ã³ã®å ´åã¯ãIActionResult ãè¿ãã¾ãã ãã¨ãã°ãæä½ã®çµæã«åºã¥ãã¦ç°ãªã HTTP ç¶æ
ã³ã¼ããè¿ãã¨ãã§ãã
ã³ã³ãã³ã ãã´ã·ã¨ã¼ã·ã§ã³
ã¯ã©ã¤ã¢ã³ãã«ãã Accept ãããã¼ãæå®ãããã¨ãã³ã³ãã³ã ãã´ã·ã¨ã¼ã·ã§ã³ãçºçãã¾ãã ASP.NET Core ã§ä½¿ç¨ãããæ¢å®ã®å½¢å¼ã¯ JSON ã§ãã ã³ã³ãã³ã ãã´ã·ã¨ã¼ã·ã§ã³ã®èª¬æã以ä¸ã«ç¤ºãã¾ãã
- ObjectResult ã«ãã£ã¦å®è£ ããã¾ãã
- ãã«ãã¼ ã¡ã½ããããè¿ãããã¹ãã¼ã¿ã¹ ã³ã¼ãåºæã®ã¢ã¯ã·ã§ã³ã®çµæã«çµã¿è¾¼ã¾ãã¾ãã ã¢ã¯ã·ã§ã³ã®çµæã®ãã«ãã¼ ã¡ã½ããã¯
ObjectResultã«åºã¥ãã¦ãã¾ãã
ã¢ãã«ã®ç¨®é¡ãè¿ãããã¨ãæ»ãå¤ã®å㯠ObjectResult ã«ãªãã¾ãã
次ã®ã¢ã¯ã·ã§ã³ ã¡ã½ããã§ã¯ããã«ãã¼ ã¡ã½ããã® Ok 㨠NotFound ã使ç¨ããã¾ãã
[HttpGet("{id:long}")]
public IActionResult GetById(long id)
{
var todo = _todoItemStore.GetById(id);
if (todo is null)
{
return NotFound();
}
return Ok(todo);
}
æ¢å®ã§ã¯ãASP.NET Core ã§ã¯æ¬¡ã®ã¡ãã£ã¢ã®ç¨®é¡ããµãã¼ãããã¦ãã¾ãã
application/jsontext/jsontext/plain
Fiddler ã http-repl ã®ãããªãã¼ã«ã使ãã¨ãAccept è¦æ±ãããã¼ãè¨å®ãã¦æ»ãå¤ã®å½¢å¼ãæå®ã§ãã¾ãã ãµã¼ãã¼ã§ãµãã¼ãããã¦ããåã Accept ãããã¼ã«å«ã¾ãã¦ããå ´åã¯ããã®åãè¿ããã¾ãã ãã©ã¼ããã¿ã®è¿½å æ¹æ³ã¯æ¬¡ã®ã»ã¯ã·ã§ã³ã§èª¬æãã¾ãã
ã³ã³ããã¼ã©ã¼ ã¢ã¯ã·ã§ã³ã¯ POCO (åç´ãªå¾æ¥ã® CLR ãªãã¸ã§ã¯ã) ãè¿ããã¨ãã§ãã¾ãã POCO ãè¿ãããã¨ãã©ã³ã¿ã¤ã ã¯ãã®ãªãã¸ã§ã¯ããã©ãããã ObjectResult ãèªåçã«ä½æãã¾ãã ã¯ã©ã¤ã¢ã³ãã¯ãæ¸å¼è¨å®ãããã·ãªã¢ã«åãªãã¸ã§ã¯ããåå¾ãã¾ãã è¿ããããªãã¸ã§ã¯ãã null ã®å ´åã¯ã204 No Content ã¨ããå¿çãè¿ããã¾ãã
次ã®ä¾ã§ã¯ãªãã¸ã§ã¯ãã®ç¨®é¡ãè¿ããã¾ãã
[HttpGet("{id:long}")]
public TodoItem? GetById(long id)
=> _todoItemStore.GetById(id);
åã®ã³ã¼ãã§ã¯ãæå¹ãª ToDo é
ç®ãè¦æ±ããã¨ã200 OK ã¨ããå¿çãè¿ããã¾ãã ç¡å¹ãª ToDo é
ç®ãè¦æ±ããã¨ã204 No Content ã¨ããå¿çãè¿ããã¾ãã
Accept ãããã¼
ã³ã³ãã³ã "ãã´ã·ã¨ã¼ã·ã§ã³" ã¯ãAccept ãããã¼ãè¦æ±ã«å«ã¾ããã¨ãã«çºçãã¾ãã è¦æ±ã« Accept ãããã¼ãå«ã¾ããã¨ããASP.NET Core ã¯æ¬¡ã®ããã«å¦çãã¾ãã
- Accept ãããã¼ã®ã¡ãã£ã¢ã®ç¨®é¡ãåªå é ã§åæãã¾ãã
- æå®ãããå½¢å¼ã®ããããã§å¿çãçæã§ãããã©ã¼ããã¿ãè¦ã¤ãããã¨ãã¾ãã
ã¯ã©ã¤ã¢ã³ãã®è¦æ±ãæºãããã¨ãã§ãããã©ã¼ããã¿ãè¦ã¤ãããªãå ´åã¯ãASP.NET Core ã¯æ¬¡ã®ããã«ãã¾ãã
-
406 Not Acceptableã MvcOptions.ReturnHttpNotAcceptable ã«è¨å®ããã¦ããå ´åã¯ãtrueãè¿ãã¾ãã - å¿çãçæã§ããæåã®ãã©ã¼ããã¿ãè¦ã¤ãããã¨ãã¾ãã
è¦æ±ãããå½¢å¼ã«å¯¾å¿ãããã©ã¼ããã¿ãæ§æããã¦ããªãå ´åããªãã¸ã§ã¯ããæ¸å¼è¨å®ã§ããæåã®ãã©ã¼ããã¿ã使ç¨ããã¾ãã è¦æ±ã« Accept ãããã¼ã表示ãããªãå ´åã¯ã次ã®ããã«ãªãã¾ãã
- ãªãã¸ã§ã¯ããå¦çã§ããæåã®ãã©ã¼ããã¿ã使ç¨ããã¦ãå¿çãã·ãªã¢ã«åãã¾ãã
- ãã´ã·ã¨ã¼ã·ã§ã³ã¯çºçãã¾ããã ãµã¼ãã¼ãè¿ãå½¢å¼ã決å®ãã¾ãã
Accept ãããã¼ã« */* ãå«ã¾ããå ´åãRespectBrowserAcceptHeader ã MvcOptions ã§ true ã«è¨å®ããã¦ããªãéãããããã¼ãç¡è¦ããã¾ãã
ãã©ã¦ã¶ã¼ã¨ã³ã³ãã³ã ãã´ã·ã¨ã¼ã·ã§ã³
ä¸è¬ç㪠API ã¯ã©ã¤ã¢ã³ãã¨ã¯ç°ãªããWeb ãã©ã¦ã¶ã¼ã¯ Accept ãããã¼ãæä¾ãã¾ãã Web ãã©ã¦ã¶ã¼ã§ã¯ãã¯ã¤ã«ãã«ã¼ããå«ããå¤ãã®å½¢å¼ãæå®ããã¾ãã æ¢å®ã§ã¯ãè¦æ±ããã©ã¦ã¶ã¼ããéä¿¡ããã¦ãããã¨ããã¬ã¼ã ã¯ã¼ã¯ãæ¤åºããã¨ã次ã®ããã«ãªãã¾ãã
-
Acceptãããã¼ã¯ç¡è¦ããã¾ãã - ç¹ã«æ§æããã¦ããªãéããã³ã³ãã³ã㯠JSON ã§è¿ããã¾ãã
ãã®ã¢ããã¼ãã«ãããAPI ã使ç¨ããã¨ãã«ãã©ã¦ã¶ã¼éã§ããã«ä¸è²«æ§ã®é«ãã¨ã¯ã¹ããªã¨ã³ã¹ãæä¾ããã¾ãã
ãã©ã¦ã¶ã¼ã® Accept ãããã¼ãé å®ããããã«ã¢ããªãæ§æããã«ã¯ãRespectBrowserAcceptHeader ããããã£ã true ã«è¨å®ãã¾ãã
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(options =>
{
options.RespectBrowserAcceptHeader = true;
});
ãã©ã¼ããã¿ã®æ§æ
追å ã®å½¢å¼ããµãã¼ãããå¿ è¦ãããã¢ããªã§ã¯ãé©å㪠NuGet ããã±ã¼ã¸ã追å ãããµãã¼ããæ§æã§ãã¾ãã å ¥åã¨åºåã§å¥ã ã®ãã©ã¼ããã¿ãããã¾ãã å ¥åãã©ã¼ããã¿ã¯ãã¢ãã« ãã¤ã³ãã«ãã£ã¦ä½¿ç¨ããã¾ãã åºåãã©ã¼ããã¿ã¯ãå¿çã®æ¸å¼è¨å®ã«ä½¿ç¨ããã¾ãã ã«ã¹ã¿ã ãã©ã¼ããã¿ã®ä½æã®è©³ç´°ã«ã¤ãã¦ã¯ãã«ã¹ã¿ã ãã©ã¼ããã¿ã«é¢ãããã¼ã¸ãåç §ãã¦ãã ããã
XML å½¢å¼ã®ãµãã¼ãã追å ãã
XmlSerializer ã使ç¨ãã¦å®è£ ããã XML ãã©ã¼ããã¿ãæ§æããã«ã¯ãAddXmlSerializerFormatters ãå¼ã³åºãã¾ãã
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddXmlSerializerFormatters();
åã®ã³ã¼ãã使ç¨ããå ´åãã³ã³ããã¼ã©ã¼ ã¡ã½ããã¯è¦æ±ã® Accept ãããã¼ã«åºã¥ãã¦é©åãªå½¢å¼ãè¿ãã¾ãã
System.Text.Json ãã¼ã¹ã®ãã©ã¼ããã¿ãæ§æãã
System.Text.Json ãã¼ã¹ã®ãã©ã¼ããã¿ã®æ©è½ãæ§æããã«ã¯ãMicrosoft.AspNetCore.Mvc.JsonOptions.JsonSerializerOptions ã使ç¨ãã¾ãã æ¬¡ã®å¼·èª¿è¡¨ç¤ºãããã³ã¼ãã§ã¯ãæ¢å®ã®ãã£ã¡ã«ã±ã¼ã¹æ¸å¼è¨å®ã®ä»£ããã«ããã¹ã«ã«ã±ã¼ã¹æ¸å¼è¨å®ãæ§æãã¾ãã
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddJsonOptions(options =>
{
options.JsonSerializerOptions.PropertyNamingPolicy = null;
});
ç¹å®ã®ã¢ã¯ã·ã§ã³ã®åºåã·ãªã¢ã«åãªãã·ã§ã³ãæ§æããã«ã¯ãJsonResult ã使ç¨ãã¾ãã ä¾ãã°æ¬¡ãæãããã¾ãã
[HttpGet]
public IActionResult Get()
=> new JsonResult(
_todoItemStore.GetList(),
new JsonSerializerOptions { PropertyNamingPolicy = null });
Newtonsoft.Json ãã¼ã¹ã® JSON å½¢å¼ã®ãµãã¼ãã追å ãã
æ¢å®ã® JSON ãã©ã¼ããã¿ã§ã¯ãSystem.Text.Json ã使ç¨ããã¾ãã
Newtonsoft.Json ãã¼ã¹ã®ãã©ã¼ããã¿ã使ç¨ããã«ã¯ãMicrosoft.AspNetCore.Mvc.NewtonsoftJson NuGet ããã±ã¼ã¸ãã¤ã³ã¹ãã¼ã«ããProgram.cs å
ã§ãããæ§æãã¾ãã
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers()
.AddNewtonsoftJson();
åã®ã³ã¼ãã§ã¯ãAddNewtonsoftJson ãå¼ã³åºããã¨ã§ã次㮠Web APIãMVCãRazor Pages ã®åæ©è½ããNewtonsoft.Json ã使ç¨ããããã«æ§æããã¾ãã
- JSON ã®èªã¿åãã¨æ¸ãè¾¼ã¿ãè¡ãå ¥åãã©ã¼ããã¿ã¨åºåãã©ã¼ããã¿
- JsonResult
- JSON ããã
- IJsonHelper
- TempData
ä¸é¨ã®æ©è½ã¯ System.Text.Json ãã¼ã¹ã®ãã©ã¼ããã¿ã§ãã¾ãåä½ãããNewtonsoft.Json ãã¼ã¹ã®ãã©ã¼ããã¿ã®åç
§ãå¿
è¦ã¨ãªãå ´åãããã¾ãã ã¢ããªã以ä¸ã®å ´åã«ã¯ãNewtonsoft.Json ãã¼ã¹ã®ãã©ã¼ããã¿ã®ä½¿ç¨ãç¶ãã¾ãã
-
Newtonsoft.Json屿§ã使ç¨ããã ãã¨ãã°ã[JsonProperty]ã¾ãã¯[JsonIgnore]ã§ãã - ã·ãªã¢ã«åã®è¨å®ãã«ã¹ã¿ãã¤ãºããã
-
Newtonsoft.Jsonã§æä¾ãããæ©è½ã«ä¾åããã
Newtonsoft.Json ãã¼ã¹ã®ãã©ã¼ããã¿ã®æ©è½ãæ§æããã«ã¯ãSerializerSettings ã使ç¨ãã¾ãã
builder.Services.AddControllers()
.AddNewtonsoftJson(options =>
{
options.SerializerSettings.ContractResolver = new DefaultContractResolver();
});
ç¹å®ã®ã¢ã¯ã·ã§ã³ã®åºåã·ãªã¢ã«åãªãã·ã§ã³ãæ§æããã«ã¯ãJsonResult ã使ç¨ãã¾ãã ä¾ãã°æ¬¡ãæãããã¾ãã
[HttpGet]
public IActionResult GetNewtonsoftJson()
=> new JsonResult(
_todoItemStore.GetList(),
new JsonSerializerSettings { ContractResolver = new DefaultContractResolver() });
ProblemDetails ããã³ ValidationProblemDetails å¿çã®æ¸å¼è¨å®
次ã®ã¢ã¯ã·ã§ã³ ã¡ã½ããã§ã¯ãControllerBase.Problem ãå¼ã³åºã㦠ProblemDetails å¿çã使ããã¦ãã¾ãã
[HttpGet("Error")]
public IActionResult GetError()
=> Problem("Something went wrong.");
ProblemDetails å¿çã¯ãã¢ããªã§æ¸å¼ããã¹ã«ã«ã±ã¼ã¹ã«è¨å®ããã¦ããå ´åã§ãã常ã«ãã£ã¡ã«ã±ã¼ã¹ã«ãªãã¾ãã
ProblemDetails ãå¾ã RFC 7807 ã§ã¯ãå°æåãæå®ããã¦ãã¾ãã
[ApiController] 屿§ãã³ã³ããã¼ã©ã¼ ã¯ã©ã¹ã«é©ç¨ãããã¨ãValidationProblemDetailsã失æããã¨ãã«ã³ã³ããã¼ã©ã¼ã«ãã£ã¦ å¿çã使ããã¾ãã ãã®å¿çã«ã¯ãã¢ãã«ã®ããããã£åãã¨ã©ã¼ ãã¼ã¨ãã¦å¤æ´ããã«ä½¿ç¨ãããã£ã¯ã·ã§ããªãå«ã¾ãã¾ãã ãã¨ãã°ã次ã®ã¢ãã«ã«ã¯ãæ¤è¨¼ãå¿
è¦ã¨ãã 1 ã¤ã®ããããã£ãå«ã¾ãã¦ãã¾ãã
public class SampleModel
{
[Range(1, 10)]
public int Value { get; set; }
}
æ¢å®ã§ã¯ãValidationProblemDetails ããããã£ãç¡å¹ãªå ´åã«è¿ããã Value å¿çã§ã¯ã次ã®ä¾ã«ç¤ºãããã«ãValue ã¨ããã¨ã©ã¼ ãã¼ã使ç¨ããã¾ãã
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "00-00000000000000000000000000000000-000000000000000-00",
"errors": {
"Value": [
"The field Value must be between 1 and 10."
]
}
}
ã¨ã©ã¼ ãã¼ã¨ãã¦ä½¿ç¨ãããããããã£åãæ¸å¼è¨å®ããã«ã¯ãIMetadataDetailsProvider ã®å®è£
ã MvcOptions.ModelMetadataDetailsProviders ã³ã¬ã¯ã·ã§ã³ã«è¿½å ãã¾ãã æ¬¡ã®ä¾ã§ã¯ãSystem.Text.Json ãã¼ã¹ã®å®è£
SystemTextJsonValidationMetadataProvider ã追å ãã¾ããããã«ãããæ¢å®ã§ããããã£åããã£ã¡ã«ã±ã¼ã¹ã¨ãã¦æ¸å¼è¨å®ããã¾ãã
builder.Services.AddControllers();
builder.Services.Configure<MvcOptions>(options =>
{
options.ModelMetadataDetailsProviders.Add(
new SystemTextJsonValidationMetadataProvider());
});
SystemTextJsonValidationMetadataProvider ã¯ãã³ã³ã¹ãã©ã¯ã¿ã¼ã§ JsonNamingPolicy ã®å®è£
ãåãä»ãã¾ããããã«ãããããããã£åãæ¸å¼è¨å®ããããã®ã«ã¹ã¿ã ååä»ãããªã·ã¼ãæå®ãã¾ãã
ã¢ãã«å ã®ããããã£ã«ã«ã¹ã¿ã åãè¨å®ããã«ã¯ãããããã£ã® [JsonPropertyName] 屿§ã使ç¨ãã¾ãã
public class SampleModel
{
[Range(1, 10)]
[JsonPropertyName("sampleValue")]
public int Value { get; set; }
}
åã®ã¢ãã«ã§ ValidationProblemDetails ããããã£ãç¡å¹ãªå ´åã«è¿ããã Value å¿çã§ã¯ã次ã®ä¾ã«ç¤ºãããã«ãsampleValue ã¨ããã¨ã©ã¼ ãã¼ã使ç¨ããã¾ãã
{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "00-00000000000000000000000000000000-000000000000000-00",
"errors": {
"sampleValue": [
"The field Value must be between 1 and 10."
]
}
}
ValidationProblemDetails ã使ç¨ã㦠Newtonsoft.Json å¿çãæ¸å¼è¨å®ããã«ã¯ãNewtonsoftJsonValidationMetadataProvider ã使ç¨ãã¾ãã
builder.Services.AddControllers()
.AddNewtonsoftJson();
builder.Services.Configure<MvcOptions>(options =>
{
options.ModelMetadataDetailsProviders.Add(
new NewtonsoftJsonValidationMetadataProvider());
});
æ¢å®ã§ã¯ãNewtonsoftJsonValidationMetadataProvider ã«ããããããã£åã¯ãã£ã¡ã«ã±ã¼ã¹ã¨ãã¦æ¸å¼è¨å®ããã¾ãã
NewtonsoftJsonValidationMetadataProvider ã¯ãã³ã³ã¹ãã©ã¯ã¿ã¼ã§ NamingPolicy ã®å®è£
ãåãä»ãã¾ããããã«ãããããããã£åãæ¸å¼è¨å®ããããã®ã«ã¹ã¿ã ååä»ãããªã·ã¼ãæå®ãã¾ãã ã¢ãã«å
ã®ããããã£ã«ã«ã¹ã¿ã åãè¨å®ããã«ã¯ã[JsonProperty] 屿§ã使ç¨ãã¾ãã
å½¢å¼ãæå®ãã
å¿çã®å½¢å¼ãå¶éããã«ã¯ã[Produces] ãã£ã«ã¿ã¼ãé©ç¨ãã¾ãã ã»ã¨ãã©ã®ãã£ã«ã¿ã¼ã¨åæ§ã«ã[Produces] ãã¢ã¯ã·ã§ã³ãã³ã³ããã¼ã©ã¼ãã°ãã¼ãã« ã¹ã³ã¼ãã«é©ç¨ã§ãã¾ãã
[ApiController]
[Route("api/[controller]")]
[Produces("application/json")]
public class TodoItemsController : ControllerBase
åã® [Produces] ãã£ã«ã¿ã¼ã§ã¯ä»¥ä¸ã®å¦çãè¡ããã¾ãã
- ã³ã³ããã¼ã©ã¼å ã®ãã¹ã¦ã®ã¢ã¯ã·ã§ã³ã§ãPOCO (åç´ãªå¾æ¥ã® CLR ãªãã¸ã§ã¯ã) ã¾ã㯠ObjectResult ã¨ãã®æ´¾çåã«å¯¾ã㦠JSON å½¢å¼ã®å¿çãå¼·å¶çã«è¿ãã¾ãã
- ä»ã®ãã©ã¼ããã¿ãæ§æããã¦ãã¦ãã¯ã©ã¤ã¢ã³ããå¥ã®å½¢å¼ãæå®ãã¦ããå ´åã§ããJSON å½¢å¼ã®å¿çãè¿ãã¾ãã
詳細ã«ã¤ãã¦ã¯ããã£ã«ã¿ã¼ã«é¢ãããã¼ã¸ãåç §ãã¦ãã ããã
ç¹æ®ãªã±ã¼ã¹ã®ãã©ã¼ããã¿
ä¸é¨ã®ç¹æ®ãªã±ã¼ã¹ãçµã¿è¾¼ã¿ã®ãã©ã¼ããã¿ã§å®è£
ããã¾ãã æ¢å®ã§ã¯ãæ»ãå¤ã®å string 㯠text/plain ã¨ãã¦æ¸å¼è¨å®ããã¾ã ( ãããã¼çµç±ã§è¦æ±ãããå ´å㯠Accept)ã ãã®åä½ã¯ StringOutputFormatter ãåé¤ãããã¨ã§åé¤ã§ãã¾ãã ãã©ã¼ããã¿ã¯ Program.cs ã§åé¤ããã¾ãã æ»ãå¤ã®åã¨ãã¦ã¢ãã« ãªãã¸ã§ã¯ããã¨ããªãã¢ã¯ã·ã§ã³ã¯ã204 No Content ãè¿ãã¨ããnull ãè¿ãã¾ãã ãã®åä½ã¯ HttpNoContentOutputFormatter ãåé¤ãããã¨ã§åé¤ã§ãã¾ãã æ¬¡ã®ã³ã¼ãã§ã¯ãStringOutputFormatter 㨠HttpNoContentOutputFormatter ãåé¤ããã¾ãã
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers(options =>
{
// using Microsoft.AspNetCore.Mvc.Formatters;
options.OutputFormatters.RemoveType<StringOutputFormatter>();
options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
});
StringOutputFormatter ããªãå ´åã¯ãçµã¿è¾¼ã¿ã® JSON ãã©ã¼ããã¿ã«ãã£ã¦æ»ãå¤ã®å string ãæ¸å¼è¨å®ããã¾ãã çµã¿è¾¼ã¿ã® JSON ãã©ã¼ããã¿ãåé¤ãããXML ãã©ã¼ããã¿ã使ç¨ã§ããå ´åã¯ãXML ãã©ã¼ããã¿ã«ãã£ã¦æ»ãå¤ã®å string ãæ¸å¼è¨å®ããã¾ãã ãã以å¤ã®å ´åã¯ãæ»ãå¤ã®å string ã§ 406 Not Acceptable ãè¿ããã¾ãã
HttpNoContentOutputFormatter ããªãå ´åãæ§æããã¦ãããã©ã¼ããã¿ãå©ç¨ããnull ãªãã¸ã§ã¯ããæ¸å¼è¨å®ããã¾ãã ä¾ãã°æ¬¡ãæãããã¾ãã
- JSON ãã©ã¼ããã¿ã¯ãæ¬æã
nullã®å¿çãè¿ãã¾ãã - XML ãã©ã¼ããã¿ã¯ã屿§
xsi:nil="true"ãè¨å®ããã空㮠XML è¦ç´ ãè¿ãã¾ãã
å¿çå½¢å¼ã® URL ãããã³ã°
ã¯ã©ã¤ã¢ã³ãã¯ãURL ã®ä¸é¨ã¨ãã¦ç¹å®ã®å½¢å¼ãè¦æ±ã§ãã¾ããæ¬¡ã«ä¾ã示ãã¾ãã
- ã¯ã¨ãªæååã¾ãã¯ãã¹ã®ä¸é¨ã
- .xml ã¾ã㯠.json ãªã©å½¢å¼åºæã®ãã¡ã¤ã«æ¡å¼µåã®ä½¿ç¨ã
è¦æ±ãã¹ããã®ãããã³ã°ã¯ãAPI ã§ä½¿ç¨ãããã«ã¼ãã«æå®ããå¿ è¦ãããã¾ãã ä¾ãã°æ¬¡ãæãããã¾ãã
[ApiController]
[Route("api/[controller]")]
[FormatFilter]
public class TodoItemsController : ControllerBase
{
private readonly TodoItemStore _todoItemStore;
public TodoItemsController(TodoItemStore todoItemStore)
=> _todoItemStore = todoItemStore;
[HttpGet("{id:long}.{format?}")]
public TodoItem? GetById(long id)
=> _todoItemStore.GetById(id);
åã®ã«ã¼ãã使ç¨ããã¨ãè¦æ±ãããå½¢å¼ããªãã·ã§ã³ã®ãã¡ã¤ã«æ¡å¼µåã使ç¨ãã¦æå®ã§ãã¾ãã
[FormatFilter] 屿§ã¯ RouteData ã«å½¢å¼å¤ããªãã確èªããå¿çã使ãããã¨ãå¿çå½¢å¼ãé©åãªãã©ã¼ããã¿ã«ãããã³ã°ãã¾ãã
| Route | Formatter |
|---|---|
/api/todoitems/5 |
æ¢å®ã®åºåãã©ã¼ããã¿ |
/api/todoitems/5.json |
JSON ãã©ã¼ããã¿ (æ§æãããå ´å) |
/api/todoitems/5.xml |
XML ãã©ã¼ããã¿ (æ§æãããå ´å) |
ããªã¢ã¼ãã£ãã¯éã·ãªã¢ã«å
çµã¿è¾¼ã¿æ©è½ã§ã¯ãããªã¢ã¼ãã£ãã¯ãªã·ãªã¢ã«åã¯éãããç¯å²ã§æä¾ããã¦ãã¾ãããéã·ãªã¢ã«åã¯ã¾ã£ãããµãã¼ãããã¦ãã¾ããã éã·ãªã¢ã«åãè¡ãã«ã¯ãã«ã¹ã¿ã ã³ã³ãã¼ã¿ã¼ãå¿ è¦ã§ãã ããªã¢ã¼ãã£ãã¯ãªéã·ãªã¢ã«åã®å®å ¨ãªãµã³ãã«ã«ã¤ãã¦ã¯ããããªã¢ã¼ãã£ãã¯ãªéã·ãªã¢ã«åããåç §ãã¦ãã ããã