2017-02-28 154 views
0

我正在学习REST API设计中涉及的最佳实践,并编写了一个处理GET/cities HTTP/1.1查询的函数。REST API设计的GET方法中的HTTP状态代码

该函数包含的城市是一个结构数组,其中包含城市名称,多个城市的城市代码。

下面是代码

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. 如果数据访问逻辑发现一些问题。 (说连接数据库不可达)

你们可以请你帮我建议你在这些情况下遵循的最佳做法?

+1

那么,对于服务器端的问题,你有5xy状态代码。关于404如果len(城市)== 0:这看起来不对。 404是“找不到资源”,但是资源_was_ _found_,只是发生该资源不包含城市。想想“没有这样的文件'foobar'”之间的区别。“和“这是文件'foobar'的内容(但foobar恰好是空的)。” – Volker

+0

如果请求已成功处理,但响应为空,则应使用响应代码204:https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#2xx_Success –

+0

您应该使用[http常量](https:// golang .org/pkg/net/http /#pkg-constants)而不是返回码。例如:'w.WriteHeader(http.StatusOK)' – apxp

回答

1
  1. 200是正确的
  2. 404可能是正确;城市列表可以是空的,并且仍然存在。 (认为​​:0长度的数组仍然是一个数组)。您应该返回200.如果服务器上不存在城市列表,则只会返回404(换句话说,您的API可能永远不会发生这种情况)。
  3. 如果遇到一个内部服务器错误,如与编组JSON,你应该返回一个内部服务器错误,状态500