2013-04-22 1 views
3

저는 Sinatra와 함께 Ruby에서 RESTful 웹 응용 프로그램을 개발 중입니다. 그것은 CRUD 작업을 지원해야하고, 나는 데이터의 형식을 다음과 같은 기능이 요청이 지정된 내용에 따라 한 요청 읽기 응답 :406 이상 406 (http 상태 코드)

def handleResponse(data, haml_path, haml_locals) 
    case true 
    when request.accept.include?("application/json") #JSON requested 
    return data.to_json 
    when request.accept.include?("text/html") #HTML requested 
    return haml(haml_path.to_sym, :locals => haml_locals, :layout => !request.xhr?) 
    else # Unknown/unsupported type requested 
    return 406 # Not acceptable 
    end 
end 

을 만 나는 else 성명에서 수행하는 것이 가장 좋습니다 모르는를 . 가장 큰 문제는 브라우저와 jQuery AJAX가 */*을 수용하므로 기술적으로 406 오류가 가장 좋은 아이디어는 아님을 의미합니다. 그러나 : 나는 무엇을 보낼 까? 나는 의미가없는 data.to_s을 할 수 있었다. HAML이 반환하는 것을 보낼 수는 있지만, 그들은 text/html을 요구하지 않았습니다. 나는 그걸 어떻게 든 알리고 싶습니다.

두 번째로 406 코드를 사용하는 것이 올바른 방법이라고 가정하면 W3 spec에 따라 응답을 유효한 형식으로 지정하려면 어떻게해야합니까?

HEAD 요청이 아닌 한, 응답에는 사용자 또는 사용자 에이전트가 가장 적합한 것을 선택할 수있는 사용 가능한 엔터티 특성 및 위치의 목록을 포함하는 엔터티가 포함되어야합니다 (SHOULD). 엔티티 형식은 Content-Type 헤더 필드에 지정된 미디어 유형으로 지정됩니다. 사용자 에이전트의 형식과 능력에 따라, 가장 적절한 선택의 선택은 자동적으로 수행 될 수있다. 그러나이 규격은 그러한 자동 선택을위한 표준을 정의하지 않는다.

답변

2

리턴 할 수있는 모든 데이터 유형에 대해 클리어링 하우스 메소드를 수행하는 것처럼 보이지만 API 사용자에게는 혼란 스러울 수 있습니다. 대신 특정 URL이 항상 동일한 데이터 유형을 반환한다는 것을 알아야합니다.

사내 REST API의 경우 문서 용으로 HTML을 반환하는 특정 URL과 데이터 용 JSON을 반환하는 URL을 만듭니다. 사용자가 스트림을 가로 지르면 개발 단계에서이를 수행하고 예상치 못한 데이터를 얻고 수정하게됩니다.

난 당신이 쓰고있어 같은 것을 사용했다, 그들은 'application/json'을 처리 할 수 ​​'text/html'을 처리 할 수없는, 내가 'text/plain'을 반환하고 data.to_s을 보내고 그들에게 혼란을 분류하게하세요. JSON과 HTML은 이제 꽤 잘 정립 된 표준입니다.


다음은 Setting Sinatra response headers의 문서입니다.

+0

좋은 답변입니다. 서버에서 406 에러를 완벽하게 구현할 수 있으므로 데이터가 아닌'text/plain'에 오류 메시지를 보낼 수 있습니다. 이것은 최상의 해결책 일 수 있습니다. 허용되는 유형의 목록을 포함하도록 응답을 어떻게 작성해야하는지 알려주실 수 있습니까? – MarioDS

+0

이전 버전에 대한 답을 롤백하는 것이 좋습니다. '406'이 틀린 경우 '405'는 HTTP 메소드와 관련되어서 더 나쁩니다. 'GET','POST' 등 ... – MarioDS

+0

롤백. 사용할 수있는 유형의 목록은 헤더가 될 것이며 Sinatra 문서는 추가 헤더 컨텐트를 만드는 방법을 보여줍니다. –