it-swarm.dev

Jak vrátit JSON do ApiControlleru pro jednu metodu?

V současné době moje ApiControllers vracejí XML jako odpověď, ale pro jednu metodu chci vrátit JSON. tj. nemohu provést globální změnu k vynucení odpovědí jako JSON.

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

Snažil jsem se to udělat, ale nezdá se, že by byl můj model správně převeden na řetězec JSON:

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

Pokud nemůžete provést globální změnu k vynucení odpovědí jako JSON, zkuste:

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

NEBO

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

Pokud chcete změnit globálně, přejděte nejprve na YourProject/App_Start/WebApiConfig.cs a přidejte:

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

v dolní části metody Register

Pak zkuste:

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

XML se vrací místo JSON, protože volající požaduje XML. Vrácený formát může být nucen k JSONu pomocí filtru, který přidává hlavičku, kterou potřebujete, a nechá MVC vyřešit JSON.

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

Můžete tedy ozdobit metodu, kterou chcete vynutit odezvu JSON tímto atributem, a zachovat stejnou globální konfiguraci JSON a serializaci jako jakoukoliv jinou metodu.

2

U řadičů API je na volajícím, aby určil, jak bude odpověď vytvořena. Pokud výslovně nepřidáte kód k vynucení pouze jednoho typu odpovědi. Zde je jednoduchý příklad metody API a toho, co se stane, když se volá XML nebo 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;
        }
    }
}

}

Vzorek:  Help page display

Možná je problém s souborem WebApiConfig. Na konci souboru přidejte tyto 2 řádky

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

Je v projektu/App_Start/WebApiConfig.cs Pro asp.net MVC

0
zetawars

Zkuste toto ApiController.Ok .

Stačí udělat return Ok(model) a změnit typ návratu na IHttpActionResult .

Příklad:

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