En algunos casos tengo NewtonSoft JSON.NET y en mi controlador solo devuelvo el Jobject de mi controlador y todo está bien.
Pero tengo un caso en el que obtengo un JSON sin formato de otro servicio y necesito devolverlo desde mi webAPI. En este contexto, no puedo usar NewtonSOft, pero si pudiera, crearía un JOBJECT a partir de la cadena (que parece una sobrecarga de procesamiento innecesaria) y lo devolvería y todo estaría bien en el mundo.
Sin embargo, quiero devolver esto simplemente, pero si devuelvo la cadena, entonces el cliente recibe un contenedor JSON con mi contexto como una cadena codificada.
¿Cómo puedo devolver explícitamente un JSON desde mi método de controlador WebAPI?
fuente
HttpResponseMessage response
y luego asignarloStringContent
a la.Content
propiedad. No funciona si asigna StringContent en el Constructor.Aquí está la solución de @carlosfigueira adaptada para usar la interfaz IHttpActionResult que se introdujo con WebApi2:
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); }
fuente
Si desea devolver específicamente ese JSON solo, sin utilizar las funciones de WebAPI (como permitir XML), siempre puede escribir directamente en la salida. Suponiendo que está alojando esto con ASP.NET, tiene acceso al
Response
objeto, por lo que puede escribirlo de esa manera como una cadena, entonces no necesita devolver nada de su método; ya ha escrito el texto de respuesta al flujo de salida.fuente
ejemplo de muestra para devolver datos json del método GET de la api web
[HttpGet] public IActionResult Get() { return Content("{\"firstName\": \"John\", \"lastName\": \"Doe\", \"lastUpdateTimeStamp\": \"2018-07-30T18:25:43.511Z\", \"nextUpdateTimeStamp\": \"2018-08-30T18:25:43.511Z\"); }
fuente
estos también funcionan:
[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); }
fuente
Esto me funciona en .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
esMicrosoft.AspNetCore.Mvc.ContentResult
.Tenga en cuenta que esto no canaliza los encabezados, pero en mi caso esto es lo que necesito.
fuente