大家好,我想用post方式,实现点击该网页的按钮(不用webbrowser方法),以下是我用httpwatch网页分析工具捉取的数据,那当我编软件是,post 提交的字符串应该怎么写啊??请大家帮帮忙,谢谢大家的关注!
POST /q?ct=19&tn=ikasyndatajson HTTP/1.1
Accept: */*
Accept-Language: zh-cn
Referer: http://zhidao.baidu.com/question/224770564.html?fr=qrl&cid=763&index=2
x-request-with: XMLHttpRequest
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; WOW64; Trident/5.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; MALN; .NET4.0C)
Host: zhidao.baidu.com
Content-Length: 98
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: BDTIPID=4062%7C3972%7C4072%7C; BAIDUID=628FCA6DE4E81F87DA255973CC88C88C:FG=1ct=19&tn=ikasyndatajson&cm=100003&at=10002&qid=224770564&bid=121227561&bun=sdrzwyg&t=1310565099143

解决方案 »

  1.   

    zhidao.baidu.com/q?ct=19&tn=ikasyndatajson
      

  2.   

    好像不行了,也不知道是不是我的代码有问题,请你帮我看看好吗?我的代码如下:              string uriString = "http://zhidao.baidu.com/question/224770564.html";
                HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uriString);
                request.Method = WebRequestMethods.Http.Post;
                request.AllowAutoRedirect = true;
                string s = "zhidao.baidu.com/q?ct=19&tn=ikasyndatajson";
                byte[] bytes = Encoding.UTF8.GetBytes(s);
                request.ContentType = "application/x-www-form-urlencoded";
                request.ContentLength = bytes.Length;
                Stream stream = request.GetRequestStream();
                stream.Write(bytes, 0, bytes.Length);
                stream.Close();            MessageBox.Show("Botton1 提交完成");
      

  3.   

    HttpWorkerRequest.GetQueryString 方法 
      

  4.   

    从楼主一楼的数据,看到的都是http头,未见真正的post数据
    post 需要提交的字符串 = http头 + 真正的postData
    其中http头 中的Content-Length: 98 这个98 =postData.Length
      

  5.   

    Stream.Write应该写post消息体。而消息头使用Headers属性添加。
      

  6.   

    看看msdn吧: http://msdn.microsoft.com/zh-cn/library/system.net.httpwebrequest.headers.aspx
      

  7.   


    对于这个,可以看msdn: http://msdn.microsoft.com/zh-cn/library/system.net.httpwebrequest.referer.aspx这几个特殊的头,已经设置为属性了,不允许使用Headers属性(尽管我觉得这有点多余)。
      

  8.   


    那我要怎样才能得到真正的post数据呢?
      

  9.   


    楼主这里貌似误解了楼上的意思了,虽说我也不知道2楼那位仁兄啥意思,为了占沙发?楼主从抓的包可以看出来HTTP送出去的数据分了两部分,HTTP头和实体。中间用一个空行空开。实体就是post的数据了,就你抓的包来说,post的数据就是“ct=19&tn=ikasyndatajson&cm=100003&at=10002&qid=224770564&bid.....”。所以你想模拟POST,要做三件事:
    1、HTTP头的中一些信息,除了([cookie:]),按照你抓的包照葫芦画瓢的写好
    2、自己也要拼出你抓的包里面的那一长串字符送出去。
    3、HTTP头的中[cookie:]这部分,通过先前用户登录时候抓包准备好……(这部分麻烦)
      

  10.   


    第一件事,从你的代码中看到了,你已经做了,就是
    request.Method = WebRequestMethods.Http.Post;
    request.ContentType = "application/x-www-form-urlencoded";

    但是貌似还不够,你看看你抓包的http头里面,人家还有
    Accept: 。
    Accept-Language: 
    Referer: 
    对于第二件事,就是你主题提到的事情,关于这个你又要去知道两件事儿:
    1.这个字符串中的每个参数都是哪里来的
    2.最终自己拼出来的字符串怎么和刚才的http头加在一起POST出去
    对于1,通常来说它的参数都隐藏在你post的那个网页的HTML里面
         拿淘宝登录来说,它登录时要post的字符串是“...&_tb_token_=e10ee755783a5&action=Authenticator&event_submit_do_login=anything&TPL_redirect_url=&from=tb&....”
    你可以在他登录页面的HTML中发现下面的内容
    <div class="submit">
       <input name='_tb_token_' type='hidden' value='e10ee755783a5'>
       <input type="hidden" name="action" value="Authenticator" />
       <input type="hidden" name="event_submit_do_login" value="anything" />
       <input type="hidden" name="from" value="tb" />
       <input type="hidden" name="fc" value="2" />
       <input type="hidden" name="style" value="default" />
     参数就是这么取到的
    对于2,理论上应该这么写,但我也没试过。。
        byte[] bytepostData = Encoding.Default.GetBytes(postData); //postData就是上一步拼出来的那串string,转换成byte
        httpWebRequest.ContentType = ....
        httpWebRequest.Accept =....
        httpWebRequest.Referer = ....
        ....                          //上面拼好HTTP头,下面代码就是往里头写入post字符串了
        Stream stream;
        stream = httpWebRequest.GetRequestStream();
        stream.Write(bytepostData, 0, bytepostData .Length);
        stream.Close();
        webResponse = (HttpWebResponse)httpWebRequest.GetResponse();   //Post It!对于第三件事,
        你抓的包里面有一行Cookie: BDTIPID=4062%7C3972%7C4072%7C; BAIDUID=628FCA6DE4E81F87DA255973CC88C88C:FG=1
    所以你post的时候http头信息里面也必须有这么一行,这个一般是登录用户密码后产生的。你调查一下抓到的前几个网页,里面会有Set-Cookie:字样的地方,你把他的值保存下来