繁体   English   中英

使用 C# HttpWebRequest 在 Application/x-www-form-urlencoded 中构造 POST 正文数据的正确方法

[英]Proper way constructing a POST body data in Application/x-www-form-urlencoded using C# HttpWebRequest

我如何正确构造此数据以将其用作 BODY 以使用 HttpWebRequest 执行 POST 方法请求

__EVENTARGUMENT:(空), __EVENTTARGET:ctl01$wseppPager$rptPageNumbers$ctl01$lbtnPageNumber, __VIEWSTATE:(长字符串), __VIEWSTATEGENERATOR:B4380F01, ctl01$rptProducts$ctl00$hfSkuId:bd665324-6f04-40b3-8a54-afl01$0b3-8a54-afl0 $ctl01$hfSkuId:b177f5bc-2aed-4ab1-8e36-af0200eac102, ctl01$rptProducts$ctl02$hfSkuId:108b6a02-2011-45b6-a09c-af010094004e, ctl01$rptProducts$ctl03$hfSkuId:a9db4d78-f277-449b-acc2-af0100962f8a , ctl01$rptProducts$ctl04$hfSkuId:388194aa-3574-4127-b09b-af010097cfb2, ctl01$rptProducts$ctl05$hfSkuId:959b14cc-b231-47ae-9fc9-aef300a3ed8c, ctl01$rptProducts$ctl06$hfSkuId:b4136acd-e84b-465a -9349-aef301235fcc, ctl01$rptProducts$ctl07$hfSkuId:e058bb2c-328a-46d3-93c3-aef3012d3cbb, ctl01$rptProducts$ctl08$hfSkuId beda3ab2-c21b-4e75-b4df-aeb0008d8b15, ctl01$rptProducts$ctl09$hfSkuId:8c5ffafc- 175c-43d1-8302-ae66012cfbfb, ctl01$rptProducts$ctl10$hfSkuId:dce89988-e6d3-4154-b0d3-ae4a012e2475, ctl01$rptProducts$ctl11$hfSkuId:554a1bbf-bd601$hftft07-ace, rpce 产品$ctl12$hfSkuId:912c3feb-98aa-4499-8e7f-ae4a01300aea, ctl01$rptProducts$ctl13$hfSkuId:c4574ed3-af2a-4845-b283-ae3900c7c23d, ctl01$rptProducts$ctl14$hfSkuId-483-9431-480-9431 ae3900c2046d, ctl01$rptProducts$ctl15$hfSkuId:8535c21f-ba48-4c4d-bcc8-ae220113f0f7, ctl01$wseppSorter$ddlPageSize:16, ctl01$wseppSorter$ddlSortBy:CreatedDate 降序,

这是我的代码:

var request = (HttpWebRequest)WebRequest.Create(url);
request.Headers.Set(HttpRequestHeader.CacheControl, "max-age=0");
request.Headers.Add("sec-ch-ua", @"""Google Chrome"";v=""105"", ""Not)A;Brand"";v=""8"", ""Chromium"";v=""105""");
request.Headers.Add("sec-ch-ua-mobile", @"?0");
request.Headers.Add("sec-ch-ua-platform", @"""Windows""");
request.Headers.Add("Origin", @"https://www.pny.com");
request.Headers.Add("Upgrade-Insecure-Requests", @"1");
request.Headers.Add("DNT", @"1");
request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36";
request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9";
request.Headers.Add("Sec-Fetch-Site", @"same-origin");
request.Headers.Add("Sec-Fetch-Mode", @"navigate");
request.Headers.Add("Sec-Fetch-User", @"?1");
request.Headers.Add("Sec-Fetch-Dest", @"document");
request.Referer = "...";
request.Headers.Set(HttpRequestHeader.AcceptEncoding, "gzip, deflate, br");
request.Headers.Set(HttpRequestHeader.AcceptLanguage, "en-US,en;q=0.9");
request.Headers.Add(HttpRequestHeader.Cookie, @Cookies);
request.Method = "POST";
request.ServicePoint.Expect100Continue = false;

byte[] postBytes = System.Text.Encoding.UTF8.GetBytes(@Body);
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = postBytes.Length;
Stream stream = request.GetRequestStream();
stream.Write(postBytes, 0, postBytes.Length);
stream.Close();

我已经尝试过了,但它不起作用。

编辑:

我尝试将它添加到这样的键值对列表中。

List<KeyValuePair<string, string>> Body = new List<KeyValuePair<string, string>>();
Body.Add(new KeyValuePair<string, string>("__EVENTTARGET", "ctl01$wseppPager$lbtnNextPage"));

并将正文解析为

string body_kvp_encoded = string.Join("&", Body.Select(kvp => $"{HttpUtility.UrlEncode(kvp.Key)}={HttpUtility.UrlEncode(kvp.Value)}"));
string body_not_encoded = string.Join("&", Body.Select(kvp => $"{kvp.Key}={kvp.Value}"));

但仍然无法正常工作

去除

request.Headers.Add(HttpRequestHeader.Cookie, @Cookies);

将其替换为

request.CookieContainer.Add(cookies);

UrlEncode 键值对

string body_kvp_encoded = string.Join("&", Body.Select(kvp => $"{HttpUtility.UrlEncode(kvp.Key)}={HttpUtility.UrlEncode(kvp.Value)}"));

感谢你们

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM