C# POST请求无法传参获取韩国船舶网站数据求助
解决POST参数无法传递至韩国船舶数据网站的问题
我完全懂你现在的挫败感——明明用Burp Suite发送POST请求能正常拿到目标网站的船舶数据,但自己用HttpClient、WebClient写代码时,参数就是没法正确传递,折腾了4小时还没搞定,确实让人头大。
问题根源分析
从你的描述来看,最大的可能性是你的代码没有模拟浏览器的完整请求流程:
- Burp Suite捕获的是浏览器已经建立会话后的请求,自带了网站设置的会话Cookie,而你的代码直接发送POST,没有先获取并携带这个Cookie
- 请求头不全,网站可能会校验User-Agent、Referer、Accept等关键头信息,你的代码只加了User-Agent和Content-Type,缺少其他必要头
- 可能存在隐藏参数(比如ASP.NET的
__VIEWSTATE这类),你没从页面中解析出来就发送POST
解决方案步骤
- 先获取会话Cookie:先GET一次目标页面,让网站给你的请求设置会话Cookie,后续POST请求携带这个Cookie
- 复制完整请求头:把Burp Suite中抓到的浏览器请求头全部加到代码里,尽可能模拟真实浏览器行为
- 确保参数完全匹配:检查Burp里的POST请求参数,确保代码里的参数和它完全一致,没有遗漏
修改后的代码示例(HttpClient版本)
using System; using System.Net.Http; using System.Net.Http.Headers; using System.Collections.Generic; using System.Threading.Tasks; class Program { static async Task Main(string[] args) { var targetUrl = "http://info.bptc.co.kr:9084/content/sw/frame/berth_status_text_frame_sw_kr.jsp"; var parentPageUrl = "http://info.bptc.co.kr:9084/content/sw/frame/berth_status_frame_sw_kr.jsp"; // 对应Burp里的Referer地址 // 初始化带Cookie容器的HttpClientHandler,自动管理会话Cookie var handler = new HttpClientHandler { UseCookies = true, CookieContainer = new System.Net.CookieContainer() }; using (var client = new HttpClient(handler)) { // 设置和浏览器完全一致的请求头(从Burp里复制) client.DefaultRequestHeaders.UserAgent.ParseAdd("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.Accept.ParseAdd("text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); client.DefaultRequestHeaders.Referrer = new Uri(parentPageUrl); client.DefaultRequestHeaders.AcceptLanguage.ParseAdd("ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4"); client.DefaultRequestHeaders.Connection.ParseAdd("keep-alive"); // 第一步:先GET目标页面,获取会话Cookie var getResponse = await client.GetAsync(targetUrl); getResponse.EnsureSuccessStatusCode(); // 准备POST参数,和Burp里的参数完全一致 var formData = new Dictionary<string, string> { {"v_time", "month"}, {"ROCD", "ALL"}, {"ORDER", "item2"}, {"v_gu", "S"} // 如果Burp里有其他隐藏参数,比如__VIEWSTATE,记得从页面解析后添加进来 }; var content = new FormUrlEncodedContent(formData); // 明确指定Content-Type的编码,避免网站解析错误 content.Headers.ContentType = new MediaTypeHeaderValue("application/x-www-form-urlencoded") { CharSet = "UTF-8" }; // 发送POST请求 var postResponse = await client.PostAsync(targetUrl, content); postResponse.EnsureSuccessStatusCode(); var responseString = await postResponse.Content.ReadAsStringAsync(); Console.WriteLine(responseString); } } }
修改后的代码示例(WebClient版本)
using System; using System.Net; using System.Text; class Program { static void Main(string[] args) { var targetUrl = "http://info.bptc.co.kr:9084/content/sw/frame/berth_status_text_frame_sw_kr.jsp"; var parentPageUrl = "http://info.bptc.co.kr:9084/content/sw/frame/berth_status_frame_sw_kr.jsp"; using (var client = new WebClient()) { // 设置完整请求头 client.Headers.Add(HttpRequestHeader.UserAgent, "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"); client.Headers.Add(HttpRequestHeader.Accept, "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8"); client.Headers.Add(HttpRequestHeader.Referer, parentPageUrl); client.Headers.Add(HttpRequestHeader.AcceptLanguage, "ko-KR,ko;q=0.8,en-US;q=0.6,en;q=0.4"); client.Headers.Add(HttpRequestHeader.Connection, "keep-alive"); // 先GET页面获取会话Cookie client.DownloadString(targetUrl); // 准备POST参数 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(targetUrl, "POST", reqparm); string responsebody = Encoding.UTF8.GetString(responsebytes); Console.WriteLine(responsebody); } } }
关键注意点
- 如果网站是ASP.NET架构,记得从GET回来的页面中解析
__VIEWSTATE、__EVENTVALIDATION这类隐藏参数,添加到POST参数里 - 对比Burp里的请求和你代码的请求,确保所有头信息、参数完全一致,哪怕是看似无关的头也不要遗漏
- 如果还是不行,可以用Fiddler抓你代码的请求,和Burp里的浏览器请求对比,找出差异点
内容的提问来源于stack exchange,提问作者JM C
相关产品推荐
相关产品推荐

