C# 使用参数从 Post 中检索数据
C# Retrieve data from a Post with parameters
我知道我的问题看起来像是一个重复的问题,但我找不到对我的问题有用的解决方案。
所以我想从货船数据提供网站Link抓取数据(这是一个韩国网站。右边的黑色按钮是搜索按钮)
但是为了从中获取数据,必须设置一些单选按钮然后点击搜索。
我以为我可以通过 FormUrlEncodedContent 传递参数值然后简单地使用 PostAsync,但不知何故我无法让它们通过。
这是我到目前为止的代码
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36");
client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/x-www-form-urlencoded");
var doc = new HtmlAgilityPack.HtmlDocument();
var content = new FormUrlEncodedContent(structInfo.ScriptValues);
var response = await client.PostAsync(structInfo.PageURL, content);
var responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseString);
}
using (WebClient client = new WebClient())
{
var reqparm = new System.Collections.Specialized.NameValueCollection();
reqparm.Add("v_time", "month");
reqparm.Add("ROCD", "ALL");
reqparm.Add("ORDER", "item2");
reqparm.Add("v_gu", "S");
byte[] responsebytes = client.UploadValues("http://info.bptc.co.kr:9084/content/sw/frame/berth_status_text_frame_sw_kr.jsp", "POST", reqparm);
string responsebody = Encoding.UTF8.GetString(responsebytes);
Console.WriteLine(responsebody);
}
我在 StructInfo 中输入的值 Class
PageURL = "http://info.bptc.co.kr:9084/content/sw/frame/berth_status_text_frame_sw_kr.jsp",
ScriptValues = new Dictionary<string, string>
{
{"v_time", "month"},
{"ROCD", "ALL"},
{"ORDER", "item2"},
{"v_gu", "S"}
},
到目前为止,我尝试过的是 HttpClient、WebClient、WebBrowser,但我没有运气。
但奇怪的是,当我尝试使用 Burp Suite 发送 post 时,数据输出就像我想要的那样。
过去 4 小时我一直在寻找解决方案,但一直没有找到。
你们介意帮帮我吗?
谢谢
为 C# 生成的代码 - Postman 的 RestSharp
var client = new RestClient("http://info.bptc.co.kr:9084/Berth_status_text_servlet_sw_kr");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddParameter("v_time", "3days");
request.AddParameter("ROCD", "ALL");
request.AddParameter("ORDER", "item2");
request.AddParameter("v_gu", "S");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
HttpClient 版本
using var client = new HttpClient();
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("v_time", "3days"),
new KeyValuePair<string, string>("ROCD", "ALL"),
new KeyValuePair<string, string>("ORDER", "item2"),
new KeyValuePair<string, string>("v_gu", "S"),
});
string url = "http://info.bptc.co.kr:9084/Berth_status_text_servlet_sw_kr";
var response = await client.PostAsync(url, content);
var bytes = await response.Content.ReadAsByteArrayAsync();
string responseString = Encoding.UTF8.GetString(bytes);
Console.WriteLine(responseString);
问题
如果我们谈论 HttpClient 版本,假设您使用的是 .net 核心。
调用 ReadAsStringAsync 时抛出异常。
更具体地在下面:
https://github.com/microsoft/referencesource/blob/aaca53b025f41ab638466b1efe569df314f689ea/System/net/System/Net/Http/HttpContent.cs#L95
响应具有 ContentType:text/html; charset=euc-kr.
问题是 .net 核心不支持开箱即用的韩语字符集。
我的解决方法是改用 ReadAsByteArrayAsync,然后再使用受支持的 UTF8 编码器。不过,它搞砸了韩文字符。
更好的方法是引用 System.Text.Encoding.CodePages 包,然后使用 Encoding.RegisterProvider。
像这样
我知道我的问题看起来像是一个重复的问题,但我找不到对我的问题有用的解决方案。
所以我想从货船数据提供网站Link抓取数据(这是一个韩国网站。右边的黑色按钮是搜索按钮)
但是为了从中获取数据,必须设置一些单选按钮然后点击搜索。
我以为我可以通过 FormUrlEncodedContent 传递参数值然后简单地使用 PostAsync,但不知何故我无法让它们通过。
这是我到目前为止的代码
using (var client = new HttpClient())
{
client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36");
client.DefaultRequestHeaders.TryAddWithoutValidation("Content-Type", "application/x-www-form-urlencoded");
var doc = new HtmlAgilityPack.HtmlDocument();
var content = new FormUrlEncodedContent(structInfo.ScriptValues);
var response = await client.PostAsync(structInfo.PageURL, content);
var responseString = await response.Content.ReadAsStringAsync();
Console.WriteLine(responseString);
}
using (WebClient client = new WebClient())
{
var reqparm = new System.Collections.Specialized.NameValueCollection();
reqparm.Add("v_time", "month");
reqparm.Add("ROCD", "ALL");
reqparm.Add("ORDER", "item2");
reqparm.Add("v_gu", "S");
byte[] responsebytes = client.UploadValues("http://info.bptc.co.kr:9084/content/sw/frame/berth_status_text_frame_sw_kr.jsp", "POST", reqparm);
string responsebody = Encoding.UTF8.GetString(responsebytes);
Console.WriteLine(responsebody);
}
我在 StructInfo 中输入的值 Class
PageURL = "http://info.bptc.co.kr:9084/content/sw/frame/berth_status_text_frame_sw_kr.jsp",
ScriptValues = new Dictionary<string, string>
{
{"v_time", "month"},
{"ROCD", "ALL"},
{"ORDER", "item2"},
{"v_gu", "S"}
},
到目前为止,我尝试过的是 HttpClient、WebClient、WebBrowser,但我没有运气。
但奇怪的是,当我尝试使用 Burp Suite 发送 post 时,数据输出就像我想要的那样。
过去 4 小时我一直在寻找解决方案,但一直没有找到。
你们介意帮帮我吗?
谢谢
为 C# 生成的代码 - Postman 的 RestSharp
var client = new RestClient("http://info.bptc.co.kr:9084/Berth_status_text_servlet_sw_kr");
client.Timeout = -1;
var request = new RestRequest(Method.POST);
request.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request.AddParameter("v_time", "3days");
request.AddParameter("ROCD", "ALL");
request.AddParameter("ORDER", "item2");
request.AddParameter("v_gu", "S");
IRestResponse response = client.Execute(request);
Console.WriteLine(response.Content);
HttpClient 版本
using var client = new HttpClient();
var content = new FormUrlEncodedContent(new[]
{
new KeyValuePair<string, string>("v_time", "3days"),
new KeyValuePair<string, string>("ROCD", "ALL"),
new KeyValuePair<string, string>("ORDER", "item2"),
new KeyValuePair<string, string>("v_gu", "S"),
});
string url = "http://info.bptc.co.kr:9084/Berth_status_text_servlet_sw_kr";
var response = await client.PostAsync(url, content);
var bytes = await response.Content.ReadAsByteArrayAsync();
string responseString = Encoding.UTF8.GetString(bytes);
Console.WriteLine(responseString);
问题
如果我们谈论 HttpClient 版本,假设您使用的是 .net 核心。
调用 ReadAsStringAsync 时抛出异常。 更具体地在下面: https://github.com/microsoft/referencesource/blob/aaca53b025f41ab638466b1efe569df314f689ea/System/net/System/Net/Http/HttpContent.cs#L95
响应具有 ContentType:text/html; charset=euc-kr.
问题是 .net 核心不支持开箱即用的韩语字符集。
我的解决方法是改用 ReadAsByteArrayAsync,然后再使用受支持的 UTF8 编码器。不过,它搞砸了韩文字符。
更好的方法是引用 System.Text.Encoding.CodePages 包,然后使用 Encoding.RegisterProvider。
像这样