HTTP POST URL query parameters—좋은 아이디어나지 않는가?[마감]

StackOverflow https://stackoverflow.com/questions/611906

  •  03-07-2019
  •  | 
  •  

문제

나는 디자인 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 개념에 대한 몇 가지 추가 견해.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top