Restituire una stringa JSON in modo esplicito da Asp.net WEBAPI?


88

In alcuni casi ho NewtonSoft JSON.NET e nel mio controller restituisco semplicemente il Jobject dal mio controller e tutto va bene.

Ma ho un caso in cui ottengo un po 'di JSON non elaborato da un altro servizio e devo restituirlo dalla mia webAPI. In questo contesto non posso usare NewtonSOft, ma se potessi creare un JOBJECT dalla stringa (che sembra un overhead di elaborazione non necessario) e restituirlo e tutto andrebbe bene con il mondo.

Tuttavia, voglio restituirlo semplicemente, ma se restituisco la stringa, il client riceve un wrapper JSON con il mio contesto come stringa codificata.

Come posso restituire esplicitamente un JSON dal metodo del mio controller WebAPI?

Risposte:


201

Ci sono alcune alternative. Il più semplice è fare in modo che il tuo metodo restituisca a HttpResponseMessagee crei quella risposta in StringContentbase alla tua stringa, qualcosa di simile al codice seguente:

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

E controllando la stringa JSON nulla o vuota

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
Eccellente. Stavo creando una stringa JSON e restituendola come stringa, ma questo ha introdotto inevitabili extra "intorno al risultato. Questo dovrebbe risolvere il problema.
silente

1
Questo è fastidioso. Devi effettivamente creare il HttpResponseMessage response, quindi assegnarlo StringContentalla .Contentproprietà. Non funziona se assegni StringContent nel costruttore.
Suamere

16

Ecco la soluzione di @ carlosfigueira adattata per utilizzare l'interfaccia IHttpActionResult che è stata introdotta 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);
}

2

Se desideri specificamente restituire solo quel JSON, senza utilizzare le funzionalità WebAPI (come consentire XML), puoi sempre scrivere direttamente nell'output. Supponendo che tu lo stia ospitando con ASP.NET, hai accesso Responseall'oggetto, quindi puoi scriverlo in quel modo come una stringa, quindi non devi effettivamente restituire nulla dal tuo metodo: hai già scritto il testo di risposta al flusso di output.


1

esempio di esempio per restituire dati JSON dal metodo GET 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\");
}

2
Da dove provengono i contenuti? sarebbe utile un nome completo o un'istruzione "using".
granadaCoder

0

funzionano anche:

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

0

Questo funziona per me in .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.

Tieni presente che questo non è intestazioni di canale, ma nel mio caso è ciò di cui ho bisogno.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.