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);
}
ContentResult
이Microsoft.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
'programing' 카테고리의 다른 글
Javascript를 사용하여 XML을 JSON(및 이전 버전)으로 변환 (0) | 2023.02.07 |
---|---|
태그 또는 설명별 WooCommerce 제품 검색 게시물 조회 (0) | 2023.02.07 |
SQL Server 스토어드 프로시저를 MySQL(MariaDB)로 다시 쓰기 (0) | 2023.01.30 |
Java 'localhost:10.0'을 DISPLAY 변수 값으로 사용하여 X11 창 서버에 연결할 수 없습니다. (0) | 2023.01.30 |
소수점 2자리까지 부동을 표시하는 JavaScript (0) | 2023.01.30 |