2009-10-20 3 views
7
나는 현재 예를 들어

의 RoRrequest.format 반환 */*

내 응용 프로그램에 대한 API를 개발하고 있어요

, 나는 내가 객체를 생성하는 데 필요한 모든 정보를로드 일부 XML을 생성의이 말을하자를 사람, 그리고 사용 컬 내 응용 프로그램에 제출 나는 내가 컨트롤러에서 원하는 객체의 해시 PARAMS가 제대로

전달되고있다하지만 지금은 필요 조치를 만들 정확히 호출 할 수있어

요청이 XML로 작성되었거나되지 않은 경우 다른 동작을 적용합니다. 왜 나를 귀찮게합니까? 컨트롤러에서 request.format은을 제공합니다..

실마리가 있습니까?

curl -v -H "Content-Type: application/xml; charset=utf-8" --data-ascii @client.xml http://foo.com:3000/clients?api_key=xxx 

def create 
    logger.debug request.format # produces "*/*" 
    if request.format.xml? 
    # never gets here 
    end 
end 

답변

14

*/*는 사용자 에이전트가 모든 형식을 허용하고 당신이 그것을 줄 어떤 형식 상관하지 않는다는 것을 의미한다. 나는 사파리가 다른 사람들과 마찬가지로 이것을한다고 믿는다. 기본적으로 curl은 Accept 헤더를 */*으로 보냅니다. 여기

는 헤더 curl의 덤프는 기본적으로 보낸다 : 당신이 XML이었다에 페이로드가 보낸 경우 XML을 다시 보낼처럼

User-Agent: curl/7.18.1 (i386-apple-darwin9.6.0) libcurl/7.18.1 zlib/1.2.3 
Host: example.com 
Accept: */* 
Content-Type: 

그러나,이 경우, 그것은 보인다? 이 경우 요청의 Content-Type 헤더를 직접 확인하려고합니다. 즉, request.content_type이 원하는 방법입니다.

부칙

: 나는 이것에 대해 좀 더 생각 나는 가장 좋은 방법은 첫째와 그 결정적 체크 request.content_type 경우에만 request.format을 확인하는 것입니다 생각합니다. 본질적으로 HTTP 사양은 클라이언트에게 "나는 XML을 제공하지만 JSON을 다시 원한다"는 것을 서버에 알릴 수 있습니다. Accept 헤더는 클라이언트가 원하는 것을 사용자에게 알려주는 방법이며, 실제로 누군가가 그것을 보내면이를 존중해야합니다. 클라이언트가 지정하지 않은 경우에만 요청의 Content-Type을 힌트로 사용하십시오.

+0

브라우저? 흠, 이제 혼란 스럽네. 명령 줄을 통해 요청을 보냅니다. 브라우저 유형이 문제가되어서는 안됩니다. –

+0

예, 죄송합니다 ... 분명히하겠습니다. –

+0

이제 더 의미가 있습니다 =) 감사합니다 –

0

*/*은 모든 MIME 유형이 허용된다는 것을 의미합니다.

request.format 메서드의 코드를 보면 MIME 형식은 파일 확장명에 따라 결정되거나 해당 형식이없는 경우 HTTP 수락 헤더 값으로 결정됩니다. 따라서 Curl에 디스크에 저장된 XML 파일을 전달하거나 Curl을 사용하여 API에 요청할 때 Accept 헤더를 XML MIME 유형 (예 : text/xml)으로 설정해야합니다.

+0

왜 투표가 늦습니까? –

+0

올바르지 않습니다. 그는 ** ** XML 파일을 전달하고 있습니다. 요청의 페이로드는 request.format에 영향을 미치지 않습니다. 수동으로 감지해야합니다. request.format 메소드는 요청 된 URI의 경로 구성 요소를 사용하여 형식을 가져옵니다. 따라서 URI가 .xml로 끝나면 예상 값을 얻습니다. 그러나 여러 Content-Type을 처리하는 단일 API 엔드 포인트를 제공하는 것이 목표라면 도움이되지 않습니다. –

+0

현재 application/xml로 콘텐츠 유형을 사용하고 text/xml로 변경했으며 동일한 request.format (*/*)을 계속 생성합니다. curl에 전달 된 파일이 디스크 –