POST 데이터 제출의 네 가지 일반적인 방법
우리는 HTTP 프로토콜이 ASCII 코드로 전송되며 TCP/IP 프로토콜을 기반으로 하는 애플리케이션 계층 사양이라는 것을 알고 있습니다. 사양은 HTTP 요청을 상태 줄, 요청 헤더 및 메시지 본문의 세 부분으로 나눕니다. 다음과 유사합니다.
<method> <request-url> <version><headers> <entity-body></entity-body></headers></version></request-url></method>
프로토콜은 POST로 제출된 데이터가 메시지 본문(엔티티-본문)에 배치되어야 한다고 규정하지만 프로토콜은 데이터가 사용해야 하는 인코딩 방법을 지정하지 않습니다. 실제로 전송된 마지막 HTTP 요청이 위 형식을 충족하는 한 개발자는 메시지 본문의 형식을 스스로 완전히 결정할 수 있습니다.
그러나 데이터가 전송되기 전에 서버가 데이터를 성공적으로 구문 분석하는 경우에만 의미가 있습니다. php, python 등과 같은 일반적인 서버측 언어와 해당 프레임워크에는 일반적인 데이터 형식을 자동으로 구문 분석하는 기능이 내장되어 있습니다. 서버는 일반적으로 요청 헤더의 Content-Type 필드를 기반으로 요청의 메시지 본문이 인코딩되는 방식을 학습한 다음 본문을 구문 분석합니다. 따라서 POST 제출 데이터 체계에는 콘텐츠 유형과 메시지 본문 인코딩 방법이라는 두 부분이 포함됩니다. 본격적으로 소개를 시작하겠습니다.
application/x-www-form-urlencoded
이것은 POST를 통해 데이터를 제출하는 가장 일반적인 방법입니다. 브라우저의 기본 양식의 경우 enctype 속성이 설정되지 않으면 결국 데이터는 application/x-www-form-urlencoded 모드로 제출됩니다. 요청은 다음과 유사합니다(이 문서에서는 관련 없는 요청 헤더가 생략됨).
Content-Type: application/x-www-form-urlencoded;charset=utf-8 title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
첫 번째, Content-Type은 application/x-www-form-urlencoded로 지정됩니다. 두 번째로 제출된 데이터는 key1을 따릅니다. =val1&key2= val2가 인코딩되고 키와 값이 모두 URL 트랜스코딩됩니다. 대부분의 서버측 언어는 이 방법을 잘 지원합니다. 예를 들어, PHP에서 $_POST['title']은 title의 값을 얻을 수 있고 $_POST['sub']는 하위 배열을 얻을 수 있습니다.
Ajax를 사용하여 데이터를 제출할 때 이 방법도 사용하는 경우가 많습니다. 예를 들어 jquery 및 QWrap의 Ajax에서 Content-Type의 기본값은 "application/x-www-form-urlencoded;charset=utf-8"입니다.
multipart/form-data
이것은 또 다른 일반적인 POST 데이터 제출 방법입니다. 파일을 업로드하기 위해 양식을 사용할 때 양식의 암호화된 형식은 이 값과 동일해야 합니다. 요청 예시를 직접 살펴보겠습니다.
Content-Type:multipart/form-data; boundary=—-WebKitFormBoundaryrGKCBY7qhFd3TrwA ——WebKitFormBoundaryrGKCBY7qhFd3TrwAContent-Disposition: form-data; name=”text” title——WebKitFormBoundaryrGKCBY7qhFd3TrwAContent-Disposition: form-data; name=”file”; filename=”chrome.png”Content-Type: image/png PNG … content of chrome.png …——WebKitFormBoundaryrGKCBY7qhFd3TrwA–
이 예시는 좀 더 복잡합니다. 먼저, 텍스트 내용과의 중복을 피하기 위해 경계를 생성하여 서로 다른 필드를 구분합니다. 그런 다음 Content-Type은 데이터가 mutipart/form-data로 인코딩되고 이 요청의 경계 내용이 무엇인지 지정합니다. 메시지 본문은 필드 수에 따라 유사한 구조를 가진 여러 부분으로 나뉩니다. 각 부분은 –boundary로 시작하고 내용 설명 정보, 캐리지 리턴, 마지막으로 필드의 특정 내용(텍스트 또는 바이너리)이 옵니다. 파일을 전송하는 경우 파일 이름과 파일 형식 정보도 포함되어야 합니다. 메시지 본문은 –boundary– 플래그로 끝납니다. mutipart/form-data에 대한 자세한 정의를 보려면 rfc1867을 참조하세요.
이 방법은 일반적으로 파일을 업로드하는 데 사용되며 주요 서버 언어에서도 이를 잘 지원합니다.
위에서 언급한 POST 데이터의 두 가지 방법은 브라우저에서 기본적으로 지원되며, 현 단계에서 기본 형식은 이 두 가지 방법만 지원합니다. 그러나 점점 더 많은 웹 사이트, 특히 WebApp이 데이터 상호 작용을 위해 Ajax를 사용함에 따라 우리는 개발에 더 많은 편의를 제공하기 위해 새로운 데이터 제출 방법을 완전히 정의할 수 있습니다.
application/json
application/json 이 Content-Type은 확실히 모든 사람에게 응답 헤더로 친숙합니다. 실제로 점점 더 많은 사람들이 메시지 본문이 직렬화된 JSON
string임을 서버에 알리기 위해 요청 헤더로 사용하고 있습니다. JSON 사양의 인기로 인해 IE 하위 버전을 제외한 모든 주요 브라우저는 기본적으로 JSON.stringify를 지원합니다. 서버 측 언어에도 JSON을 처리하는 기능이 있으므로 JSON을 사용할 때 문제가 발생하지 않습니다. JSON 형식이 키-값 쌍보다 훨씬 더 복잡한 구조화된 데이터를 지원한다는 점도 유용합니다. 몇 년 전 프로젝트를 진행했을 때 제출해야 할 데이터의 수준이 매우 깊어서 JSON으로 직렬화해서 제출했던 기억이 납니다. 하지만 당시에는 JSON 문자열을 val로 사용하고 여전히 키-값 쌍에 배치하고 x-www-form-urlencoded 모드로 제출했습니다.
Google 的 AngularJS 中的 Ajax 功能,默认就是提交 JSON 字符串。例如下面这段代码: var data = {‘title':’test’, ‘sub’ : [1,2,3]};$http.post(url, data).success(function(result) { …});
보내진 최종 요청은 다음과 같습니다.
Content-Type: application/json;charset=utf-8 {“title”:”test”,”sub”:[1,2,3]}
이 솔루션은 복잡한 구조의 데이터를 쉽게 제출할 수 있으며 특히 RESTful 인터페이스에 적합합니다. Chrome의 자체 개발자 도구인 Firebug, Fiddler와 같은 주요 패킷 캡처 도구는 JSON 데이터를 트리 구조로 표시하므로 매우 친숙합니다. 그러나 일부 서버측 언어는 아직 이 방법을 지원하지 않습니다. 예를 들어, PHP는 $_POST 객체를 통해 위 요청에서 콘텐츠를 얻을 수 없습니다. 이때는 직접 처리해야 합니다. 요청 헤더의 Content-Type이 application/json인 경우
php://input에서 원본 입력 스트림을 가져온 다음 이를 객체로 json_decode합니다. 일부 PHP 프레임워크에서는 이미 이 작업을 시작했습니다.
当然 AngularJS 也可以配置为使用 x-www-form-urlencoded 方式提交数据。如有需要,可以参考这篇文章。
text/xml
我的博客之前提到过 XML-RPC(XML Remote Procedure Call)。它是一种使用 HTTP 作为传输协议,XML 作为编码方式的远程调用规范。典型的 XML-RPC 请求是这样的:
Content-Type: text/xml <!–?xml version=”1.0″?–><methodcall> <methodname>examples.getStateName</methodname> <params> <param> <value><i4>41</i4></value> </params></methodcall>
XML-RPC 协议简单、功能够用,各种语言的实现都有。它的使用也很广泛,如 WordPress 的 XML-RPC Api,搜索引擎的 ping 服务等等。JavaScript 中,也有现成的库支持以这种方式进行数据交互,能很好的支持已有的 XML-RPC 服务。不过,我个人觉得 XML 结构还是过于臃肿,一般场景用 JSON 会更灵活方便。
위 내용은 POST를 통해 데이터를 제출하는 네 가지 일반적인 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!