首先建立乙個httpwebrequest,並且宣告請求方法和請求頭
程式使用http協議和伺服器互動主要是進行資料的提交,通常資料的提交是通過 get 和 post 兩種方式來完成,
然後,我們需要進行拼接引數,這種請求方式,提交的資料按照 key1=val1&key2=val2 的方式進行編碼,key 和 val 都進行了 url 轉碼。大部分服務端語言都對這種方式有很好的支援,這裡使用foreach進行迴圈拼接
stringbuilder parastrbuilder = new stringbuilder();接著,將引數轉為ascii碼,並且將引數寫入請求中foreach (string key in postparameters.keys)
string para = parastrbuilder.tostring();
if (para.endswith("&"))
para = para.remove(para.length - 1, 1);
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...