版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第C#中后臺(tái)post請(qǐng)求常用的兩種方式總結(jié)目錄1.application/x-www-form-urlencoded2.mutipart/form-data最近對(duì)接接口的時(shí)候,需要根據(jù)對(duì)方的請(qǐng)求數(shù)據(jù)類(lèi)型來(lái)進(jìn)行傳值,常用的就是application/x-www-form-urlencoded,ajax提交數(shù)據(jù)時(shí)也是使用的這種方式,但是沒(méi)辦法傳遞文件之類(lèi)的信息,另一種就是mutipart/form-data,可以同時(shí)傳遞參數(shù)與文件或二進(jìn)制流,這里主要使用的就是這兩種方式
1.application/x-www-form-urlencoded
首先創(chuàng)建一個(gè)HttpWebRequest,并且聲明請(qǐng)求方法和請(qǐng)求頭
程序使用HTTP協(xié)議和服務(wù)器交互主要是進(jìn)行數(shù)據(jù)的提交,通常數(shù)據(jù)的提交是通過(guò)GET和POST兩種方式來(lái)完成,
HttpWebRequestrequest=(HttpWebRequest)WebRequest.Create(url);
request.Method="POST";
request.ContentType="application/x-www-form-urlencoded;charset:utf-8";
然后,我們需要進(jìn)行拼接參數(shù),這種請(qǐng)求方式,提交的數(shù)據(jù)按照key1=val1key2=val2的方式進(jìn)行編碼,key和val都進(jìn)行了URL轉(zhuǎn)碼。
大部分服務(wù)端語(yǔ)言都對(duì)這種方式有很好的支持,這里使用foreach進(jìn)行循環(huán)拼接
StringBuilderparaStrBuilder=newStringBuilder();
foreach(stringkeyinpostParameters.Keys)
paraStrBuilder.AppendFormat("{0}={1}",key,postParameters[key]);
stringpara=paraStrBuilder.ToString();
if(para.EndsWith(""))
para=para.Remove(para.Length-1,1);
接著,將參數(shù)轉(zhuǎn)為ASCII碼,并且將參數(shù)寫(xiě)入請(qǐng)求中
byte[]bt=Encoding.UTF8.GetBytes(para);
stringresponseData=String.Empty;
request.ContentLength=bt.Length;
//GetRequestStream輸入流數(shù)據(jù)
using(StreamreqStream=request.GetRequestStream())
reqStream.Write(bt,0,bt.Length);
reqStream.Close();
}
后面就是發(fā)送請(qǐng)求,獲取響應(yīng)內(nèi)容
using(HttpWebResponseresponse=(HttpWebResponse)request.GetResponse())
Streamstream=response.GetResponseStream();
using(StreamReaderstreamReader=newStreamReader(stream,Encoding.UTF8))
retString=streamReader.ReadToEnd().ToString();
}
這樣,一個(gè)完整的post請(qǐng)求就完成了,還是比較簡(jiǎn)單的
2.mutipart/form-data
這種方式就比較麻煩了,常用于表單提交文件數(shù)據(jù)并且包含參數(shù)的形式,我們可以先通過(guò)postman請(qǐng)求,看一下請(qǐng)求正文是什么內(nèi)容
這個(gè)是一個(gè)附件上傳的接口,包含了附件信息和一些參數(shù)信息,首先聲明了請(qǐng)求類(lèi)型是mutipart/form-data,后面跟了一個(gè)boundary,并且內(nèi)容是隨機(jī)的,緊接著又以一段隨機(jī)字符串開(kāi)始,聲明了第一個(gè)參數(shù)名name=file,然后換了兩行,跟了文件信息,又是以同樣的一段的字符串進(jìn)行分割,拼接下一段參數(shù)信息,這個(gè)地方多試幾遍,并且看看他的結(jié)構(gòu)就能很好的寫(xiě)代碼了
我們這里演示兩種方式,方便大家理解,一種是參數(shù)里不含任何文件信息,只有keyvalue,另一種是包含了文件信息且還有額外參數(shù)
首先是第一種,沒(méi)有文件信息
還是先創(chuàng)建一個(gè)http并聲明請(qǐng)求頭
varwebRequest=(HttpWebRequest)WebRequest.Create(strUrl);
varboundary="---------------"+DateTime.Now.Ticks.ToString("x");
//邊界符
varbeginBoundary=Encoding.ASCII.GetBytes("--"+boundary+"\r\n");
//最后的結(jié)束符
varendBoundary=Encoding.ASCII.GetBytes("--"+boundary+"--\r\n");
memStream.Write(beginBoundary,0,beginBoundary.Length);
//設(shè)置屬性
webRequest.Method="POST";
webRequest.Timeout=10000;
webRequest.ContentType="multipart/form-data;boundary="+boundary;
第二行創(chuàng)建一個(gè)boundary作為分割字符,然后在聲明一個(gè)起始位置與結(jié)束位置,詳見(jiàn)postm請(qǐng)求圖中第5行和第30行,就是起始標(biāo)識(shí)與結(jié)束標(biāo)識(shí),并創(chuàng)建一個(gè)MemoryStream,不斷的寫(xiě)入
然后進(jìn)行參數(shù)拼接,這里要注意上圖里,每個(gè)參數(shù)的格式
foreach(stringkeyinpostParameters.Keys)
varstringKeyHeader="Content-Disposition:form-data;name=\"{0}\""+"\r\n\r\n{1}\r\n";
varheader=string.Format(stringKeyHeader,key,postParameters[key]);
varheaderbytes=Encoding.UTF8.GetBytes(header);
memStream.Write(headerbytes,0,headerbytes.Length);
}
每一個(gè)Content-Disposition:form-data;name=后,進(jìn)行了兩次換行,才拼接了值,然后又進(jìn)行了一次換行沒(méi)有文件信息就不拼接間隔值,繼續(xù)拼接下一個(gè)值,在所有的值拼接完成后,加上結(jié)束標(biāo)識(shí)
memStream.Write(endBoundary,0,endBoundary.Length);
然后將拼接完成的流,重新寫(xiě)入請(qǐng)求流中
webRequest.ContentLength=memStream.Length;
varrequestStream=webRequest.GetRequestStream();
memStream.Position=0;
vartempBuffer=newbyte[memStream.Length];
memStream.Read(tempBuffer,0,tempBuffer.Length);
memStream.Close();
requestStream.Write(tempBuffer,0,tempBuffer.Length);
requestStream.Close();
后面就是發(fā)送請(qǐng)求,拿回響應(yīng)內(nèi)容
using(HttpWebResponseres=(HttpWebResponse)webRequest.GetResponse())
using(StreamresStream=res.GetResponseStream())
byte[]buffer=newbyte[1024];
intread;
while((read=resStream.Read(buffer,0,buffer.Length))0)
responseContent+=Encoding.UTF8.GetString(buffer,0,read);
res.Close();
returnresponseContent;
到此,不包含文件信息的請(qǐng)求就完成了
第二種,包含了文件信息,且也包含參數(shù),本質(zhì)上只是多了一步單獨(dú)的拼接步驟,所以這步可以放在所有的參數(shù)拼接完成后,緊接著繼續(xù)拼接文件信息參數(shù),所以這一步的代碼,應(yīng)該放在foreach之后且在foreach里需要拼接間隔值,這里就只放這一塊的代碼了,注意,如果在foreach之后還要繼續(xù)拼接參數(shù),就不要加結(jié)束標(biāo)識(shí)
conststringfilePartHeader=
"Content-Disposition:form-data;name=\"file\";filename=\"{0}\"\r\n"+
"Content-Type:application/octet-stream\r\n\r\n";
varheader1=string.Format(filePartHeader,postParameters["realName"]);
varheaderbytes1=Encoding.UTF8.GetBytes(header1);
memStream.Write(headerbytes1,0,headerbytes1.Length);
memStream.Write(FileByte,0,FileByte.Length);
stringend="\r\n";
headerbytes1=Encoding.UTF8.GetBytes(end);
memStream.Write(headerbytes1,0,headerbytes1.Length);
memStream.Write(endBoundary,0,endBoundary.Length
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026云南臨滄市桑嘎藝術(shù)學(xué)校教師招聘9人筆試備考試題及答案解析
- 2026年教電工知識(shí)試題及答案參考
- 2026年湖南交通職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性考試題庫(kù)附答案
- 2026年安徽工貿(mào)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)傾向性考試模擬測(cè)試卷附答案
- 2026年廣州城建職業(yè)學(xué)院?jiǎn)握芯C合素質(zhì)考試題庫(kù)及答案1套
- 2026年山西藥科職業(yè)學(xué)院?jiǎn)握新殬I(yè)傾向性考試題庫(kù)附答案
- 2026年江蘇商貿(mào)職業(yè)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性考試題庫(kù)及答案1套
- 2026年湖南三一工業(yè)職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試模擬測(cè)試卷附答案
- 2026年廣東嶺南職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)適應(yīng)性測(cè)試模擬測(cè)試卷附答案
- 2026福建福州市倉(cāng)山區(qū)文化旅游投資集團(tuán)有限公司副總經(jīng)理崗位(職業(yè)經(jīng)理人)招聘1人筆試模擬試題及答案解析
- 預(yù)制混凝土構(gòu)件質(zhì)量控制
- 德佑房屋買(mǎi)賣(mài)合同
- 健康管理方案設(shè)計(jì)案例分析
- 2024高考英語(yǔ)應(yīng)用文寫(xiě)作真題手把手:2023全國(guó)乙卷素材
- 玻璃加工公司管理制度
- 七年級(jí)數(shù)學(xué)一元一次方程應(yīng)用題復(fù)習(xí)題及答案
- 儲(chǔ)能電站檢修規(guī)程
- 離婚冷靜期制度的構(gòu)建與完善
- 外掛鋼樓梯專(zhuān)項(xiàng)施工方案
- 企業(yè)盡職調(diào)查內(nèi)容提綱-中英文對(duì)照
- GB/T 18997.1-2020鋁塑復(fù)合壓力管第1部分:鋁管搭接焊式鋁塑管
評(píng)論
0/150
提交評(píng)論