ASP.NET Web API에서 일반 텍스트(text/plain)를 POST하는 방법

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 요청으로 전송하는 방법은 기본적인 설정만으로는 제대로 동작하지 않을 수 있습니다. 따라서 이 글에서 소개한 다음과 같은 해결 방법을 사용할 수 있습니다.

  1. 사용자 정의 MediaTypeFormatter 추가
  2. HttpRequestMessage를 사용하여 요청 본문을 직접 읽기
  3. 클라이언트에서 JSON 형식으로 요청 보내기

각 방법은 상황에 따라 적절하게 선택할 수 있으며, 사용자 정의 MediaTypeFormatter를 사용하는 방법이 가장 일반적이고 재사용 가능한 솔루션입니다.

이제 ASP.NET Web API를 활용하여 일반 텍스트 데이터를 효과적으로 처리할 수 있습니다!

Leave a Comment