Cookies ... Http POST无法正常工作,为什么?

时间:2009-12-11 18:49:05

标签: java cookies post httpclient

可能这通常是个问题,但我无法解决。 我需要自动填写Web表单上的一些字段,这些字段是从服务器提供的。 我使用Apache HttpClient使我的生活变得更轻松) 到现在为止,人们可以考虑我的步骤来实现目标:

     1.我没有证书到http://trac.edgewall.org/所以我下载这个软件并在本地安装,完成后我将不得不创建NewTicket。
     2.我在本地使用没有任何SSL(SSL隧道)的Trac。 (将我的程序更改为能够使用HTTPS并不困难。)
     3.到现在为止,我可以进行身份​​验证并执行GET请求,但我无法执行POST请求

     4.例如:我对http://localhost:8000/tracenvir/newticket执行GET请求。 这个(〜/ newticket)页面如下所示: http://s04.radikal.ru/i177/0912/cb/d43971cebc02.png 作为回应我:(部分)
    “input type =”text“id =”field-summary“name =”field_summary“size =”70“”

    “textarea id =”field-description“name =”field_description“class =”wikitext“rows =”10“cols =”68“/ textarea”'
      5。所以,我写这个:
      
              int status = 0;
              int cookLength=0;
              Cookie[] cookies = null;
      
              HttpClient client = new HttpClient();
              client.getParams().setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY);
              HttpState initialState = new HttpState();
              client.setState(initialState);
      
              //**********//
              //**Log in**//
              //**********//
      
              GetMethod login = new GetMethod("http://localhost:8000/tracenvir/login");
              client.getState().setCredentials(AuthScope.ANY,
                      new UsernamePasswordCredentials("rauch", "qwert"));
              login.setDoAuthentication(true);
              System.setProperty("javax.net.ssl.trustStore", "/home/rauch/NetBeansProjects/jssecacerts");
      
              try {
                  status = client.executeMethod(login);
      
              System.out.println("response code = "+status);
              cookies = client.getState().getCookies();
              cookLength = cookies.length;
      
              for(int i=0;i (less than) cookLength;i++) {
                  System.out.println(cookies[i].toString());
              }
              login.releaseConnection();
              } catch(IOException ex) {
                  ex.printStackTrace();
              }
      
      
              //*********************//
              //**Create New Ticket**//
              //*********************//
      
              PostMethod post = new PostMethod("http://localhost:8000/tracenvir/newticket");
      
              NameValuePair[] data = {
                  new NameValuePair("field-summary","second error"),
                  new NameValuePair("field-descryption","Some stupid descryption..."),
                  new NameValuePair("field-type","defect"),
                  new NameValuePair("field-priority","major"),
                  new NameValuePair("field-version","1.0"),
                  new NameValuePair("field-owner","moscow server"),
                  new NameValuePair("submit","create ticket"),
              };
      
      
              //post.setRequestBody(data);
              post.addParameters(data);
              post.addRequestHeader("Referer","http://localhost:8000/tracenvir/login");
              for(int i=0;i (less than) cookLength;i++) {
                  initialState.addCookie(cookies[i]);
              }
              client.setState(initialState);
      
      
              try {
                  status = client.executeMethod(post);
      
              System.out.println("response code = "+status);
      
              byte[] buf = new byte[10];
              int r=0;
              BufferedInputStream is = new BufferedInputStream(post.getResponseBodyAsStream());
      
              while((r = is.read(buf)) > 0) {
                  System.out.write(buf, 0, r);
              }
              post.releaseConnection();
              } catch(IOException ex) {
                  ex.printStackTrace();
              }
          }
      

      我有这个:

        400错误:错误请求
          表单令牌丢失或无效。你有启用cookie吗?

          怎么了?

            作为对GET请求的回复,我得到了这个:
              响应代码= 200 trac_auth = 38144ec2830678183afebf0b14c51721
                trac_form_token = e9648f17987551b8f97e1953

                我可能会改变这个:

                  client.getParams()setCookiePolicy(CookiePolicy.BROWSER_COMPATIBILITY)。

2 个答案:

答案 0 :(得分:1)

http://www.google.com/support/toolbar/bin/answer.py?hl=en&answer=47972

我认为以上链接可以帮助你解决这个问题。它还提供视频..我希望您的查询能够得到解决

http://www.formautofill.com/

本网站将为您提供一个软件,它将提供自动填表。微软提供。

答案 1 :(得分:0)

确定。以下链接是关于post方法。我认为这可能对你有所帮助。

http://www.willmaster.com/library/manage-forms/automatic-form-submission-to-a-cgi-program.php

给我回复。如果没有。