HTTP POST URL query parameters—좋은 아이디어나지 않는가?[마감]
문제
나는 디자인 API 를 통해 갈 HTTP 와 나를 사용하는 경우 HTTP POST 명령하지만,URL 쿼리 매개변수만 없 request body,좋은 방법입니다.
고려 사항:
- "좋은 웹 디자인"필요 비 멱등 작업을 통해 전송되는 게시물입니다.이것은 비 나무 등의 작업입니다.
- 그것은 쉽게 개발하고 디버깅 이 때 응용 프로그램 요청의 매개변수가 존재합니다.
- API 를 위해 예정되지 않는 광범위하게 사용.
- 는 것 같아 만드는 게시물을 요청 없이 몸에 걸릴 것입니다 좀 더 작품,예를 들어,a
Content-Length: 0
헤더에 명시적으로 추가해야 합니다. - 그것은 또한 나에게 보인다는 게시물이 없는 몸이 비트 카운터는 대부분의 개발자와 HTTP 프레임워크의 기대입니다.
이 있는 더 많은 함정 또는 장점을 보내는 매개변수에 POST 요청을 통해 URL 에 쿼리를 보다는 오히려 request body?
편집:이를 고려하여 작업하지 않은 나무 등과 부작용이 다른 것보다 불러올 수 있습니다.보 HTTP spec:
특히,이 협약되었습 설립 GET 고 머리 방법이 없 의 중요성을 복용하는 활동은 다른 이 검색 등이 있다.이러한 방법을 해야하는 다"안전"으로 간주 됩니다.이로써 사용자 에이전트를 나타내는 다른 방법 등 POST,PUT 및 삭제,에 특별한 방법으로,그래서 그 사용자가 만든 사실 알고 있다는 가능성 안전하지 않은 행동이 적용될 수 있습니다
...
방법은 있을 수도 있습의 재산 "idempotence"에는(옆에서 오류 또는 만료 문제이) 의 부작용 N>0 일 요청과 동일한 단일 요청을 합니다.방법 GET,HEAD,PUT 과 삭제한 공유 이용하실 수 있습니다.또한, 방법 옵션 및 추적야 부작용이 없고 그래서는 본질적으로 나무 등.
해결책
당신의 행동이 Idempotent가 아니라면, 당신은 당신입니다 해야 하다 사용 POST
. 그렇지 않다면, 당신은 단지 라인 아래로 문제를 요구합니다. GET
, PUT
그리고 DELETE
방법은 필수의 Idempotent. 클라이언트가 가능한 모든 것을 미리 가져 오면 신청서에서 어떤 일이 일어날 지 상상해보십시오. GET
서비스 요청 - 이것이 클라이언트에게 부작용을 유발할 경우 문제가 잘못됩니다.
나는 a를 보내는 것에 동의한다 POST
쿼리 문자열이지만 신체가없는 것은 이상하게 보이지만 어떤 상황에서는 적절할 수 있다고 생각합니다.
현재 요청의 범위를 제한하기 위해 URL의 쿼리 부분을 리소스의 명령으로 생각하십시오. 일반적으로 쿼리 문자열은 정렬하거나 필터링하는 데 사용됩니다. GET
요청 (같은 ?page=1&sort=title
) 그러나 나는 그것이 의미가 있다고 생각합니다 POST
또한 범위를 제한합니다 (아마도 ?action=delete&id=5
).
다른 팁
모든 사람이 옳습니다 : 비 혹독한 요청에 대한 게시물을 고수하십시오.
URI 쿼리 문자열과 요청 컨텐츠를 모두 사용하는 것은 어떻습니까? 유효한 HTTP (주 1 참조)이므로 그렇지 않습니까?
또한 완벽하게 논리적입니다. 쿼리 문자열 부분을 포함한 URL은 찾기 자원. 반면 HTTP 메소드 동사 (Post- 및 선택적 요청 컨텐츠)는 동작을 지정하거나 무엇을 해야하는지 자원. 그것들은 직교 문제가되어야합니다. (그러나 그들은 ContentType = Application/X-WWW-FORM-URLENCODED의 특별한 경우에 대해 아름답게 직교적인 우려가 아닙니다. 아래 참고 2를 참조하십시오.)
참고 1 : HTTP 사양 (1.1)은 쿼리 매개 변수와 컨텐츠가 게시물 또는 요청을 허용하는 HTTP 서버에 대해 상호 배타적이라고 말하지 않습니다. 따라서 모든 서버는 둘 다 자유롭게 수락 할 수 있습니다. 즉, 서버를 작성하면 두 가지를 수락하기로 선택한 것을 중지 할 것이 없습니다 (융통성없는 프레임 워크 제외). 일반적으로 서버는 원하는 규칙에 따라 쿼리 문자열을 해석 할 수 있습니다. 컨텐츠 유형과 같은 다른 헤더를 지칭하는 조건부 논리로 해석 할 수도 있습니다.
참고 2 : a 웹 브라우저 사람들이 웹 응용 프로그램에 액세스하는 주요 방법이며 Application/x-www-form-urlencoded 그들이 게시하는 콘텐츠 유형, 그리고 당신은 당신입니다 ~해야 한다 해당 컨텐츠 유형의 규칙을 따르십시오. 그리고 응용 프로그램/x-www- 형태의 방어구 규칙은 훨씬 더 구체적이며 솔직하고 비정상적입니다.이 경우 URI를 리소스 위치가 아닌 일련의 매개 변수로 해석해야합니다. [이것은 유용한 유용성의 지점입니다. 웹 양식을 사용하여 컨텐츠를 서버에 게시하기가 어려울 수 있습니다. 조금 다르게 설명했습니다.
참고 3 : 원래 쿼리 문자열은 무엇입니까? RFC 3986 HTTP 쿼리 문자열을 리소스를 찾는 비 계층 적 방법으로 작동하는 URI 부분으로 정의합니다.
이 질문을하는 독자가 좋은 편안한 아키텍처가 무엇인지 묻고 자하는 경우 : RESTFUL ARDUCTUCE 패턴은 URI 체계가 특정한 방식으로 작동하도록 요구하지 않습니다. 편안한 아키텍처는 자원의 캐시 가능성, 자원 자체의 디자인 (그들의 행동, 기능 및 표현)과 같은 시스템의 다른 속성과 관련이 있습니다. 즉, HTTP 프로토콜과 HTTP 메소드 동사 세트와 호환되는 디자인을 달성합니다. :-) (다시 말해, 편안한 아키텍처 위치.)
최종 참고 : 때때로 쿼리 매개 변수는 리소스를 찾거나 컨텐츠를 인코딩하지 않는 다른 것들에 사용됩니다. 'put = true'또는 'post = true'와 같은 쿼리 매개 변수를 본 적이 있습니까? 이들은 Put 및 Post 메소드를 사용할 수없는 브라우저의 해결 방법입니다. 이러한 매개 변수는 URL 쿼리 문자열의 일부로 간주되지만 (와이어에서) URL 쿼리의 일부가 아니라고 주장합니다. 정신으로.
이유를 원하십니까? 여기 하나가 있습니다 :
웹 양식을 사용하여 get and post의 혼합을 사용하는 페이지로 요청을 보내는 데 사용할 수 없습니다. 얻기 위해 양식의 메소드를 설정하면 모든 매개 변수는 쿼리 문자열에 있습니다. 양식의 메소드를 게시하도록 설정하면 모든 매개 변수가 요청 본문에 있습니다.
출처 : HTML 4.01 표준, 섹션 17.13 양식 제출
프로그래밍 방식의 관점에서 클라이언트의 경우 매개 변수를 포장하고 URL에 추가하고 게시물 대 Get을 수행합니다. 서버 측에서는 게시 된 바이트 대신 쿼리 스트링에서 인바운드 매개 변수를 평가합니다. 기본적으로, 그것은 세척입니다.
특정 클라이언트 플랫폼이 Post와 함께 작동하고 네트워킹 스택에서 루틴을 얻는 방식과 웹 서버가 해당 요청을 처리하는 방식에 장점/단점이있을 수 있습니다. 구현에 따라 한 가지 접근 방식이 다른 접근 방식보다 효율적 일 수 있습니다. 그것이 당신의 결정을 여기에서 이끌어 줄 것임을 알고 있습니다.
그럼에도 불구하고, 프로그래머의 관점에서 볼 때, 본문의 모든 매개 변수가있는 게시물을 허용하거나 URL의 모든 매개 변수가있는 GET를 허용하고 게시물 요청이있는 URL 매개 변수를 명시 적으로 무시합니다. 혼란을 피합니다.
내가 생각하는 것 그것은 여전히 매우 편안하는 쿼리를 인수를 식별하는 리소스의 URL 을 유지하면서 콘텐츠 페이로드한 후 신체.이 것 같은 별도의 고려 사항"나는 무엇을 보내?"vs"내가 누구를 보내는가?".
그만큼 쉬다 캠프에는 HTTP 동사를 사용하는 방식을 표준화하는 데 사용할 수있는 몇 가지 지침 원칙이 있습니다. 이것은 당신이 할 때 Restful API를 구축 할 때 도움이됩니다.
간단히 말해서 : get은 읽어야합니다. 즉, 즉, 서버 상태에는 영향을 미치지 않습니다. 게시물은 서버에서 리소스를 만드는 데 사용됩니다. PIT는 리소스를 업데이트하거나 작성하는 데 사용됩니다. 삭제는 리소스를 삭제하는 데 사용됩니다.
다시 말해, API 조치가 서버 상태를 변경하면 REST는 Post/Put/Delete를 사용하지만 얻지 못하도록 조언합니다.
사용자 에이전트는 일반적으로 여러 게시물을 수행하는 것이 좋지 않으며 게시물의 의도는 서버 상태를 변경하는 것이기 때문에 (예 : 체크 아웃시 상품에 대한 지불), 아마도 두 번 그렇게하고 싶지 않을 것입니다!
당신이 원하는대로 자주 할 수있는 얻을 수있는 얻기 (idempotent)와 비교하십시오.
동의합니다. 신체가 아닌 URL에서 데이터를 전달하는 경우 GET 요청을 사용하는 것이 더 안전합니다. 보다 이 비슷한 질문 전체 게시물+get 개념에 대한 몇 가지 추가 견해.