ASP.NET Web APIはPOST純テキストフォーマット(text/plain)のデータをサポートする
2073 ワード
今日、web apiでこのような問題に遭遇しました.apiのパラメータタイプはstringですが、post bodyのjson形式のstringしか受信できず、元のstringは受信できません.
Web apiは、次のように定義されています.
この問題を解決するには、PlainTextType Formatterを実装する必要があります.実装コードは次のとおりです.
Web apiは、次のように定義されています.
public async Task<HttpResponseMessage> Post(string blogApp, int postId, [FromBody] string body)
{
}
json形式でweb apiにpostを行うことに成功しました.var response = await _httpClient.PostAsJsonAsync(
$"api/blogs/{blogApp}/posts/{postId}/comments",
body);
しかし、純粋なテキストフォーマット(content-typeはtext/plain)postで、bodyの値は空です.var response = await _httpClient.PostAsync(
$"api/blogs/{blogApp}/posts/{postId}/comments",
new StringContent(body)
);
研究の結果、これはcontent-typeがtext/plainであるpost要求に対してasp.Netweb apiは対応するMediaType Formatter,aspを提供していない.Netweb apiのデフォルトはJsonMediaType FormatterとXmlMediaType Formatterのみです.この問題を解決するには、PlainTextType Formatterを実装する必要があります.実装コードは次のとおりです.
public class PlainTextTypeFormatter : MediaTypeFormatter
{
public PlainTextTypeFormatter()
{
SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain"));
}
public override bool CanReadType(Type type)
{
return type == typeof(string);
}
public override bool CanWriteType(Type type)
{
return type == typeof(string);
}
public override async Task WriteToStreamAsync(Type type, object value,
Stream writeStream, HttpContent content, TransportContext transportContext)
{
using (var sw = new StreamWriter(writeStream))
{
await sw.WriteAsync(value.ToString());
}
}
public override async Task<object> ReadFromStreamAsync(Type type, Stream readStream,
HttpContent content, IFormatterLogger formatterLogger)
{
using (var sr = new StreamReader(readStream))
{
return await sr.ReadToEndAsync();
}
}
}
上記の実装コードでは,本明細書の問題を解決するにはCanReadType()とReadFromStreamAsync()を実装するだけである.CanWriteType()とReadFromStreamAsync()の実装は、別の問題を解決するためであり、詳細は、ASP.NET Web APIはtext/plainコンテンツ交渉をサポートする.