【发布时间】:2017-02-28 08:47:20
【问题描述】:
我正在学习 REST API 设计中涉及的最佳实践,并编写了一个处理 GET /cities HTTP/1.1 查询的函数。
此函数包含城市,它是一个结构数组,包含多个城市的城市名称、城市代码。
下面是代码
func FindCitiesHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json;charset=UTF-8")
if len(cities) == 0 {
w.WriteHeader(404)
return
}
if err := json.NewEncoder(w).Encode(cities); err != nil {
/* what to do here? */
}
w.WriteHeader(200)
}
现在,当我开始考虑这个函数的可能结果时。我发现了这些情况。
它成功返回所有城市作为 JSON 响应。所以我返回 200 http 状态。
城市列表为空。所以没有什么可以退货的。所以我返回 404(找不到资源)
即将返回所有城市的 JSON 响应,但 JSON 编码出现问题。现在我在这里很困惑,我该如何处理这种情况。
我的意思是你如何正确地向用户传达信息,如果
- 如果您的业务/应用程序逻辑出现错误/异常。
- 如果数据访问逻辑发现一些问题。 (说无法连接到数据库)
请你们帮我推荐一下你们在这些情况下遵循的最佳做法吗?
【问题讨论】:
-
好吧,对于服务器端问题,您有 5xy 状态码。关于 404 if len(cities)==0: 这似乎是错误的。 404 是“resource not found”,但是资源was found,恰好资源不包含城市。想想“没有这样的文件'foobar'”之间的区别。和“这是文件 'foobar' 的内容(但 foobar 恰好是空的)。”
-
如果请求处理成功但响应为空,则应使用响应代码 204:en.wikipedia.org/wiki/List_of_HTTP_status_codes#2xx_Success
-
您应该使用http constants 而不是返回码。示例:
w.WriteHeader(http.StatusOK) -
谢谢大家@volker。实际上对于404代码。只是一个扩展的问题。假设如果我通过代码搜索一个城市并且没有找到它。那么返回的http代码应该是什么?
-
@Neeraj 假设您执行 GET /api/cities/31022 并且没有超过 404 的 Dudley 就可以了。如果您执行 GET /api/cities?filterByCode=31022 比 404 似乎不合适。