首页 文章

使用自定义标头来响应消息;糟糕的做法?

提问于
浏览
0

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

我为什么这样做?

  • 存在我需要对象的主体但需要额外的字符串响应的情况。

  • Java 是严格键入的;如果我返回List<Object>,那么我不能返回一个额外的字符串。

  • 来自服务器的消息必须比全局异常处理程序提供的消息更具体。

为什么不这样做?

  • Spring 提供@ExceptionHandler注释以允许以不同方式处理异常,从而允许String响应。

  • 也许标题不应包含重要信息,例如错误消息。

样本GET请求

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

请求标题

  • Accept: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

  • Upgrade-Insecure-Requests:1

  • User-Agent:Mozilla/5.0(Windows NT 6.1; WOW64)AppleWebKit/537.36(KHTML,和 Gecko 一样)Chrome/50.0.2661.94 Safari/537.36

  • 状态 Code:200 确定

响应标题

  • Content-Type:application/json; charset=UTF-8

  • Date:Wed,2016 年 5 月 11 日 15:41:03 GMT

  • Expires:Wed,1969 年 12 月 31 日 19:00:00 EST Expires:-1

  • Server:Apache-Coyote/1.1

  • 服务器 Response:Successfully 检索了所有位置!

  • Transfer-Encoding:chunked

  • 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"}
]

1 回答

  • 1

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

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

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

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

相关问题