C#通過(guò)HttpWebRequest發(fā)送帶有JSON Body的POST請(qǐng)求實(shí)現(xiàn)
起因
很多博客都有描述到這個(gè)問題,那么為什么我還要寫一篇文章來(lái)說(shuō)一下呢,因?yàn)槠渌亩妓坪跻呀?jīng)過(guò)時(shí)了,會(huì)導(dǎo)致其實(shí)body 并沒有發(fā)送過(guò)去。至于為什么不使用其他的諸如 HttpClient 之類的,是由于業(yè)務(wù)需要。
原來(lái)的處理方式
通過(guò) GetRequestStream 來(lái)獲取請(qǐng)求流,后把需要發(fā)送的 Json 數(shù)據(jù)寫入到流中
private T PostDataViaHttpWebRequest<T>(string baseUrl,
IReadOnlyDictionary<string, string> headers,
IReadOnlyDictionary<string, string> urlParas,
string requestBody=null)
{
var resuleJson = string.Empty;
try
{
var apiUrl = baseUrl;
if (urlParas != null)
urlParas.ForEach(p =>
{
if (apiUrl.IndexOf("{" + p.Key + "}") > -1)
{
apiUrl = apiUrl.Replace("{" + p.Key + "}", p.Value);
}
else
{
apiUrl += string.Format("{0}{1}={2}", apiUrl.Contains("?") ? "&" : "?", p.Key, p.Value);
}
}
);
var req = (HttpWebRequest)WebRequest.Create(apiUrl);
req.Method = "POST";
req.ContentType = "application/json";
req.ContentLength = 0;
if (!requestBody.IsNullOrEmpty())
{
using (var postStream = req.GetRequestStream())
{
var postData = Encoding.ASCII.GetBytes(requestBody);
req.ContentLength = postData.Length;
postStream.Write(postData, 0, postData.Length);
}
}
if (headers != null)
{
if (headers.Keys.Any(p => p.ToLower() == "content-type"))
req.ContentType = headers.SingleOrDefault(p => p.Key.ToLower() == "content-type").Value;
if (headers.Keys.Any(p => p.ToLower() == "accept"))
req.Accept = headers.SingleOrDefault(p => p.Key.ToLower() == "accept").Value;
}
var response = (HttpWebResponse)req.GetResponse();
using(Stream stream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("UTF-8")))
{
resuleJson = reader.ReadToEnd();
}
}
}
catch (Exception ex)
{
return default(T);
}
return JsonConvert.DeserializeObject<T>(resuleJson);
}
但是會(huì)發(fā)現(xiàn),數(shù)據(jù)一直沒有正常發(fā)送過(guò)去,而且代碼還顯得比較復(fù)雜
新的方式
這里修改一下寫入 RequestStream 的方式,使用 StreamWriter 包裝一下,然后直接寫入需要發(fā)送的 Json 數(shù)據(jù)
private T PostDataViaHttpWebRequest<T>(string baseUrl,
IReadOnlyDictionary<string, string> headers,
IReadOnlyDictionary<string, string> urlParas,
string requestBody=null)
{
var resuleJson = string.Empty;
try
{
var apiUrl = baseUrl;
if (urlParas != null)
urlParas.ForEach(p =>
{
if (apiUrl.IndexOf("{" + p.Key + "}") > -1)
{
apiUrl = apiUrl.Replace("{" + p.Key + "}", p.Value);
}
else
{
apiUrl += string.Format("{0}{1}={2}", apiUrl.Contains("?") ? "&" : "?", p.Key, p.Value);
}
}
);
var req = (HttpWebRequest)WebRequest.Create(apiUrl);
req.Method = "POST";
req.ContentType = "application/json"; //Defalt
if (!requestBody.IsNullOrEmpty())
{
using (var postStream = new StreamWriter(req.GetRequestStream()))
{
postStream.Write(requestBody);
}
}
if (headers != null)
{
if (headers.Keys.Any(p => p.ToLower() == "content-type"))
req.ContentType = headers.SingleOrDefault(p => p.Key.ToLower() == "content-type").Value;
if (headers.Keys.Any(p => p.ToLower() == "accept"))
req.Accept = headers.SingleOrDefault(p => p.Key.ToLower() == "accept").Value;
}
var response = (HttpWebResponse)req.GetResponse();
using(Stream stream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(stream, Encoding.GetEncoding("UTF-8")))
{
resuleJson = reader.ReadToEnd();
}
}
}
catch (Exception ex)
{
return default(T);
}
return JsonConvert.DeserializeObject<T>(resuleJson);
}
這樣即可正確發(fā)送 Json 數(shù)據(jù)。
到此這篇關(guān)于C#通過(guò)HttpWebRequest發(fā)送帶有JSON Body的POST請(qǐng)求實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)C# post請(qǐng)求 HttpWebRequest內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
基于AForge實(shí)現(xiàn)C#攝像頭視頻錄制功能
這篇文章主要為大家詳細(xì)介紹了基于AForge實(shí)現(xiàn)C#攝像頭視頻錄制功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-10-10
WPF利用WindowChrome實(shí)現(xiàn)自定義窗口
這篇文章主要為大家詳細(xì)介紹了WPF如何利用WindowChrome實(shí)現(xiàn)自定義窗口,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,需要的可以參考一下2023-02-02
C#實(shí)現(xiàn)把科學(xué)計(jì)數(shù)法(E)轉(zhuǎn)化為正常數(shù)字值
這篇文章主要介紹了C#實(shí)現(xiàn)把科學(xué)計(jì)數(shù)法(E)轉(zhuǎn)化為正常數(shù)字值,本文直接給出代碼實(shí)例,需要的朋友可以參考下2015-06-06
C#中的并發(fā)編程與.NET任務(wù)并行庫(kù)的使用示例和常見問題
在現(xiàn)代軟件開發(fā)中,.NET Framework通過(guò)引入任務(wù)并行庫(kù)(TPL)和并發(fā)集合類型,簡(jiǎn)化了并發(fā)復(fù)雜性,提高程序的性能、可維護(hù)性和可擴(kuò)展性,并發(fā)集合設(shè)計(jì)上允許多線程安全訪問,此外,TPL通過(guò)Task類簡(jiǎn)化異步操作,正確使用這些工具可避免死鎖和競(jìng)爭(zhēng)條件等常見問題2024-09-09
使用C# 調(diào)用deepseek api接口實(shí)現(xiàn)正常訪問的過(guò)程
本文介紹了使用C#調(diào)用deepseek API接口實(shí)現(xiàn)正常訪問的方法,包括解決SSL/TLS安全通道問題和切換模型等常見問題,并提供了默認(rèn)使用的reasoner模型和賬戶余額信息,感興趣的朋友一起看看吧2025-02-02
C# WinForm程序設(shè)計(jì)簡(jiǎn)單計(jì)算器
這篇文章主要為大家詳細(xì)介紹了C# WinForm程序設(shè)計(jì)簡(jiǎn)單計(jì)算器,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-02-02
c#使用Unity粒子實(shí)現(xiàn)炮塔發(fā)射系統(tǒng)
Unity自帶粒子發(fā)射器、動(dòng)畫器、渲染器各兩種,利用Unity的粒子系統(tǒng)制作一個(gè)炮塔發(fā)射系統(tǒng),了解粒子系統(tǒng),必須先了解每一個(gè)屬性都代表了什么,之后才能根據(jù)這些原理來(lái)調(diào)整出自己滿意的效果2022-04-04

