programing

Asp.net WEBAPI에서 JSON 문자열을 명시적으로 반환하시겠습니까?

newsource 2023. 2. 7. 19:59

Asp.net WEBAPI에서 JSON 문자열을 명시적으로 반환하시겠습니까?

경우에 따라서는 Newton Soft JSON을 사용하고 있습니다.NET 및 컨트롤러에서 를 반환하기만 하면 모든 것이 정상입니다.

다만, 다른 서비스로부터 미가공 JSON을 입수해, WebAPI로부터 직접 반환할 필요가 있는 경우가 있습니다.이 상황에서는 Newton Soft를 사용할 수 없습니다만, 만약 사용할 수 있다면,JObject(불필요한 처리 오버헤드처럼 보이는) 스트링에서 벗어나면 모든 것이 잘 될 것입니다.

단, 단순하게 반환하고 싶은데 문자열을 반환하면 클라이언트는 내 컨텍스트가 인코딩된 문자열인 JSON 래퍼를 받습니다.

WebAPI 컨트롤러 메서드에서 JSON을 명시적으로 반환하려면 어떻게 해야 합니까?

몇 가지 대안이 있습니다.가장 간단한 방법은 메서드에서 a를 반환하는 것입니다.HttpResponseMessage를 사용하여 응답을 작성합니다.StringContent문자열에 따라 다음 코드와 유사한 것이 표시됩니다.

public HttpResponseMessage Get()
{
    string yourJson = GetJsonFromSomewhere();
    var response = this.Request.CreateResponse(HttpStatusCode.OK);
    response.Content = new StringContent(yourJson, Encoding.UTF8, "application/json");
    return response;
}

또한 null 또는 빈 JSON 문자열을 확인합니다.

public HttpResponseMessage Get()
{
    string yourJson = GetJsonFromSomewhere();
    if (!string.IsNullOrEmpty(yourJson))
    {
        var response = this.Request.CreateResponse(HttpStatusCode.OK);
        response.Content = new StringContent(yourJson, Encoding.UTF8, "application/json");
        return response;
    }
    throw new HttpResponseException(HttpStatusCode.NotFound);
}

다음은 WebApi2에서 도입된 IHtpActionResult 인터페이스를 사용하도록 조정된 @carlosfigueira의 솔루션입니다.

public IHttpActionResult Get()
{
    string yourJson = GetJsonFromSomewhere();
    if (string.IsNullOrEmpty(yourJson)){
        return NotFound();
    }
    var response = this.Request.CreateResponse(HttpStatusCode.OK);
    response.Content = new StringContent(yourJson, Encoding.UTF8, "application/json");
    return ResponseMessage(response);
}

이것은, 에서 유효합니다.NET Core 3.1.

private async Task<ContentResult> ChannelCosmicRaysAsync(HttpRequestMessage request)
{
    // client is HttpClient
    using var response = await client.SendAsync(request).ConfigureAwait(false); 

    var responseContentString = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

    Response.StatusCode = (int)response.StatusCode;
    return Content(responseContentString, "application/json");
}
public Task<ContentResult> X()
{
    var request = new HttpRequestMessage(HttpMethod.Post, url);
    (...)

    return ChannelCosmicRaysAsync(request);
}

ContentResultMicrosoft.AspNetCore.Mvc.ContentResult.

이것은 헤더를 통하지 않습니다만, 제 경우는 이것만 있으면 됩니다.

web api GET 메서드에서 json 데이터를 반환하는 예제

[HttpGet]
public IActionResult Get()
{
            return Content("{\"firstName\": \"John\",  \"lastName\": \"Doe\", \"lastUpdateTimeStamp\": \"2018-07-30T18:25:43.511Z\",  \"nextUpdateTimeStamp\": \"2018-08-30T18:25:43.511Z\");
}

특히 WebAPI 기능(XML 허용 등)을 사용하지 않고 JSON만을 반환하는 경우 언제든지 출력에 직접 쓸 수 있습니다.ASP에서 호스팅한다고 가정해 보겠습니다.NET, 당신은 에 액세스 할 수 있습니다.Response오브젝트에서는 이 방법으로 스트링으로 쓸 수 있습니다.그러면 메서드에서 아무것도 반환할 필요가 없습니다.이미 출력 스트림에 응답 텍스트를 쓰고 있습니다.

컨트롤러 메서드에서 IActionResult가 반환되는 경우 출력 포맷터를 수동으로 설정하면 됩니다.

// Alternatively, if inheriting from ControllerBase you could do
// var result = Ok(jsonAsString);
var result = new OkObjectResult(jsonAsString);

var formatter = new StringOutputFormatter();
result.Formatters.Add(formatter);

formatter.SupportedMediaTypes.Clear();
formatter.SupportedMediaTypes.Add("application/json");

이것도 동작합니다.

[HttpGet]
[Route("RequestXXX")]
public ActionResult RequestXXX()
{
    string error = "";
    try{
        _session.RequestXXX();
    }
    catch(Exception e)
    {
        error = e.Message;
    }
    return new JsonResult(new { error=error, explanation="An error happened"});
}

[HttpGet]
[Route("RequestXXX")]
public ActionResult RequestXXX()
{
    string error = "";
    try{
        _session.RequestXXX();
    }
    catch(Exception e)
    {
        error = e.Message;
    }
    return new JsonResult(error);
}

언급URL : https://stackoverflow.com/questions/17097841/return-a-json-string-explicitly-from-asp-net-webapi