C 後台post請求常用的兩種方式

2021-10-09 07:05:34 字數 4312 閱讀 8120

首先建立乙個httpwebrequest,並且宣告請求方法和請求頭

程式使用http協議和伺服器互動主要是進行資料的提交,通常資料的提交是通過 get 和 post 兩種方式來完成,

然後,我們需要進行拼接引數,這種請求方式,提交的資料按照 key1=val1&key2=val2 的方式進行編碼,key 和 val 都進行了 url 轉碼。大部分服務端語言都對這種方式有很好的支援,這裡使用foreach進行迴圈拼接

stringbuilder parastrbuilder = new stringbuilder();

foreach (string key in postparameters.keys)

string para = parastrbuilder.tostring();

if (para.endswith("&"))

para = para.remove(para.length - 1, 1);

接著,將引數轉為ascii碼,並且將引數寫入請求中

byte bt = encoding.utf8.getbytes(para);

string responsedata = string.empty;

request.contentlength = bt.length;

//getrequeststream 輸入流資料

using (stream reqstream = request.getrequeststream())

後面就是傳送請求,獲取響應內容

}這樣,乙個完整的post請求就完成了,還是比較簡單的

這種方式就比較麻煩了,常用於表單提交檔案資料並且包含引數的形式,我們可以先通過postman請求,看一下請求正文是什麼內容

這個是乙個附件上傳的介面,包含了附件資訊和一些引數資訊,首先宣告了請求型別是mutipart/form-data,後面跟了乙個boundary,並且內容是隨機的,緊接著又以一段隨機字串開始,宣告了第乙個引數名name=「file」,然後換了兩行,跟了檔案資訊,又是以同樣的一段的字串進行分割,拼接下一段引數資訊,這個地方多試幾遍,並且看看他的結構就能很好的寫**了

我們這裡演示兩種方式,方便大家理解,一種是引數裡不含任何檔案資訊,只有keyvalue,另一種是包含了檔案資訊且還有額外引數

首先是第一種,沒有檔案資訊

還是先建立乙個http並宣告請求頭

// 邊界符

var beginboundary = encoding.ascii.getbytes("--" + boundary + "\r\n");

// 最後的結束符

var endboundary = encoding.ascii.getbytes("--" + boundary + "--\r\n");

memstream.write(beginboundary, 0, beginboundary.length);

// 設定屬性

webrequest.method = "post";

webrequest.timeout = 10000;

webrequest.contenttype = "multipart/form-data; boundary=" + boundary;

第二行建立乙個boundary作為分割字元,然後在宣告乙個起始位置與結束位置,詳見postm請求圖中第5行和第30行,就是起始標識與結束標識,並建立乙個memorystream,不斷的寫入

然後進行引數拼接,這裡要注意上圖里,每個引數的格式

foreach (string key in postparameters.keys)

\"" +

"\r\n\r\n\r\n";

var header = string.format(stringkeyheader, key, postparameters[key]);

var headerbytes = encoding.utf8.getbytes(header);

memstream.write(headerbytes, 0, headerbytes.length);

}

每乙個content-disposition: form-data; name=""後,進行了兩次換行,才拼接了值,然後又進行了一次換行沒有檔案資訊就不拼接間隔值,繼續拼接下乙個值,在所有的值拼接完成後,加上結束標識

memstream.write(endboundary, 0, endboundary.length);
然後將拼接完成的流,重新寫入請求流中

webrequest.contentlength = memstream.length;

var requeststream = webrequest.getrequeststream();

memstream.position = 0;

var tempbuffer = new byte[memstream.length];

memstream.read(tempbuffer, 0, tempbuffer.length);

memstream.close();

requeststream.write(tempbuffer, 0, tempbuffer.length);

requeststream.close();

後面就是傳送請求,拿回響應內容

到此,不包含檔案資訊的請求就完成了

第二種,包含了檔案資訊,且也包含引數,本質上只是多了一步單獨的拼接步驟,所以這步可以放在所有的引數拼接完成後,緊接著繼續拼接檔案資訊引數,所以這一步的**,應該放在foreach之後且在foreach裡需要拼接間隔值,這裡就只放這一塊的**了,注意,如果在foreach之後還要繼續拼接引數,就不要加結束標識

const string filepartheader =

"content-disposition: form-data; name=\"file\"; filename=\"\"\r\n" +

var header1 = string.format(filepartheader, postparameters["realname"]);

var headerbytes1 = encoding.utf8.getbytes(header1);

memstream.write(headerbytes1, 0, headerbytes1.length);

memstream.write(filebyte, 0, filebyte.length);

string end = "\r\n";

headerbytes1 = encoding.utf8.getbytes(end);

memstream.write(headerbytes1, 0, headerbytes1.length);

memstream.write(endboundary, 0, endboundary.length);

先按照格式編寫引數名content-disposition: form-data; name=""; filename="" content-type: ,然後連續換兩行,寫入檔案流,在換行寫入結束標識,後面步驟就一樣,只要看懂了開始的那張圖,剩下的都是按照格式去拼接寫入就好

到此帶檔案資訊的傳參也完成了,接觸的越多,能學習的就越多,會的越多,不會的就越多,還有其他的請求方式我這裡就不在詳細介紹了,繼續加油吧!

使用Jmeter傳送post請求的兩種方式

之前我們有介紹過,常見的介面測試型別包括get型介面和post型介面。使用jmeter進行介面測試時,get型介面的引數通常寫在http請求的路徑中,可以使用使用者自定義變數和函式助手等方式進行引數化。而post型請求的引數不能隨url傳送,而是作為請求體提交給伺服器。那麼在jmeter中如何傳送p...

POST請求的兩種方式

1 在viewcontroller中的 如下 23 void viewdidload 1213 pragma mark send post 2 14 15 使用nsdata 二進位制資料 承載請求資訊,多用於上傳檔案 16 17 void sendpost2 nsstring urlstr 6162...

兩種http請求 get和post

1,定義 在客戶機與伺服器之間進行請求 響應時常用到get和post請求方法。get 從指定的資源請求資料 post 向指定的資源提交要被處理的資料 2,get請求方法 請注意,查詢字串 名稱 值對 是在get請求的url中傳送的 test demo form.asp?name1 value1 na...