最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#記一次http協(xié)議multipart/form-data的boundary問(wèn)題

 更新時(shí)間:2022年06月09日 15:56:23   作者:地獄高速公路  
這篇文章主要介紹了C#記一次http協(xié)議multipart/form-data的boundary問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

1.問(wèn)題描述

使用post方法調(diào)用上級(jí)聯(lián)網(wǎng)廠(chǎng)家接口,返回http狀態(tài)碼415,返回信息Content type ‘application/x-www-form-urlencoded’ not supported

測(cè)試上級(jí)聯(lián)網(wǎng)廠(chǎng)家接口使用的是Postman工具,工具下載地址:https://www.getpostman.com/downloads/

使用application/x-www-form-urlencoded調(diào)用接口,返回http狀態(tài)碼415,如圖:

既然服務(wù)器無(wú)法處理請(qǐng)求附帶的媒體格式,那么改用multipart/form-data試試?

測(cè)試后發(fā)現(xiàn)可以調(diào)用成功,如圖:

我們都知道ContentType為application/x-www-form-urlencoded的請(qǐng)求頭、體如何構(gòu)造,如:

HttpWebRequest request = WebRequest.Create(new Uri(url)) as HttpWebRequest;
request.Method = "POST";
request.Host = Properties.Settings.Default.IP;
request.ContentType = "application/x-www-form-urlencoded; charset=UTF-8";
request.UserAgent = "Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko";
request.Accept = "*/*";
request.CookieContainer = cc;
request.KeepAlive = true;
string postData = string.Format("action=cx&hphm={0}&hpzl=&jclb=&detlsh=&clpp=&clxh=&rlzl=&pfbz=&jcff=&evl=&staName={1}&detLineId=&syxz=&rqyi={2}&rqer={3}&RQXZ=JCRQ&CXJL=Jiance&cllb=&clgs=&zcrq=&zzl=&clsbdh=&syr=&ccdjrq=&page={4}&rows=10", hphm, staName, rqyi, rqer, page);
byte[] postdatabyte = Encoding.GetEncoding("utf-8").GetBytes(postData);
request.ContentLength = postdatabyte.Length;
using (Stream stream = request.GetRequestStream())
{
	stream.Write(postdatabyte, 0, postdatabyte.Length);
}
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8")))
{
	string temp = reader.ReadToEnd();
}

但是!multipart/form-data的請(qǐng)求頭與請(qǐng)求體該如何構(gòu)造呢?像下面這樣?

string url = "http://112.17.158.12:8180/intf/services/query";
HttpWebRequest request = WebRequest.Create(new Uri(url)) as HttpWebRequest;
request.Method = "POST";
request.Host = "112.17.158.12:8180";
request.ContentType = "multipart/form-data; ";
request.UserAgent = "PostmanRuntime/7.17.1";
request.Accept = "*/*";
request.KeepAlive = true;
string postData = @"jkuser=33088102&jkpasswd=33088102&jsondata={""jkid"":""R10"",""requestTime"":""20190919110603"",""body"":[{""inspstationcode"":""33088102""}]}";
byte[] postdatabyte = Encoding.GetEncoding("utf-8").GetBytes(postData);
request.ContentLength = postdatabyte.Length;
using (Stream stream = request.GetRequestStream())
{
	stream.Write(postdatabyte, 0, postdatabyte.Length);
}
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8")))
{
	string temp = reader.ReadToEnd();
}

顯然不對(duì),捕獲到了"遠(yuǎn)程服務(wù)器返回錯(cuò)誤:(500)內(nèi)部服務(wù)器錯(cuò)誤。"異常,那么我們?cè)撛趺崔k呢?

2.解決思路

既然Postman工具使用ContentType為multipart/form-data類(lèi)型post數(shù)據(jù)可以成功,那么我們寫(xiě)的C#程序應(yīng)該也可以呀!那怎么辦呢?。。。。沒(méi)錯(cuò)??!就是抓包!

首先想到的是,用fiddler抓Postman的數(shù)據(jù)包,然后C#程序構(gòu)造同樣的數(shù)據(jù)包即可。

觀(guān)察數(shù)據(jù)包Headers選項(xiàng)卡,如圖:

發(fā)現(xiàn)Content-Type: multipart/form-data;后面跟了一個(gè)boundary=----------------------------183584948778966847113836

并且TextView選項(xiàng)卡如下:

WebForms選項(xiàng)卡如下:

所以,可以按照Headers和TextView選項(xiàng)卡內(nèi)容構(gòu)造post請(qǐng)求,就可以解決我們的問(wèn)題了!

3.解決步驟

將ContentType加上boundary=boundary-------------------------xxxxxxxxxxxxxx

并且構(gòu)造參數(shù),如下:

string url = "http://112.17.158.12:8180/intf/services/query";
string boundary = "--------------------------" + DateTime.Now.Ticks.ToString("x");
string boundary2 = "--" + boundary;
HttpWebRequest request = WebRequest.Create(new Uri(url)) as HttpWebRequest;
request.Method = "POST";
request.Host = "112.17.158.12:8180";
request.ContentType = "multipart/form-data; boundary=" + boundary;
request.UserAgent = "PostmanRuntime/7.17.1";
request.Accept = "*/*";
request.KeepAlive = true;
StringBuilder sb = new StringBuilder();
sb.Append(boundary2 + "\r\n");
sb.Append(@"Content-Disposition: form-data; name=""jkuser""" + "\r\n\r\n");
sb.Append("33088102" + "\r\n");
sb.Append(boundary2 + "\r\n");
sb.Append(@"Content-Disposition: form-data; name=""jkpasswd""" + "\r\n\r\n");
sb.Append("33088102" + "\r\n");
sb.Append(boundary2 + "\r\n");
sb.Append(@"Content-Disposition: form-data; name=""jsondata""" + "\r\n\r\n");
sb.Append(@"{""jkid"":""R10"",""requestTime"":""20190919110603"",""body"":[{""inspstationcode"":""33088102""}]}" + "\r\n");
sb.Append(boundary2 + "--" + "\r\n");
string postData = sb.ToString();
byte[] postdatabyte = Encoding.GetEncoding("utf-8").GetBytes(postData);
request.ContentLength = postdatabyte.Length;
using (Stream stream = request.GetRequestStream())
{
    stream.Write(postdatabyte, 0, postdatabyte.Length);
}
HttpWebResponse response = request.GetResponse() as HttpWebResponse;
using (StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.GetEncoding("utf-8")))
{
    string temp = reader.ReadToEnd();
}

值得注意的是,“boundary-------------------------xxxxxxxxxxxxxx”

這么長(zhǎng)一串東西,只是作為分隔符出現(xiàn)的,不必太在意它是什么東西,我將它理解為分割文本參數(shù)的這么一個(gè)東西,并且通過(guò)仔細(xì)觀(guān)察發(fā)現(xiàn)可以發(fā)現(xiàn)header中contenttype的橫線(xiàn)數(shù)量比參數(shù)中橫線(xiàn)數(shù)量少兩個(gè)且必須少兩個(gè)?

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。 

相關(guān)文章

  • C#利用Aspose.PDF實(shí)現(xiàn)PDF轉(zhuǎn)EPUB的完整指南

    C#利用Aspose.PDF實(shí)現(xiàn)PDF轉(zhuǎn)EPUB的完整指南

    在 .NET 開(kāi)發(fā)中,Aspose.PDF 是一個(gè)強(qiáng)大的庫(kù),能夠幫助我們處理 PDF 文件的各種任務(wù),包括將 PDF 轉(zhuǎn)換為其他格式,如 EPUB,本文將介紹如何使用 Aspose.PDF 在 C# 中實(shí)現(xiàn)將 PDF 轉(zhuǎn)換為 EPUB 的功能,需要的朋友可以參考下
    2025-02-02
  • 用Linq從一個(gè)集合選取幾列得到一個(gè)新的集合(可改列名)

    用Linq從一個(gè)集合選取幾列得到一個(gè)新的集合(可改列名)

    這篇文章主要介紹了用Linq從一個(gè)集合選取幾列得到一個(gè)新的集合(可改列名),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • 詳解C# 匿名對(duì)象(匿名類(lèi)型)、var、動(dòng)態(tài)類(lèi)型 dynamic

    詳解C# 匿名對(duì)象(匿名類(lèi)型)、var、動(dòng)態(tài)類(lèi)型 dynamic

    隨著C#的發(fā)展,該語(yǔ)言?xún)?nèi)容不斷豐富,開(kāi)發(fā)變得更加方便快捷,C# 的鋒利盡顯無(wú)疑。下面通過(guò)本文給大家分享C# 匿名對(duì)象(匿名類(lèi)型)、var、動(dòng)態(tài)類(lèi)型 dynamic,需要的的朋友參考下吧
    2017-09-09
  • C# 設(shè)計(jì)模式系列教程-代理模式

    C# 設(shè)計(jì)模式系列教程-代理模式

    代理模式對(duì)客戶(hù)端來(lái)說(shuō),隱藏了真實(shí)對(duì)象的細(xì)節(jié)及復(fù)雜性,實(shí)現(xiàn)了客戶(hù)端(調(diào)用者)與真實(shí)對(duì)象的松耦合,提高了運(yùn)行速度。
    2016-06-06
  • c#在sql中存取圖片image示例

    c#在sql中存取圖片image示例

    這篇文章主要介紹了c#在sql中存取圖片image示例,需要的朋友可以參考下
    2014-03-03
  • C#編程獲取各種電腦硬件信息的方法示例

    C#編程獲取各種電腦硬件信息的方法示例

    這篇文章主要介紹了C#編程獲取各種電腦硬件信息的方法,結(jié)合實(shí)例形式分析了C#獲取電腦CPU、主板、硬盤(pán)、BIOS編號(hào)等信息的相關(guān)操作技巧與注意事項(xiàng),需要的朋友可以參考下
    2017-08-08
  • C#自動(dòng)給文章關(guān)鍵字加鏈接實(shí)現(xiàn)代碼

    C#自動(dòng)給文章關(guān)鍵字加鏈接實(shí)現(xiàn)代碼

    這篇文章主要介紹了C#自動(dòng)給文章關(guān)鍵字加鏈接實(shí)現(xiàn)代碼,有需要的朋友可以參考一下
    2013-12-12
  • C#調(diào)用SQLite的方法實(shí)例分析

    C#調(diào)用SQLite的方法實(shí)例分析

    這篇文章主要介紹了C#調(diào)用SQLite的方法,較為詳細(xì)的介紹了SQLite的功能與特點(diǎn),并實(shí)例分析了C#調(diào)用SQLite的相關(guān)技巧,需要的朋友可以參考下
    2015-06-06
  • 使用C#實(shí)現(xiàn)對(duì)任意區(qū)域任意大小的截圖

    使用C#實(shí)現(xiàn)對(duì)任意區(qū)域任意大小的截圖

    這篇文章主要為大家詳細(xì)介紹了如何使用C#實(shí)現(xiàn)簡(jiǎn)單的截圖功能,可以對(duì)任意區(qū)域任意大小的截圖,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • c# 異步編程入門(mén)

    c# 異步編程入門(mén)

    這篇文章主要介紹了c# 異步編程入門(mén)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)使用c#,感興趣的朋友可以了解下
    2021-03-03

最新評(píng)論

锦屏县| 大埔县| 娄底市| 黄冈市| 高尔夫| 夏邑县| 安化县| 高要市| 石渠县| 梅河口市| 无棣县| 城固县| 吉林省| 确山县| 大厂| 泗洪县| 泰州市| 克东县| 房产| 武定县| 景德镇市| 石城县| 女性| 玉溪市| 视频| 天等县| 新民市| 绥滨县| 甘孜县| 大渡口区| 天水市| 邯郸县| 房产| 河南省| 攀枝花市| 名山县| 扶绥县| 巨鹿县| 铜陵市| 贺州市| 洮南市|