我希望这里的人可以提供帮助,真的很挣扎。我正在Web API 2中编写RESTful API。每当我向此服务发送请求时,响应始终与Content-Type
text/plain
一起发送。显然这不好,我的回复需要Content-Type
application/json
。我尝试了一些我从谷歌发现的建议,但我认为我不了解整体情况。
为了让我的网络服务以application/json
内容回复,我需要做些什么特别的事吗?请注意,我希望这在整个应用程序中全局工作,所以我不是在修改给定的响应并设置其内容类型 - 我希望这是整个Web服务的默认行为:如果请求包含Accept
的{{1}}标题我希望我的网络服务返回application/json
而不是Content-Type
。
修改以澄清:
我的回复包含一个名为“responseData”的对象,该对象应序列化为JSON并包含在正文中。我目前正在将这样的回答放在一起:
text/plain
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, responseData);
return response;
是POCO。这个get被正确地序列化为JSON并在响应中返回 - 唯一缺少的部分是Content-Type,它被错误地设置为“text / plain”。我可以在我编写的每一个响应中手动更改它,但我想在全局级别配置它。
答案 0 :(得分:9)
好的,假设您的responseData
是字符串,Content-type
标题在您创建text/plain
时将为HttpResponseMessage
。不重要的是字符串的内容是什么,因为没有尝试确定它。
解决方案是为您的消息创建适当的内容对象,并使用您要返回的媒体类型进行初始化:
HttpResponseMessage response = new HttpResponseMessage()
{
Content = new StringContent(
responseData,
Encoding.UTF8,
"application/json"
)
};
还有其他方法可以返回特定的对象类型,并让API库根据需要为您序列化为JSON或XML。我更愿意让框架尽可能地为我工作,但这就是你用你自己创建的字符串来实现它的方式。
对于严格的仅JSON结果,从WebAPI配置中删除XML格式化程序并返回您的POCO。
在App_Start\WebApiConfig.cs
中,将以下内容添加到WebApiConfig.Register
方法:
config.Formatters.Remove(config.Formatters.XmlFormatter);
对于您的API:
public class MyObject
{
public bool result;
public string reason;
}
public class TestController : ApiController
{
public MyObject GetData()
{
MyObject result = new MyObject { result = "true", reason = "Testing POCO return" };
return result;
}
}
我对此进行了测试并从Chrome中请求了/api/Test
,而application/json
标题中甚至没有提到Accept
。以下是响应标题,直至达到Content-Type
:
HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
身体:
{"result":true,"reason":"Testing POCO return"}
由于我禁用了XML,因此默认为JSON。
答案 1 :(得分:0)
将以下内容添加到Global.asax文件中。
protected void Application_Start()
{
JsonSerializerSettings serializerSettings = new JsonSerializerSettings();
serializerSettings.Converters.Add(new IsoDateTimeConverter());
var jsonFormatter = new JsonNetFormatter(serializerSettings);
jsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/html"));
GlobalConfiguration.Configuration.Formatters.Insert(0, jsonFormatter);
}
答案 2 :(得分:0)
所描述问题的另一个可能来源是可能存在授权重定向,就像其中一位工程师想要为api重用用户身份验证一样。
这意味着传入的请求被重定向到登录页面,该页面是text/html
无法解析的ReadAsync<>
响应。这是一个愚蠢的错误,但不容易发现。
该案例的解决方案是删除用户身份验证并为api实施基于HMAC的身份验证。