为响应消息使用自定义标头;不好的做法?

Posted

技术标签:

【中文标题】为响应消息使用自定义标头;不好的做法?【英文标题】:Using Custom Headers for Response Messages; Bad Practice? 【发布时间】:2016-09-07 03:47:05 【问题描述】:

我正在使用 Java 和 Spring Framework 开发 REST API。目前,我在名为Server-Response 的自定义HTTP 标头中从服务器返回一条消息。这用于发生错误和成功请求完成的两种情况。 为此目的使用自定义 HTTP 标头是一种不好的做法吗?

我为什么要这样做?

存在我需要对象的主体但需要额外的字符串响应的情况。 Java 是严格类型的;如果我返回一个List<Object>,那么我不能返回一个额外的字符串。 来自服务器的消息必须比全局异常处理程序提供的更具体。

为什么不这样做?

Spring 提供了一个@ExceptionHandler 注释以允许以不同方式处理异常,从而允许一个String 响应。 可能标头不应包含错误消息等重要信息。

示例GET请求

我可以从以下示例 URL 中获取位置列表:https://fakeurl.com/api/locations

请求标头

接受:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,/;q=0.8 Accept-Encoding:gzip, deflate, sdch Accept-Language:en-US,en;q=0.8 Cache-Control:no-cache Connection:keep-alive 升级不安全请求:1 用户代理:Mozilla/5.0(Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/50.0.2661.94 Safari/537.36 状态码:200 OK

响应标头

Content-Type:application/json;charset=UTF-8 日期:2016 年 5 月 11 日,星期三 格林威治标准时间 15:41:03 到期时间:1969 年 12 月 31 日星期三 19:00:00 EST 到期时间:-1 服务器:Apache-Coyote/1.1 服务器响应:成功检索到所有位置! 传输编码:分块 X-Powered-By:Servlet 2.5; JBoss-5.0/JBossWeb-2.1

响应正文

[
    "locId":1,"descr":"New York","activeStatus":"ACTIVE",
    "locId":2,"descr":"Los Angelas","activeStatus":"ACTIVE",
    "locId":3,"descr":"Canada","activeStatus":"ACTIVE",
    "locId":4,"descr":"Mexico","activeStatus":"ACTIVE",
    "locId":5,"descr":"Nebraska","activeStatus":"ACTIVE",
    "locId":6,"descr":"Texas","activeStatus":"ACTIVE",
    "locId":7,"descr":"Michigan","activeStatus":"ACTIVE"
]

【问题讨论】:

没有明确的答案,但标头不是响应。是元数据。您始终可以返回一个自定义的 Response 对象,其中包含您喜欢的所有文件,它可以像 ***.com/questions/12806386/… 等所有内容的容器一样工作 谢谢;这正是我想要的。我希望我在一年前就知道这一点。 【参考方案1】:

TL/DR:这取决于您的实际使用情况。

这实际上取决于您如何处理在自定义标头中传递的信息。如果您想在 enveloppe 级别传递信息,则使用自定义标头是有意义的。我的意思是,此信息与您要检索的数据无关,因此不应存储在那里,而是由封装工具使用。一个现实世界的例子是可以通过不同协议访问的数据服务器,比如 HTTP,例如邮件(用另一封邮件回复)和专用协议。在这种情况下,应在 enveloppe 级别传递有关无法访问实际服务器的原因或方式的信息,并且将特别调整自定义响应标头。

另一个例子是当您使用相同的工具访问不同的信息类型时。有效负载应该只包含实际信息,这些信息会透明地传递给调用者,错误条件可以在响应头中传递,并由交换工具处理。

您应该遵守的唯一规则是自定义标头应以 X- 开头。

【讨论】:

以上是关于为响应消息使用自定义标头;不好的做法?的主要内容,如果未能解决你的问题,请参考以下文章

在“呈现为 JSON”之后添加自定义标头以响应

为自定义响应标头创建 wsdl

AJAX 使用 CORS 获取自定义响应标头

transformResponse 标头参数 ($resource) 中缺少自定义响应的标头

在响应中的每个获取请求之前附加自定义标头

JQuery、CORS 和自定义响应标头