Dans certains cas, j'ai NewtonSoft JSON.NET et dans mon contrôleur, je retourne simplement le Jobject de mon contrôleur et tout va bien.
Mais j'ai un cas où j'obtiens du JSON brut d'un autre service et je dois le renvoyer depuis mon webAPI. Dans ce contexte, je ne peux pas utiliser NewtonSOft, mais si je pouvais, je créerais un JOBJECT à partir de la chaîne (ce qui semble être une surcharge de traitement inutile) et le retournerais et tout irait bien avec le monde.
Cependant, je veux renvoyer ceci simplement, mais si je retourne la chaîne, le client reçoit un wrapper JSON avec mon contexte sous forme de chaîne codée.
Comment puis-je renvoyer explicitement un JSON à partir de ma méthode de contrôleur WebAPI?
la source
HttpResponseMessage response
, puis attribuer leStringContent
à la.Content
propriété. Cela ne fonctionne pas si vous affectez le StringContent dans le constructeur.Voici la solution de @ carlosfigueira adaptée pour utiliser l'interface IHttpActionResult qui a été introduite avec 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); }
la source
Si vous souhaitez spécifiquement renvoyer ce JSON uniquement, sans utiliser les fonctionnalités WebAPI (comme autoriser XML), vous pouvez toujours écrire directement dans la sortie. En supposant que vous hébergez cela avec ASP.NET, vous avez accès à l'
Response
objet, vous pouvez donc l'écrire de cette façon sous forme de chaîne, alors vous n'avez pas besoin de renvoyer quoi que ce soit de votre méthode - vous avez déjà écrit le texte de réponse au flux de sortie.la source
exemple d'exemple pour renvoyer des données json à partir de la méthode GET de l'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\"); }
la source
ceux-ci fonctionnent également:
[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); }
la source
Cela fonctionne pour moi dans .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
estMicrosoft.AspNetCore.Mvc.ContentResult
.Veuillez noter que cela ne canalise pas les en-têtes, mais dans mon cas, c'est ce dont j'ai besoin.
la source