multipart form data與資料封裝

2021-09-07 12:27:53 字數 2614 閱讀 2721

方案一:

將所有資料先格式化(編碼)成可讀字串,然後轉化成bytes的形式。

方案二:

將每乙個部分分別轉化成(或者直接使用)bytes的形式,然後串聯到一起。

1.使用微博開發的乙個「傳送帶微博」的介面來測試,這是介面位址,這裡面明確說明需要使用multipart/form-data格式提交。關於使用微博開放平台api、授權之類的就不說了。

注意到在content-type裡還有個boundary,顧名思義,這個東西是用來做分隔的字串。boundary本身沒有特殊要求,只要不會和其他內容混淆就好,所以盡量複雜些。

3.post請求,引數都放在請求體裡面,而請求體是這裡的關鍵,multipart/form-data就是一種格式,約定請求體的資料如何存放。放個例子先:

--wfwiewrgefa9a78512wef7106a                    //部分1

content-disposition: form-data; name="status" //部分2 哈哈哈 //部分3 --wfwiewrgefa9a78512wef7106a content-disposition: form-data; name="source" 2582981980 --wfwiewrgefa9a78512wef7106a content-disposition: form-data; name="access_token" 2.00nvejobgbvnocc54e19c4c4nksmwc --wfwiewrgefa9a78512wef7106a content-disposition: form-data; name="pic"; filename="卡車.png";content-type=image/png ...這裡是檔案的二進位制資料... //部分4 --wfwiewrgefa9a78512wef7106a-- //部分5

上面的「//部分x」是注釋哈。

(1)部分1是「--」+boundary,即雙減號加分隔符,然後換行,注意換行是使用「\r\n」,因為這些標準開始都是在html中使用的。測試了微博介面,換行也不能出錯。

(2)部分2的格式是:content-disposition: form-data; name="***",這裡的***是介面的引數,比如微博測試介面有乙個引數是「status」,那status寫在這裡。然後是兩個換行,即「\r\n\r\n」。

(3)有key就有value,上面說了key的位置,這裡就是value的位置。「status」字段代表的是微博的正文內容,所以就把微博正文內容放在部分3位置,即「哈哈哈」。然後換行。

(4)然後就是部分1、2、3這個結構重複,每乙個重複結構對應著介面裡的乙個欄位的資料。直到你要上傳的檔案,部分4。部分4這一節多出了「ilename="卡車.png";content-type=image/png」這些內容,其實這裡可以還有其他的內容可以設定,charset和content-transfer-encoding,都是用於描述這一部分資料。具體參考rfc標準。需要注意的是,name\filename是帶引號的,而content-type是沒有的,就這乙個細節,廢掉了我一下午啊!

這裡的content-type值是這裡要上傳檔案的格式,也不能錯。

(5)部分4這裡是需要上傳的檔案的二進位制資料,當然其他部分也是同樣是要轉成nsdata的。

(6)最後部分5是結束標識,--wfwiewrgefa9a78512wef7106a這部分是和前面的分割符一樣,但接下來不是換行,而是繼續「--」,整個請求體結束。這也是個坑啊,之前以為沒有「--」!

具體**如下:

nsmutabledata *postdata = [[nsmutabledata alloc]init];//請求體資料

for (nsstring *key in params) {

//迴圈引數按照部分1、2、3那樣迴圈構建每部分資料

然後根據檔案字尾名可以獲取對應的content-type,從afnetworking裡抄的:

static inline nsstring * afcontenttypeforpathextension(nsstring *extension) {

得匯入下#import 才生效。

需要注意的:

1、每個該換行的地方都不能少,也不能多,且換行為「\r\n」

2、content-type的值沒有引號

3、整個請求體是以「--」結束的。

最後是專案**:github位址。微博授權功能已經在裡面了,先授權,在測試提交。上傳後看控制台輸入,成功後可以在授權的微博賬號裡看見剛發的這條微博。

原 C 與非託管 封送和自動封送

之前說到了如何從c函式宣告通過簡單的查詢替換生成乙份c 的靜態引用宣告 c 與非託管 初體驗 因為只是簡單說明,所以全部採用的是基礎型別匹配和自動封送。自動封送雖然能省去我們不少編碼時間,但如果不理解自動封送背後的實際行為,那就如同看魔術師的黑盒子,知其然不知其所以然。而且,自動封送也不是永遠有效的...

廖雪峰python教程學習 類 例項與資料封裝小結

廖雪峰老師的python教程 物件導向最重要的內容就是類 class 類是抽象的模板,後面緊接著是類名,緊接著是 object 表示其是從哪個類上繼承上來的,沒有合適的繼承物件,就選擇object 所有類最終都會繼承的類 class student object pass在定義class時,可以通過...

CRL校驗與OCSP套封

如果你的證書是cer格式的,可以先格式轉換成pem格式,然後繼續使用openssl命令列,開啟這個pem格式的證書。檢視證書可以看到很多的資訊,如伺服器公鑰,使用的簽名演算法等,我們要尋找的是它的crl分發點,即找到crl distribution points 然後我們用crl子命令來開啟這個cr...