2013-04-04 69 views
5

您好我正在尝试使用HTTPURLConnection作为练习提交以下表单。使用HTTPURLConnection提交表格

<form name="popnames" method="post" action="/cgi-bin/popularnames.cgi" onsubmit="return  submitIt();"> 
<p> 
<label for="year">Birth Year:</label><br> 
<input type="text" name="year" size="5" maxlength="4" id="year" value="2011"> 
</p> 
<p> 
<label for="rank">Popularity:</label><br> 
<select name="top" size="1" id="rank"> 


<option value="20">Top 20</option> 
    <option value="50">Top 50</option> 
    <option value="100">Top 100</option> 
    <option value="500">Top 500</option> 
    <option value="1000">Top 1000</option> 
</select> 
</p> 
<fieldset> 
<legend>Name rankings may include:</legend> 
<input type="radio" name="number" value="p" id="percent"> 
<label for="percent">Percent of total births</label><br> 
<input type="radio" name="number" value="n" id="number"> 
<label for="number">Number of births</label> 
</fieldset> 
<hr> 
<input class="uef-btn uef-btn-primary" type="submit" value=" Go "> 
</form> 

我使用HttpURLConnection类做递交这是我的代码和我的测试类

public class FormSubmitServiceTest { 

@Test 
public void testSubmit() throws Exception { 
    String url = "http://www.socialsecurity.gov/OACT/babynames/#ht=1"; 
    Map<String, String> data = new HashMap<String, String>(); 
    data.put("year", "2010"); 
    data.put("top", "50"); 
    data.put("number", "n"); 

    FormSubmitService service = new FormSubmitService(); 
    service.doSubmit(url, data); 
} 
} 

我的服务类做的工作

public class FormSubmitService { 

    public void doSubmit(String url, Map<String, String> data) throws IOException { 
     URL siteUrl = new URL(url); 
     HttpURLConnection conn = (HttpURLConnection) siteUrl.openConnection(); 
     conn.setRequestMethod("POST"); 
     conn.setRequestProperty("Content-Type", 
       "application/x-www-form-urlencoded"); 
     conn.setUseCaches (true); 
     conn.setDoOutput(true); 
     conn.setDoInput(true); 

     DataOutputStream out = new DataOutputStream(conn.getOutputStream()); 

     Set keys = data.keySet(); 
     Iterator keyIter = keys.iterator(); 
     String content = ""; 
     for(int i=0; keyIter.hasNext(); i++) { 
      Object key = keyIter.next(); 
      if(i!=0) { 
       content += "&"; 
      } 
      content += key + "=" + URLEncoder.encode(data.get(key), "UTF-8"); 
     } 
     System.out.println(content); 
     out.writeBytes(content); 
     out.flush(); 
     out.close(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream())); 
     String line = ""; 
     while((line=in.readLine())!=null) { 
      System.out.println(line); 
     } 
     in.close(); 
    } 
} 

任何人都可以提出建议,为什么这在提交表单时不起作用。是因为我没有点击GO的提交按钮。如果是这样的话,我怎么实际点击它,因为我希望发送一个名称值对,但提交按钮没有名称只有一个值。

当我从这段代码发布表单时,我期望响应中包含的数据与我手动进行表单提交时相同,这是本页http://www.socialsecurity.gov/cgi-bin/popularnames.cgi上的数据。

但是,在运行测试类时,我得到的响应中的数据与原始页面http://www.socialsecurity.gov/OACT/babynames/#ht=1相同。

所有帮助表示赞赏

感谢

+0

我不会使用'DataOutputStream'来写请求体,而是使用'PrintStream'。另外,您应该在读取输入流('getResponseCode')之前检查从服务器获取的响应。 – Perception 2013-04-04 08:28:55

+0

您的服务班级的输出是什么以及您期望的是什么? – Friso 2013-04-04 09:16:46

回答