2017-02-28 2 views
0

REST API 디자인과 관련된 모범 사례에 대해 배우고 GET/cities HTTP/1.1 쿼리를 처리하는 함수를 작성했습니다.GET Method of REST API 디자인의 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 (cities) == 0 : 이것은 틀린 것 같습니다. 404 "자원을 찾을 수 없습니다",하지만 자원 _was_ _found_, 그냥 자원이 도시를 포함하지 않는 일이 발생합니다. "foobar 같은 파일이 없습니다."라는 차이점을 생각해보십시오. "여기에 'foobar'파일의 내용이 있습니다 (그러나 foobar는 비어있게됩니다)." – Volker

+0

요청이 성공적으로 처리되었지만 응답이 비어있는 경우 응답 코드 204를 사용해야합니다. https://en.wikipedia.org/wiki/List_of_HTTP_status_codes#2xx_Success –

+0

[http constants] (https : // golang)를 사용해야합니다. .org/pkg/net/http/# pkg-constant)를 리턴 코드 대신 사용하십시오. 예 :'w.WriteHeader (http.StatusOK)' – apxp

답변

1
  1. 200
  2. 404 아마 올바르지이다 올; 도시 목록은 비어있을 수 있으며 여전히 존재할 수 있습니다. (길이가 0 인 배열은 여전히 ​​배열입니다.) 아마도 200을 반환해야합니다. 서버 목록에 도시 목록이 없으면 (즉, API에서는 결코 일어나지 않아야 함) 404를 반환합니다.). 당신은 JSON 마샬링과 마찬가지로 내부 서버 오류를 발생하는 경우, 당신은 내부 서버 오류를 반환해야
  3. , 상태는 500