Heim > Artikel > Web-Frontend > Vier gängige Methoden zur Übermittlung von Daten per POST
Vier gängige Methoden der POST-Übermittlung von Daten
Wir wissen, dass das HTTP-Protokoll im ASCII-Code übertragen wird und eine Spezifikation der Anwendungsschicht ist, die auf dem TCP/IP-Protokoll basiert. Die Spezifikation unterteilt HTTP-Anfragen in drei Teile: Statuszeile, Anforderungsheader und Nachrichtentext. Ähnlich wie folgt:
<method> <request-url> <version><headers> <entity-body></entity-body></headers></version></request-url></method>
Das Protokoll legt fest, dass die von POST übermittelten Daten im Nachrichtentext (Entity-Body) platziert werden müssen, das Protokoll gibt jedoch nicht an, welche Codierungsmethode die Daten verwenden verwenden muss. Tatsächlich können Entwickler das Format des Nachrichtentexts vollständig selbst bestimmen, solange die letzte gesendete HTTP-Anfrage dem oben genannten Format entspricht.
Vor dem Versenden der Daten ist es jedoch nur dann sinnvoll, wenn der Server sie erfolgreich analysiert. Allgemeine serverseitige Sprachen wie PHP, Python usw. und ihre Frameworks verfügen über integrierte Funktionen zum automatischen Parsen gängiger Datenformate. Der Server lernt normalerweise anhand des Felds „Content-Type“ im Anforderungsheader, wie der Nachrichtentext in der Anfrage codiert ist, und analysiert dann den Text. Wenn es also um das POST-Übermittlungsdatenschema geht, besteht es aus zwei Teilen: Inhaltstyp und Codierungsmethode für den Nachrichtentext. Beginnen wir mit der offiziellen Vorstellung.
application/x-www-form-urlencoded
Dies dürfte die gebräuchlichste Methode zur Übermittlung von Daten per POST sein. Wenn für das native Formular des Browsers das Attribut „enctype“ nicht festgelegt ist, werden die Daten schließlich im Modus „application/x-www-form-urlencoded“ übermittelt. Die Anfrage ähnelt der folgenden (irrelevante Anfrageheader werden in diesem Artikel weggelassen):
Content-Type: application/x-www-form-urlencoded;charset=utf-8 title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3
Erstens wird der Inhaltstyp als application/x-www-form-urlencoded angegeben; zweitens wird der übermittelte Typ angegeben Die Daten werden gemäß key1=val1&key2=val2 codiert, und sowohl key als auch val werden URL-transcodiert. Die meisten serverseitigen Sprachen unterstützen diese Methode gut. Beispielsweise kann in PHP $_POST[‘title’] den Wert von title abrufen und $_POST[‘sub’] kann das Unterarray abrufen.
Oft verwenden wir diese Methode auch bei der Übermittlung von Daten über Ajax. Beispielsweise lautet der Standardwert von Content-Type im Ajax von jquery und QWrap „application/x-www-form-urlencoded;charset=utf-8“.
multipart/form-data
Dies ist eine weitere gängige Methode zur Übermittlung von POST-Daten. Wenn wir ein Formular zum Hochladen von Dateien verwenden, muss der Enctyped des Formulars diesem Wert entsprechen. Schauen wir uns direkt ein Anfragebeispiel an:
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–
Dieses Beispiel ist etwas komplizierter. Zunächst wird eine Grenze generiert, um verschiedene Felder zu trennen. Um Duplikate mit dem Textinhalt zu vermeiden, ist die Grenze sehr lang und kompliziert. Dann gibt Content-Type an, dass die Daten mit Mutipart/Form-Data codiert sind und was der Grenzinhalt dieser Anfrage ist. Der Nachrichtentext ist entsprechend der Anzahl der Felder in mehrere Teile mit ähnlicher Struktur unterteilt. Jeder Teil beginnt mit –boundary, gefolgt von Inhaltsbeschreibungsinformationen, gefolgt von einem Wagenrücklauf und schließlich dem spezifischen Inhalt des Feldes (Text oder Binär). Wenn eine Datei übertragen wird, geben Sie auch den Dateinamen und Informationen zum Dateityp an. Der Nachrichtentext endet mit dem Flag –boundary–. Eine detaillierte Definition von Mutipart-/Formulardaten finden Sie unter rfc1867.
Diese Methode wird im Allgemeinen zum Hochladen von Dateien verwendet und wird auch von den wichtigsten Serversprachen gut unterstützt.
Die beiden oben genannten Methoden für POST-Daten werden von Browsern nativ unterstützt, und derzeit unterstützen native Formulare nur diese beiden Methoden. Da jedoch immer mehr Websites, insbesondere WebApps, Ajax für die Dateninteraktion verwenden, können wir vollständig neue Datenübermittlungsmethoden definieren, um die Entwicklung komfortabler zu gestalten.
application/json
application/json Dieser Content-Type ist als Response-Header sicherlich jedem bekannt. Tatsächlich verwenden ihn immer mehr Menschen als Anforderungsheader, um dem Server mitzuteilen, dass der Nachrichtentext eine serialisierte JSON--Zeichenfolge ist. Aufgrund der Beliebtheit der JSON-Spezifikation unterstützen alle gängigen Browser mit Ausnahme niedrigerer Versionen von IE nativ JSON.stringify. Serverseitige Sprachen verfügen auch über Funktionen zur Verarbeitung von JSON, sodass Sie bei der Verwendung von JSON keine Probleme haben.
Es ist auch nützlich, dass das JSON-Format viel komplexere strukturierte Daten unterstützt als Schlüssel-Wert-Paare. Ich erinnere mich, dass ich vor ein paar Jahren an einem Projekt gearbeitet habe und die Daten, die übermittelt werden mussten, eine sehr tiefe Ebene hatten. Ich habe die Daten in JSON serialisiert und übermittelt. Aber damals habe ich die JSON-Zeichenfolge als Wert verwendet, sie immer noch in das Schlüssel-Wert-Paar eingefügt und sie im x-www-form-urlencoded-Modus übermittelt.
Google 的 AngularJS 中的 Ajax 功能,默认就是提交 JSON 字符串。例如下面这段代码: var data = {‘title':’test’, ‘sub’ : [1,2,3]};$http.post(url, data).success(function(result) { …});
Die letzte gesendete Anfrage lautet:
Content-Type: application/json;charset=utf-8 {“title”:”test”,”sub”:[1,2,3]}
Diese Lösung kann problemlos komplexe strukturierte Daten übermitteln und eignet sich besonders für RESTful-Schnittstellen. Wichtige Paketerfassungstools wie die Chrome-eigenen Entwicklertools Firebug und Fiddler zeigen JSON-Daten in einer Baumstruktur an, was sehr benutzerfreundlich ist. Einige serverseitige Sprachen unterstützen diese Methode jedoch noch nicht. PHP kann beispielsweise keinen Inhalt aus der obigen Anfrage über das $_POST-Objekt abrufen. Zu diesem Zeitpunkt müssen Sie sich selbst darum kümmern: Wenn der Inhaltstyp im Anforderungsheader application/json ist, rufen Sie den ursprünglichen Eingabestream von php://input ab und decodieren Sie ihn dann json_decode in ein Objekt . Einige PHP-Frameworks haben bereits damit begonnen.
当然 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 会更灵活方便。
Das obige ist der detaillierte Inhalt vonVier gängige Methoden zur Übermittlung von Daten per POST. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!