Как вернуть JSON в ApiController для одного метода?
В настоящее время мои ApiController возвращают XML в качестве ответа, но для одного метода я хочу вернуть JSON, т.е. я не могу сделать глобальное изменение, чтобы заставить ответы как JSON.
public class CarController : ApiController
{
[System.Web.Mvc.Route("api/Player/videos")]
public HttpResponseMessage GetVideoMappings()
{
var model = new MyCarModel();
return model;
}
}
Я пытался сделать это, но не могу правильно преобразовать мою модель в строку JSON:
var jsonString = Json(model).ToString()
var response = this.Request.CreateResponse(HttpStatusCode.OK);
response.Content = new StringContent(jsonString, Encoding.UTF8, "application/json");
return response;
5 ответов
Если вы не можете сделать глобальное изменение, чтобы заставить ответы как JSON. Тогда попробуйте:
[Route("api/Player/videos")]
public HttpResponseMessage GetVideoMappings()
{
var model = new MyCarModel();
return Request.CreateResponse(HttpStatusCode.OK,model,Configuration.Formatters.JsonFormatter);
}
ИЛИ ЖЕ
[Route("api/Player/videos")]
public IHttpActionResult GetVideoMappings()
{
var model = new MyCarModel();
return Json(model);
}
если вы хотите изменить глобально, то
Сначала идите в YourProject/App_Start/WebApiConfig.cs
добавлять
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(
config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml"));
в нижней части Register
метод.
тогда попробуйте:
[Route("api/Player/videos")]
public IHttpActionResult GetVideoMappings()
{
var model = new MyCarModel();
return Ok(model);
}
Вместо json возвращается xml, поскольку вызывающая сторона запрашивает xml, возвращаемый формат можно принудительно преобразовать в json, используя фильтр, который добавляет необходимый заголовок и позволяет mvc разрешить json.
public class AcceptHeaderJsonAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
actionContext.Request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
}
Таким образом, вы можете украсить метод, для которого вы хотите вызвать ответ json, с помощью этого атрибута и сохранить ту же глобальную конфигурацию и сериализацию json, что и любой другой метод.
Попробуйте этот ApiController.Ok вы просто делаете return Ok(model)
И измените тип возвращаемого значения на IHttpActionResult
пример
public class CarController : ApiController
{
[System.Web.Mvc.Route("api/Player/videos")]
public IHttpActionResult GetVideoMappings()
{
var model = new MyCarModel();
return Ok(model);
}
}
Для контроллеров API это зависит от вызывающей стороны, чтобы определить, как создается ответ. Если вы специально не добавите код, чтобы вызвать только один тип ответа. Вот простой пример метода API и того, что происходит, когда вызывается запрос XML или 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;
}
}
}
}
Возможно, проблема связана с файлом WebApiConfig. В конце файла добавьте эти 2 строки
var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
Это находится в Project/App_Start/WebApiConfig.cs для asp.net MVC