HTTP POST 發送數據的參數 application/x-www-form-urlencoded、multipart/form-data、text/plain

HTTP 簡介

HTTP/1.1 協議規定的 HTTP 請求方法有 OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE、CONNECT 這幾種。

其中 POST 一般用來向服務端提交數據,本文主要討論 POST 提交數據的幾種方式。

我們知道,HTTP 協議是以?ASCII 碼傳輸,建立在 TCP/IP 協議之上的應用層規范。規范把 HTTP 請求分為三個部分:狀態行、請求頭、消息主體。類似于下面這樣:

<method> <request-URL> <version>
<headers><entity-body>

協議規定 POST 提交的數據必須放在消息主體(entity-body)中,但協議并沒有規定數據必須使用什么編碼方式。實際上,開發者完全可以自己決定消息主體的格式,只要最后發送的 HTTP 請求滿足上面的格式就可以。

但是,數據發送出去,還要服務端解析成功才有意義。一般服務端語言如 php、python 等,以及它們的 framework,都內置了自動解析常見數據格式的功能。

服務端通常是根據請求頭(headers)中的?Content-Type?字段來獲知請求中的消息主體是用何種方式編碼,再對主體進行解析。

所以說到 POST 提交數據方案,包含了 Content-Type 和消息主體編碼方式兩部分。

定義和用法

enctype 屬性規定在發送到服務器之前應該如何對表單數據進行編碼

默認地,表單數據會編碼為 "application/x-www-form-urlencoded"。就是說,在發送到服務器之前,所有字符都會進行編碼(空格轉換為 "+" 加號,特殊符號轉換為 ASCII HEX 值)。

enctype屬性值

Content-Type值描述
application/x-www-form-urlencoded在發送前編碼所有字符(默認)
multipart/form-data

不對字符編碼。

在使用包含文件上傳控件的表單時,必須使用該值。

text/plain空格轉換為 "+" 加號,但不對特殊字符編碼。

?

?

下面就正式開始介紹它們。

?

application/x-www-form-urlencoded

這應該是最常見的 POST 提交數據的方式了。瀏覽器的原生 <form> 表單,如果不設置?enctype?屬性,那么最終就會以 application/x-www-form-urlencoded 方式提交數據。

<form action="form_action.asp"><p>First name: <input type="text" name="fname" /></p><p>Last name: <input type="text" name="lname" /></p><input type="submit" value="Submit" />
</form>

此時Form提交的請求數據,抓包時看到的請求會是這樣的內容(無關的請求頭在本文中都省略掉了):

POST?http://www.example.com?HTTP/1.1
Content-Type: application/x-www-form-urlencoded;charset=utf-8title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3

首先,Content-Type 被指定為 application/x-www-form-urlencoded;其次,提交的數據按照?key1=val1&key2=val2 的方式進行編碼,key 和 val 都進行了 URL 轉碼。
大部分服務端語言都對這種方式有很好的支持。例如 PHP 中,$_POST['title'] 可以獲取到 title 的值,$_POST['sub'] 可以得到 sub 數組。

很多時候,我們用 Ajax 提交數據時,也是使用這種方式。例如?JQuery?和?QWrap?的 Ajax,Content-Type?默認值都是「application/x-www-form-urlencoded;charset=utf-8」。

multipart/form-data

這又是一個常見的 POST 數據提交的方式。我們使用表單上傳文件時,必須讓 <form> 表單的enctype?等于 multipart/form-data。直接來看一個請求示例:

POST http://www.example.com HTTP/1.1
Content-Type:multipart/form-data; boundary=----WebKitFormBoundaryrGKCBY7qhFd3TrwA------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="text"title
------WebKitFormBoundaryrGKCBY7qhFd3TrwA
Content-Disposition: form-data; name="file"; filename="chrome.png"
Content-Type: image/pngPNG ... content of chrome.png ...
------WebKitFormBoundaryrGKCBY7qhFd3TrwA--

這個例子稍微復雜點。首先生成了一個 boundary 用于分割不同的字段,為了避免與正文內容重復,boundary 很長很復雜。然后 Content-Type 里指明了數據是以 multipart/form-data 來編碼,本次請求的 boundary 是什么內容。消息主體里按照字段個數又分為多個結構類似的部分,每部分都是以?--boundary?開始,緊接著是內容描述信息,然后是回車,最后是字段具體內容(文本或二進制)。如果傳輸的是文件,還要包含文件名和文件類型信息。消息主體最后以?--boundary--?標示結束。

關于 multipart/form-data 的詳細定義,請前往?rfc1867?查看。

這種方式一般用來上傳文件,各大服務端語言對它也有著良好的支持。

上面提到的這兩種 POST 數據的方式,都是瀏覽器原生支持的,而且現階段標準中原生 <form> 表單也只支持這兩種方式(通過 <form> 元素的?enctype?屬性指定,默認為?application/x-www-form-urlencoded。其實?enctype?還支持?text/plain,不過用得非常少)。

隨著越來越多的 Web 站點,尤其是 WebApp,全部使用 Ajax 進行數據交互之后,我們完全可以定義新的數據提交方式,給開發帶來更多便利。

application/json

application/json 這個 Content-Type 作為響應頭大家肯定不陌生。實際上,現在越來越多的人把它作為請求頭,用來告訴服務端消息主體是序列化后的 JSON 字符串。由于 JSON 規范的流行,除了低版本 IE 之外的各大瀏覽器都原生支持 JSON.stringify,服務端語言也都有處理 JSON 的函數,使用 JSON 不會遇上什么麻煩。

JSON 格式支持比鍵值對復雜得多的結構化數據,這一點也很有用。記得我幾年前做一個項目時,需要提交的數據層次非常深,我就是把數據 JSON 序列化之后來提交的。不過當時我是把 JSON 字符串作為 val,仍然放在鍵值對里,以 x-www-form-urlencoded 方式提交。

Google 的?AngularJS?中的 Ajax 功能,默認就是提交 JSON 字符串。例如下面這段代碼:

JSvar data = {'title':'test', 'sub' : [1,2,3]};
$http.post(url, data).success(function(result) {...
});

最終發送的請求是:

BASHPOST http://www.example.com HTTP/1.1 
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 請求是這樣的:

HTMLPOST http://www.example.com HTTP/1.1 
Content-Type: text/xml<?xml version="1.0"?>
<methodCall><methodName>examples.getStateName</methodName><params><param><value><i4>41</i4></value></param></params>
</methodCall>

?

XML-RPC 協議簡單、功能夠用,各種語言的實現都有。它的使用也很廣泛,如 WordPress 的?XML-RPC Api,搜索引擎的?ping 服務等等。JavaScript 中,也有現成的庫支持以這種方式進行數據交互,能很好的支持已有的 XML-RPC 服務。不過,我個人覺得 XML 結構還是過于臃腫,一般場景用 JSON 會更靈活方便。

postman中 form-data、x-www-form-urlencoded、raw、binary的區別

form-data

就是http請求中的multipart/form-data,它會將表單的數據處理為一條消息,以標簽為單元,用分隔符分開。既可以上傳鍵值對,也可以上傳文件。當上傳的字段是文件時,會有Content-Type來表名文件類型;content-disposition,用來說明字段的一些信息;

由于有boundary隔離,所以multipart/form-data既可以上傳文件,也可以上傳鍵值對,它采用了鍵值對的方式,所以可以上傳多個文件。

新版本Postman在此處查看:

?

x-www-form-urlencoded:

就是application/x-www-from-urlencoded,會將表單內的數據轉換為鍵值對,比如,name=java&age = 23

raw

可以上傳任意格式的文本,可以上傳text、json、xml、html等

binary

相當于Content-Type:application/octet-stream,從字面意思得知,只可以上傳二進制數據,通常用來上傳文件,由于沒有鍵值,所以,一次只能上傳一個文件。
?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/453850.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/453850.shtml
英文地址,請注明出處:http://en.pswp.cn/news/453850.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue 二進制文件的下載(解決亂碼和解壓報錯)

問題描述&#xff1a;項目中使用的是vue框架進行開發&#xff0c;因為文件下載存在權限問題&#xff0c;所以并不能通過 a 鏈接的 href 屬性直接賦值 URL進行下載&#xff0c; &#xff08;如果你的文件沒有下載權限&#xff0c;可以直接通過href屬性賦值URL的方法進行文件下載…

Python 第三方模塊之 psutil - 獲取系統運行的進程和系統利用率信息

一、psutil模塊: 官方網址&#xff1a;http://pythonhosted.org/psutil/ 1.psutil是一個跨平臺庫(http://pythonhosted.org/psutil/)能夠輕松實現獲取系統運行的進程和系統利用率&#xff08;包括CPU、內存、磁盤、網絡等&#xff09;信息。它主要用來做系統監控&#xff0c;…

石頭機器人紅燈快閃_機器人集體“快閃”活動爆紅網絡 “我是AI”與您相約智能新時代...

原標題&#xff1a;機器人集體“快閃”活動爆紅網絡 “我是AI”與您相約智能新時代3月10日下午&#xff0c;天津科學技術館內&#xff0c;悠揚美妙的歌聲《我和我的祖國》突然響起&#xff0c;隨后50個身形矯健的阿爾法機器人伴隨著歌聲翩翩起舞&#xff0c;動作整齊、科技感十…

淺談云計算與數據中心計算

文/林仕鼎 云計算概念發端于Google和Amazon等超大規模的互聯網公司&#xff0c;隨著這些公司業務的成功&#xff0c;作為其支撐技術的云計算也得到了業界的高度認可和廣泛傳播。時至今日&#xff0c;云計算已被普遍認為是IT產業發展的新階段&#xff0c;從而被賦予了很多產業和…

無線網絡實體圖生成工具airgraph-ng

無線網絡實體圖生成工具airgraph-ngairgraph-ng是aircrack-ng套件提供的一個圖表生成工具。該工具可以根據airodump工具生成的CSV文件繪制PNG格式的圖。繪制的圖有兩種類型&#xff0c;分別為AP-客戶端關聯圖和通用探測圖。通過AP-客戶端關聯圖&#xff0c;可以更為直觀的了解無…

高等代數期末考試題庫及答案_數學類高等代數期末考試試題A卷(含答案)

數學類高等代數期末考試試題A卷(含答案)課程編號MTH17063 北京理工大學2010-2011學年第一學期2009級數學類高等代數期末考試試題A卷班級 學號 姓名 成績 一、(25分)設表示域上的所有階矩陣構成的上的線性空間。取定&#xff0c;對于任意的&#xff0c;定義。(1)證明為上的一個線…

cocos2d-lua3.7組件篇(三)-http通信demo

客戶端使用lua、服務端使用QT做為服務器。 步驟&#xff1a; 客戶端 -----------Post 用戶名和密碼 服務端接受Post請求&#xff0c;讀取數據&#xff0c;返回response一、客戶端代碼 loadingImg require"app.scenes.LoadingLayer"local LoginScene class(&qu…

數據挖掘:如何尋找相關項

導讀&#xff1a;隨著大數據時代浪潮的到來數據科學家這一新興職業也越來越受到人們的關注。本文作者Alexandru Nedelcu就將數學挖掘算法與大數據有機的結合起來&#xff0c;并無縫的應用在面臨大數據浪潮的網站之中。 數據科學家需要具備專業領域知識并研究相應的算法以分析對…

Python 第三方模塊之 selenium - 模擬操作 Chrome 瀏覽器

1、安裝selenium 1.1、Python 安裝 selenium 模塊 pip install selenium1.2、下載驅動 選擇和自己chrom版本相對應的驅動到本地&#xff0c;下載地址 http://npm.taobao.org/mirrors/chromedriver/2、Python 操作 from selenium import webdriver import time import json…

jupyter notebook代碼導出_Jupyter Notebook導出包含中文的pdf_親測有效

Jupyter Notebook是很好的數據科學創作環境&#xff0c;是非常方便的Python代碼編輯器。jupyter提供導出的格式有.py、.html、.md、.pdf等。目前用其導出包含中文的pdf會遇到很多坑&#xff0c;網上也有一些解決方案&#xff0c;大致分為兩種方式&#xff0c;一是安裝 pandoc并…

前端之使用 POST 提交數據并跳轉

GET 方式 window.location.href是我們常用來在js中實現頁面跳轉的方法&#xff0c;這是使用get方式發送請求&#xff0c;示例如下 window.location.href url;優點是簡單易用&#xff0c;缺點是如果有參數的話&#xff0c;參數會暴露在url地址中&#xff0c;這降低了系統的安…

cef js返回c++的代碼_CEF3開發者系列之外篇——IE中JS與C++交互

使用IE內核開發客戶端產品&#xff0c;系統和前端頁面之間的交互&#xff0c;通常給開發和維護帶來很大的便利性。但操作系統和前端之間的交互卻是比較復雜的。具體來說就是腳本語言和編譯語言的交互。在IE內核中html和css雖然不兼容,但是IE編程接口是完全一樣的,這得益于微軟的…

多線程編程指南 part 2

多線程編程指南Sun Microsystems, Inc.4150 Network CircleSanta Clara, CA95054U.S.A.文件號碼819–7051–102006 年10 月版權所有2005 Sun Microsystems, Inc. 4150 Network Circle, Santa Clara, CA95054 U.S.A. 保留所有權利。本文檔及其相關產品的使用、復制、分發和反編譯…

00030_ArrayList集合

1、數組可以保存多個元素&#xff0c;但在某些情況下無法確定到底要保存多少個元素&#xff0c;此時數組將不再適用&#xff0c;因為數組的長度不可變 2、JDK中提供了一系列特殊的類&#xff0c;這些類可以存儲任意類型的元素&#xff0c;并且長度可變&#xff0c;統稱為集合 3…

1.3tf的varible\labelencoder

1.tf的varible變量 import tensorflow as tf #定義變量--這里是計數的變量 statetf.Variable(0,namecounter) print (state.name) #輸出變量值 onetf.constant(1) #常量new_valuetf.add(state,one) updatetf.assign(state,new_value)#初始化所有變量 inittf.initialize_all_var…

kafka 日志相關配置

日志目錄 ${kafka.logs.dir}/server.log &#xff1a;服務器日志${kafka.logs.dir}/state-change.log&#xff1a;狀態變化日志${kafka.logs.dir}/kafka-request.log&#xff1a;請求處理日志${kafka.logs.dir}/log-cleaner.log&#xff1a;日志清理${kafka.logs.dir}/control…

linux mc服務器 mod_如何在linux搭建MC服務器

摘要&#xff1a;前言Q&#xff1a;為什么要用linux搭建MC服務器&#xff1f;A&#xff1a;因為linux系統占用率低&#xff0c;跑服務器效果非常好Q&#xff1a;看不懂linux ssh&#xff0c;后期自己無力運維怎么辦A&#xff1a;沒關系&#xff0c;這個教程是通過安裝BT...前言…

flask-SQLAlchemy 使用 session.commit() 處理異常回滾

最為原始的try/except辦法&#xff0c;多次插入數據就要寫多次&#xff0c;很麻煩&#xff0c;使用python原生的contextlib.contextmanager簡化代碼&#xff01; try:user_db User(emailself.email, nicknameself.nickname, passwordself.password)db.session.add(user_db)#所…

小米機器人清理主刷和軸承_掃地機主刷怎樣更換

原標題&#xff1a;掃地機主刷怎樣更換隨著電動掃地機逐漸取代手動清潔&#xff0c;電動掃地機的工作量不斷增加&#xff0c;從而導致主刷磨損更加嚴重&#xff0c;并增加了主刷更換的次數。因此&#xff0c;偉頓在這里告訴大家掃地機主刷怎樣更換&#xff1a;1 .首先&#xff…

多線程編程指南

1. 多線程編程指南1--線程基礎 線程編程指南1--線程基礎 Wednesday, 29. March 2006, 11:48:45 多線程 本文出自:BBS水木清華站 作者:Mccartney (coolcat) (2002-01-29 20:25:25) multithreading可以被翻譯成多線程控制。與傳統的UNIX不同&#xff0c;一個傳統 的UNIX進…