ASP.NET Web API를 사용할 때, 일반 텍스트를 POST 요청의 본문에 포함하여 특정 엔드포인트로 전송해야 하는 경우가 있습니다. 이 글에서는 Content-Type : text/plain 를 ASP.NET Web API 엔드포인트에 POST하는 올바른 방법을 설명합니다.
일반 텍스트를 POST로 전송할 때 기본적인 컨트롤러 설정
우선 기본적으로 ASP.NET Web API의 컨트롤러에서 POST 요청을 처리하는 액션 메서드를 정의하는 방법은 다음과 같습니다.
[HttpPost]
public void Post([FromBody] string text)
여기서 [FromBody]
어노테이션을 사용하여 요청 본문에 포함된 데이터를 string
타입으로 바인딩하려고 시도하고 있습니다. 일반 텍스트 데이터를 전송할 때, 요청 헤더에 다음과 같이 Content-Type
을 설정하는 것이 일반적입니다.
Content-Type: text/plain
이 방식으로 요청을 보냈을 때 기대되는 동작은 요청 본문에 포함된 텍스트가 그대로 text
매개변수로 전달되는 것입니다. 그러나 실제로 요청을 보낼 경우 다음과 같은 오류가 발생할 수 있습니다.
오류 메시지: Unsupported Media Type
요청을 보냈을 때 발생할 수 있는 대표적인 오류 메시지는 다음과 같습니다.
{
"type": "https://tools.ietf.org/html/rfc9110#section-15.5.16",
"title": "Unsupported Media Type",
"status": 415,
"traceId": "00-83ac92d6212d899fec925360ac9513a3-177934da7d03953d-00"
}
이 오류는 Web API가 text/plain
형식의 데이터를 처리할 수 있는 Formatter를 찾을 수 없을 때 발생합니다. 기본적으로 ASP.NET Web API는 JSON, XML과 같은 일반적으로 사용되는 형식에 대해 기본 제공 Formatter를 지원하지만, text/plain
에 대해서는 기본 지원을 하지 않기 때문입니다.
문제의 원인: ASP.NET Web API의 MediaTypeFormatter 제한
ASP.NET Web API는 기본적으로 text/plain
미디어 타입에 대한 처리를 지원하지 않습니다. 이는 Web API가 기본적으로 JSON과 XML 같은 구조화된 데이터를 주고받는 데 최적화되어 있기 때문입니다. 따라서 일반 텍스트를 POST 요청으로 보낼 때는 명시적으로 이를 처리할 수 있는 설정을 추가해야 합니다.
해결 방법 1: TextInputFormatter
사용자 정의
일반 텍스트 형식을 처리할 수 있도록 사용자 정의 Formatter를 추가하는 방법이 있습니다. 다음은 PlainTextFormatter
를 정의하고 이를 Web API에 등록하는 예시입니다.
사용자 정의 PlainTextFormatter 구현
public class PlainTextFormatter : TextInputFormatter
{
public PlainTextFormatter()
{
SupportedMediaTypes.Add(new MediaTypeHeaderValue(MediaTypeNames.Text.Plain));
SupportedEncodings.Add(Encoding.UTF8);
SupportedEncodings.Add(Encoding.ASCII);
}
protected override bool CanReadType(Type type) => type == typeof(string);
public override async Task<InputFormatterResult> ReadRequestBodyAsync(InputFormatterContext context, Encoding encoding)
{
var reader = new StreamReader(context.HttpContext.Request.Body);
var plainText = await reader.ReadToEndAsync();
return await InputFormatterResult.SuccessAsync(plainText);
}
}
Web API 등록
Program.cs 의 Main 함수에 등록합니다.
builder.Services.AddControllers(options =>
{
options.InputFormatters.Insert(0, new PlainTextFormatter ());
});
이제 PlainTextFormatter
가 등록되었기 때문에 Web API는 text/plain
형식의 요청을 올바르게 처리할 수 있습니다.
해결 방법 2: HttpRequestMessage
로 직접 읽기
다른 해결 방법으로는 [FromBody]
어노테이션을 사용하지 않고, HttpRequestMessage 객체를 사용하여 요청 본문을 직접 읽는 방법이 있습니다.
[HttpPost]
public async Task<HttpResponseMessage> Post(HttpRequestMessage request)
{
string text = await request.Content.ReadAsStringAsync();
return new HttpResponseMessage
{
Content = new StringContent($"Received text: {text}")
};
}
이 방법은 별도의 MediaTypeFormatter를 추가하지 않아도 되므로 간단한 테스트나 임시적인 구현에 유용합니다.
해결 방법 3: 클라이언트에서 JSON 형식으로 보내기
만약 클라이언트 측에서 일반 텍스트 대신 JSON 형식으로 감싸서 데이터를 보내는 것이 가능하다면, ASP.NET Web API가 기본적으로 지원하는 JSON MediaTypeFormatter를 활용할 수 있습니다. 예를 들어, 클라이언트에서 다음과 같이 요청을 보낼 수 있습니다.
{
"text": "This is a plain text message."
}
그리고 컨트롤러에서는 다음과 같이 데이터를 받을 수 있습니다.
[HttpPost]
public HttpResponseMessage Post([FromBody] dynamic data)
{
string text = data.text;
return new HttpResponseMessage
{
Content = new StringContent($"Received text: {text}")
};
}
이 방법은 Web API가 기본적으로 JSON을 처리할 수 있으므로 추가 설정이 필요하지 않습니다.
결론
ASP.NET Web API에서 일반 텍스트 데이터를 POST 요청으로 전송하는 방법은 기본적인 설정만으로는 제대로 동작하지 않을 수 있습니다. 따라서 이 글에서 소개한 다음과 같은 해결 방법을 사용할 수 있습니다.
- 사용자 정의 MediaTypeFormatter 추가
HttpRequestMessage
를 사용하여 요청 본문을 직접 읽기- 클라이언트에서 JSON 형식으로 요청 보내기
각 방법은 상황에 따라 적절하게 선택할 수 있으며, 사용자 정의 MediaTypeFormatter를 사용하는 방법이 가장 일반적이고 재사용 가능한 솔루션입니다.
이제 ASP.NET Web API를 활용하여 일반 텍스트 데이터를 효과적으로 처리할 수 있습니다!