Renvoyer une chaîne JSON explicitement à partir d'Asp.net WEBAPI?

85

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?

Klumsy
la source

Réponses:

197

Il existe quelques alternatives. Le plus simple consiste à demander à votre méthode de renvoyer a HttpResponseMessageet de créer cette réponse avec a en StringContentfonction de votre chaîne, quelque chose de similaire au code ci-dessous:

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

Et vérifier une chaîne JSON nulle ou vide

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);
}
carlosfigueira
la source
4
Excellent. Je faisais une chaîne JSON et je la
renvoyais
1
C'est énervant. Vous devez créer le HttpResponseMessage response, puis attribuer le StringContentà la .Contentpropriété. Cela ne fonctionne pas si vous affectez le StringContent dans le constructeur.
Suamere
15

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);
}
Jpsy
la source
2

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' Responseobjet, 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.

Joe Enos
la source
1

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\");
}
Muni Chittem
la source
1
D'où vient le contenu? un nom complet ou une déclaration «using» serait utile.
granadaCoder
0

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);
}
eci
la source
0

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);
}

ContentResultest Microsoft.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.

tymtam
la source