【问题标题】:HTTP status code in GET Method of REST api designREST api设计的GET方法中的HTTP状态码
【发布时间】: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)    

}

现在,当我开始考虑这个函数的可能结果时。我发现了这些情况。

  1. 它成功返回所有城市作为 JSON 响应。所以我返回 200 http 状态。

  2. 城市列表为空。所以没有什么可以退货的。所以我返回 404(找不到资源)

  3. 即将返回所有城市的 JSON 响应,但 JSON 编码出现问题。现在我在这里很困惑,我该如何处理这种情况。

我的意思是你如何正确地向用户传达信息,如果

  1. 如果您的业务/应用程序逻辑出现错误/异常。
  2. 如果数据访问逻辑发现一些问题。 (说无法连接到数据库)

请你们帮我推荐一下你们在这些情况下遵循的最佳做法吗?

【问题讨论】:

  • 好吧,对于服务器端问题,您有 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 似乎不合适。

标签: rest go


【解决方案1】:
  1. 200 正确
  2. 404 可能正确;城市列表可以为空,但仍然存在。 (想一想:长度为 0 的数组仍然是数组。)您可能应该返回 200。如果您的服务器上不存在城市列表,您只会返回 404(换句话说,您的 API 可能永远不会发生这种情况)。
  3. 如果您遇到内部服务器错误,例如封送 JSON,您应该返回内部服务器错误,状态 500。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-15
    • 2013-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    相关资源
    最近更新 更多