新聞中心
求教golang中http發(fā)送post請求gb2312編碼的解決方案
如果你使用的是httpclient,可是使用下面的方法發(fā)送gb2312數(shù)據(jù), HttpPost httpRequest = new HttpPost(url); httpRequest.setEntity(new UrlEncodedFormEntity(pairs, "gb2312"));
成都創(chuàng)新互聯(lián)不只是一家網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司;我們對營銷、技術(shù)、服務(wù)都有自己獨特見解,公司采取“創(chuàng)意+綜合+營銷”一體化的方式為您提供更專業(yè)的服務(wù)!我們經(jīng)歷的每一步也許不一定是最完美的,但每一步都有值得深思的意義。我們珍視每一份信任,關(guān)注我們的網(wǎng)站設(shè)計、網(wǎng)站制作質(zhì)量和服務(wù)品質(zhì),在得到用戶滿意的同時,也能得到同行業(yè)的專業(yè)認(rèn)可,能夠為行業(yè)創(chuàng)新發(fā)展助力。未來將繼續(xù)專注于技術(shù)創(chuàng)新,服務(wù)升級,滿足企業(yè)一站式成都全網(wǎng)營銷推廣需求,讓再小的品牌網(wǎng)站設(shè)計也能產(chǎn)生價值!
GET 和 POST 請求的優(yōu)缺點
(1)post更安全(不會作為url的一部分,不會被緩存、保存在服務(wù)器日志、以及瀏覽器瀏覽記錄中)
(2)post發(fā)送的數(shù)據(jù)更大(get有url長度限制)
(3)post能發(fā)送更多的數(shù)據(jù)類型(get只能發(fā)送ASCII字符)
(4)post比get慢
(5)post用于修改和寫入數(shù)據(jù),get一般用于搜索排序和篩選之類的操作
(6)get請求的是靜態(tài)資源,則會緩存,如果是數(shù)據(jù),則不會緩存
1.post請求包含更多的請求頭
因為post需要在請求的body部分包含數(shù)據(jù),所以會多了幾個數(shù)據(jù)描述部分的首部字段(如:content-type),這其實是微乎其微的。
2.最重要的一條,post在真正接收數(shù)據(jù)之前會先將請求頭發(fā)送給服務(wù)器進(jìn)行確認(rèn),然后才真正發(fā)送數(shù)據(jù)
(1)瀏覽器請求tcp連接(第一次握手)
(2)服務(wù)器答應(yīng)進(jìn)行tcp連接(第二次握手)
(3)瀏覽器確認(rèn),并發(fā)送post請求頭(第三次握手,這個報文比較小,所以http會在此時進(jìn)行第一次數(shù)據(jù)發(fā)送)
(4)服務(wù)器返回100 Continue響應(yīng)
(5)瀏覽器發(fā)送數(shù)據(jù)
(6)服務(wù)器返回200 OK響應(yīng)
(1)瀏覽器請求tcp連接(第一次握手)
(2)服務(wù)器答應(yīng)進(jìn)行tcp連接(第二次握手)
(3)瀏覽器確認(rèn),并發(fā)送get請求頭和數(shù)據(jù)(第三次握手,這個報文比較小,所以http會在此時進(jìn)行第一次數(shù)據(jù)發(fā)送)
(4)服務(wù)器返回200 OK響應(yīng)
也就是說,目測get的總耗是post的2/3左右,這個口說無憑,網(wǎng)上已經(jīng)有網(wǎng)友進(jìn)行過測試。
(1)http協(xié)議并未規(guī)定get和post的長度限制
(2)get的最大長度限制是因為瀏覽器和web服務(wù)器限制了URL的長度
(3)不同的瀏覽器和web服務(wù)器,限制的最大長度不一樣
(4)要支持IE,則最大長度為2083byte,若支持Chrome,則最大長度8182byte
golang request.go中PostForm和Form區(qū)別
上面是從源碼復(fù)制得出。
Form屬性包含了post表單和url后面跟的get參數(shù)。
PostForm屬性只包含了post表單參數(shù)。
實踐數(shù)據(jù)如下:
打印請求頭:
打印Form和PostForm
客戶端打印:
POST請求的幾種content type類型
content-type是http請求的響應(yīng)頭和請求頭的字段。當(dāng)作為響應(yīng)頭時,告訴客戶端實際返回的內(nèi)容的內(nèi)容類型。作為請求頭時(post或者put),客戶端告訴服務(wù)器實際發(fā)送的數(shù)據(jù)類型。
在前端開發(fā)過程中,通常需要跟后端工程師對接接口的數(shù)據(jù)格式,不同的數(shù)據(jù)類型對于服務(wù)器來說有不同的處理方式,因此我們需要關(guān)注不同的conten-type類型.
1. application/x-www-form-urlencoded
瀏覽器原生form表單默認(rèn)的提交方式(在不設(shè)置enctype的情況下)。此時請求頭的格式如下:
content-type: application/x-www-form-urlencoded;charset=utf-8
form-data: key1=val1key2=val2
此時后端例如php可以通過$_POST["key1"]的方法來獲取參數(shù)值。
此種情況下:非字母或數(shù)字的字符會被進(jìn)行編碼(編碼方式 ),這也是為什么這種方式不支持二進(jìn)制數(shù)據(jù)的原因。
2. multipart/form-data
與application/x-www-form-urlencoded 的區(qū)別是她支持文件的傳輸,并且它的傳輸數(shù)據(jù)放在request-payload里,并且以bounday進(jìn)行分隔。
POST /test.html HTTP/1.1
Host: example.org
Content-Type: multipart/form-data;boundary="boundary"
--boundary
Content-Disposition: form-data; name="field1"
value1
--boundary
Content-Disposition: form-data; name="field2"; filename="example.txt"
value2
3. application/json
格式是這樣的:
POST HTTP/1.1
Content-Type: application/json;charset=utf-8
{"title":"test","sub":[1,2,3]}
它用來告訴服務(wù)端消息主體是 序列化后的 JSON 字符串 ,其中一個好處就是JSON 格式支持比鍵值對復(fù)雜得多的結(jié)構(gòu)化數(shù)據(jù)。此時php不能直接通過$_POST獲取,需要先從php://input里獲得原始輸入流,再json_decode成對象
4.text/plain
傳統(tǒng)的ajax請求提交
function submit2() {
var xhr = new XMLHttpRequest();
xhr.timeout = 3000;
var obj = {a: 1, b: 2};
xhr.open('POST', '/');
xhr.send(obj);
}
另外,對于axios請求,不同的請求方式content-type也不同
function submit3() {
var sence1 = 'name=123val=456';
var sence2 = {name: 123, val: 456};
axios.post('/', sence1)
}
1. 當(dāng)傳遞的是字符串的時候
2. 當(dāng)傳遞的是對象的時候
總結(jié)
1.傳統(tǒng)的ajax請求時候,Content-Type默認(rèn)為"文本"類型。
2.傳統(tǒng)的form提交的時候,Content-Type默認(rèn)為"Form"類型。
3.axios傳遞字符串的時候,Content-Type默認(rèn)為"Form"類型。
4.axios傳遞對象的時候,Content-Type默認(rèn)為"JSON"類型
本文標(biāo)題:Go語言中post請求頭 go語言發(fā)送post請求
文章出自:http://fisionsoft.com.cn/article/ddjoigc.html