92 votes

Renvoyer une chaîne JSON de manière explicite depuis Asp.net WEBAPI ?

Dans certains cas, j'ai NewtonSoft JSON.NET et dans mon contrôleur, je renvoie simplement le Jobject depuis mon contrôleur et tout va bien.

Mais j'ai un cas où je reçois du JSON brut d'un autre service et je dois le renvoyer à partir de mon webAPI. Dans ce contexte, je ne peux pas utiliser NewtonSOft, mais si je le pouvais, je créerais un JOBJECT à partir de la chaîne de caractères (ce qui semble être une surcharge de traitement inutile) et je le renverrais et tout irait pour le mieux dans le monde.

Cependant, je veux renvoyer cette information simplement, mais si je renvoie la chaîne, le client reçoit un wrapper JSON avec mon contexte sous forme de chaîne codée.

Comment puis-je retourner explicitement un JSON à partir de ma méthode de contrôleur WebAPI ?

208voto

carlosfigueira Points 40778

Il existe quelques alternatives. La plus simple est de faire en sorte que votre méthode renvoie un fichier HttpResponseMessage et créer cette réponse avec un StringContent en fonction de votre chaîne de caractères, 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érification de la 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);
}

4 votes

Excellent. Je créais une chaîne JSON et la retournais sous forme de chaîne, mais cela introduisait inévitablement un " supplémentaire autour du résultat. Cela devrait corriger cela.

1 votes

C'est ennuyeux. Vous devez en fait créer le HttpResponseMessage response puis affecte le StringContent à la .Content propriété. Cela ne fonctionne pas si vous assignez le StringContent dans le Constructeur.

19voto

Jpsy Points 2811

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

4voto

Muni Chittem Points 65

Exemple de retour de 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\");
}

3voto

Tymek Points 1305

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 es 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.

2voto

Joe Enos Points 17442

Si vous souhaitez spécifiquement renvoyer uniquement ce JSON, sans utiliser les fonctionnalités de la WebAPI (comme l'autorisation du XML), vous pouvez toujours écrire directement dans la sortie. En supposant que vous hébergez cette application avec ASP.NET, vous avez accès à l'interface de l'utilisateur. Response afin de pouvoir l'écrire de cette façon sous forme de chaîne de caractères. Vous n'avez donc pas besoin de renvoyer quoi que ce soit de votre méthode, car vous avez déjà écrit le texte de la réponse dans le flux de sortie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X