wake-up-neo.com

Wie kann ich JSON in einem ApiController für eine einzelne Methode zurückgeben?

Derzeit gibt meine ApiControllers XML als Antwort zurück, aber für eine einzelne Methode möchte ich JSON zurückgeben. Ich kann keine globale Änderung vornehmen, um Antworten als JSON zu erzwingen.

public class CarController : ApiController
{  
    [System.Web.Mvc.Route("api/Player/videos")]
    public HttpResponseMessage GetVideoMappings()
    {
        var model = new MyCarModel();    
        return model;
    }
}

Ich habe es versucht, kann aber mein Modell nicht korrekt in eine JSON-Zeichenfolge konvertieren:

var jsonString = Json(model).ToString();    
var response = this.Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(jsonString, Encoding.UTF8, "application/json");
return response;
4
cool breeze

Wenn Sie keine globale Änderung vornehmen können, um Antworten als JSON zu erzwingen, versuchen Sie Folgendes:

[Route("api/Player/videos")]
public HttpResponseMessage GetVideoMappings()
{
    var model = new MyCarModel();
    return Request.CreateResponse(HttpStatusCode.OK,model,Configuration.Formatters.JsonFormatter);
}

ODER

[Route("api/Player/videos")]
public IHttpActionResult GetVideoMappings()
{
    var model = new MyCarModel();
    return Json(model);    
}

Wenn Sie global wechseln möchten, gehen Sie zuerst zu YourProject/App_Start/WebApiConfig.cs und fügen Sie Folgendes hinzu:

config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(
config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml"));

am Ende der Register-Methode. 

Dann versuche es:

[Route("api/Player/videos")]
public IHttpActionResult GetVideoMappings()
{
    var model = new MyCarModel();
    return Ok(model);    
}
8
Ashiquzzaman

Das XML wird statt JSON zurückgegeben, da der Aufrufer XML anfordert. Das zurückgegebene Format kann zu JSON erzwungen werden, indem ein Filter verwendet wird, der den erforderlichen Header hinzufügt und MVC den JSON auflösen kann.

public class AcceptHeaderJsonAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
    {
        actionContext.Request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));    
    }
}

Sie können also die Methode, mit der Sie eine JSON-Antwort erzwingen möchten, mit diesem Attribut dekorieren und dieselbe globale JSON-Konfiguration und -Serialisierung beibehalten wie andere Methoden.

2

Für API-Controller muss der Aufrufer bestimmen, wie die Antwort erstellt wird. Sofern Sie nicht ausdrücklich Code hinzufügen, um nur eine Art von Antwort zu erzwingen. Hier ist ein einfaches Beispiel für eine API-Methode und was passiert, wenn als Aufruf von XML oder JSON bezeichnet wird.

public class XmlEampleController : ApiController
{
    [HttpPost]
    [ActionName("MyOrderAction")]
    public HttpResponseMessage MyOrder([FromBody]MyOder order)
    {
        if (order != null)
        {
            return Request.CreateResponse<MyOder>(HttpStatusCode.Created, order);
        }
        return Request.CreateResponse(HttpStatusCode.BadRequest);
    }

[Serializable]
public partial class MyOder
{
    private string dataField;
    public string MyData
    {
        get
        {
            return this.dataField;
        }
        set
        {
            this.dataField = value;
        }
    }
}

}

Probe:  Help page display

Möglicherweise liegt das Problem bei der Datei "WebApiConfig". Fügen Sie am Ende der Datei diese beiden Zeilen hinzu

var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);

Es befindet sich in Project/App_Start/WebApiConfig.cs für asp.net MVC

0
zetawars

Versuchen Sie dies ApiController.Ok .

Sie müssen lediglich return Ok(model) ausführen und den Rückgabetyp in IHttpActionResult ändern.

Beispiel:

public class CarController : ApiController
{
    [System.Web.Mvc.Route("api/Player/videos")]
    public IHttpActionResult GetVideoMappings()
    {
        var model = new MyCarModel();
        return Ok(model);
    }
}
0
Mohammad Ali