web-dev-qa-db-fra.com

Comment renvoyer JSON dans un ApiController pour une seule méthode?

Actuellement, mes ApiControllers renvoient XML en réponse, mais pour une méthode unique, je souhaite renvoyer JSON. Je ne peux pas effectuer de changement global pour forcer les réponses en JSON.

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

J'ai essayé de faire cela, mais n'arrive pas à convertir mon modèle en chaîne JSON correctement:

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

Si vous ne pouvez pas effectuer de changement global pour forcer les réponses au format JSON, essayez:

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

OU

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

Si vous voulez changer globalement, allez d'abord à YourProject/App_Start/WebApiConfig.cs et ajoutez:

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

au bas de la méthode Register

Alors essaye:

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

Le code XML est renvoyé à la place du code JSON car l'appelant demande XML. Le format renvoyé peut être forcé en JSON à l'aide d'un filtre qui ajoute l'en-tête dont vous avez besoin et permet à MVC de résoudre le JSON.

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

Vous pouvez donc décorer la méthode pour forcer une réponse JSON avec cet attribut et conserver la même configuration et la même sérialisation JSON globales que toute autre méthode.

2

Pour les contrôleurs d’API, il appartient à l’appelant de déterminer le mode de création de la réponse. Sauf si vous ajoutez spécifiquement du code pour forcer un seul type de réponse. Voici un exemple simple de méthode d’API et de ce qui se produit lorsqu’on appelle une demande XML ou JSON.

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

}

Échantillon:  Help page display

0

Peut-être que le problème est avec le fichier WebApiConfig. A la fin du fichier, ajoutez ces 2 lignes

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

C'est dans Project/App_Start/WebApiConfig.cs Pour asp.net MVC

0
zetawars

Essayez ceci ApiController.Ok .

Vous faites simplement return Ok(model) et changez le type de retour en IHttpActionResult .

Exemple:

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