繁体   English   中英

Web API 2返回文本/简单响应

[英]Web API 2 returning text/plain responses

真的很挣钱,我希望这里的人可以提供帮助。 我正在Web API 2中编写RESTful API。每当我向此服务发送请求时,响应始终与Content-Type of text/plain 显然这不好,我的回复需要是Content-Type of application/json 我已经尝试了一些我从谷歌发现的建议,但我认为我并不了解整体情况。

为了让我的Web服务响应application/json内容,我需要做些什么特别的事情吗? 请注意,我希望这在整个应用程序中全局工作,所以我不是在修改给定的响应并设置其内容类型 - 我希望这是整个Web服务的默认行为:如果请求包含application/jsonAccept标头我希望我的Web服务返回Content-Type而不是text/plain

编辑澄清:

我的响应包含一个名为“responseData”的对象,该对象应序列化为JSON并包含在正文中。 我目前正在将这样的回答放在一起:

HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, responseData);
return response;

responseData是一个POCO。 这个get被正确地序列化为JSON并在响应中返回 - 唯一缺少的部分是Content-Type,它被错误地设置为“text / plain”。 我可以在我编写的每个响应上手动更改它,但我想在全局级别配置它。

好的,假设您的responseData是一个字符串,在创建HttpResponseMessage时, Content-type标头将是text/plain 无论字符串的内容是什么,因为没有尝试确定这一点。

解决方案是为您的消息创建适当的Content对象,使用您要返回的媒体类型进行初始化:

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 ,它甚至没有在Accept标头中提到application/json 以下是响应标题,直到它命中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。

将以下内容添加到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);

}

所描述的问题的另一个可能的来源是可能存在授权重定向,就像我们当其中一个工程师想要为api重用用户认证一样。

这意味着传入的请求被重定向到登录页面,该页面是ReadAsync<>无法解析的text/html响应。 这是一个愚蠢的错误,但不容易发现。

在这种情况下的解决方案是删除用户身份验证并为api实现基于HMAC的身份验证。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM