如何在单个方法的 ApiController 中 return JSON?
How to return JSON in an ApiController for a single method?
目前,我的 ApiController
正在 returning XML 作为响应,但对于单个方法,我想 return 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;
试试这个 ApiController.Ok
。
您只需执行 return Ok(model)
并将 return 类型更改为 IHttpActionResult
。
示例:
public class CarController : ApiController
{
[System.Web.Mvc.Route("api/Player/videos")]
public IHttpActionResult GetVideoMappings()
{
var model = new MyCarModel();
return Ok(model);
}
}
如果您无法进行全局更改以强制响应 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);
}
问题可能出在 WebApiConfig 文件上。
在文件末尾添加这两行
var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
它在Project/App_Start/WebApiConfig.cs中 For asp.net MVC
返回 XML 而不是 JSON,因为调用者正在请求 XML。可以使用添加您需要的 header 并让 MVC 解析 JSON.
的过滤器将返回的格式强制为 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 配置和序列化。
对于 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;
}
}
}
}
样本:
目前,我的 ApiController
正在 returning XML 作为响应,但对于单个方法,我想 return 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;
试试这个 ApiController.Ok
。
您只需执行 return Ok(model)
并将 return 类型更改为 IHttpActionResult
。
示例:
public class CarController : ApiController
{
[System.Web.Mvc.Route("api/Player/videos")]
public IHttpActionResult GetVideoMappings()
{
var model = new MyCarModel();
return Ok(model);
}
}
如果您无法进行全局更改以强制响应 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);
}
问题可能出在 WebApiConfig 文件上。 在文件末尾添加这两行
var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
它在Project/App_Start/WebApiConfig.cs中 For asp.net MVC
返回 XML 而不是 JSON,因为调用者正在请求 XML。可以使用添加您需要的 header 并让 MVC 解析 JSON.
的过滤器将返回的格式强制为 JSONpublic class AcceptHeaderJsonAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)
{
actionContext.Request.Headers.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
}
}
因此,您可以使用此属性修饰要强制执行 JSON 响应的方法,并保持与任何其他方法相同的全局 JSON 配置和序列化。
对于 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;
}
}
}
}
样本: