【发布时间】: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对象,其中包含您喜欢的所有文件,它可以像 stackoverflow.com/questions/12806386/… 等所有内容的容器一样工作 -
谢谢;这正是我想要的。我希望我在一年前就知道这一点。
标签: java spring api rest spring-mvc