You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

解决方案步骤

  1. 先获取会话Cookie:先GET一次目标页面,让网站给你的请求设置会话Cookie,后续POST请求携带这个Cookie
  2. 复制完整请求头:把Burp Suite中抓到的浏览器请求头全部加到代码里,尽可能模拟真实浏览器行为
  3. 确保参数完全匹配:检查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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 15:12:41