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

时间:2016-05-11 15:57:47

标签: java spring api rest spring-mvc

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

为什么我这样做?

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

为什么不这样做?

  • Spring提供@ExceptionHandler注释,以允许异常处理,允许String响应。
  • 也许标题不应包含重要信息,例如错误消息。
  

示例获取请求

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

请求标题

  • 接受:text / html的,应用/ XHTML + xml的,应用/ XML; Q = 0.9,图像/ WEBP, / 的; Q = 0.8
  • 接受编码:gzip,deflate,sdch接受语言:en-US,en; q = 0.8
  • 缓存控制:无缓存连接:keep-alive
  • 升级不安全-要求:1
  • User-Agent:Mozilla / 5.0(Windows NT 6.1; WOW64)AppleWebKit / 537.36(KHTML,像Gecko)Chrome / 50.0.2661.94 Safari浏览器/ 537.36
  • 状态代码:200 OK

响应标题

  • 内容类型:应用/ JSON;字符集= UTF-8
  • 日期:2016年5月11日星期三 格林尼治标准时间15:41:03
  • 到期日:1969年12月31日星期三美国东部时间19:00:00到期:-1
  • 服务器:Apache-狼/ 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"}
]

1 个答案:

答案 0 :(得分:1)

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

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

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

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