2013-04-04 16 views
5

Witam Próbuję przesłać poniższy formularz za pomocą HTTPURLConnection jako ćwiczenia.Wyślij formularz za pomocą 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> 

Używam HttpURLConnection zrobić to złożyć To jest mój kod i moja klasa Test

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); 
} 
} 

A moja klasa usługa, która działa

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(); 
    } 
} 

Czy ktoś może doradzić dlaczego ta nie działa podczas przesyłania formularza. Czy to dlatego, że nie klikam przycisku przesyłania z wartością GO. Jeśli tak jest, to w jaki sposób mogę go kliknąć, ponieważ oczekiwałbym wysłania pary wartości nazwy, ale przycisk przesyłania nie ma nazwy tylko wartości.

Kiedy opublikuję formularz z tego kodu, oczekuję, że odpowiedź będzie zawierała te same dane, co w przypadku ręcznego przesyłania formularza, czyli dane na tej stronie: http://www.socialsecurity.gov/cgi-bin/popularnames.cgi.

Jednak po uruchomieniu klasy testowej dane w otrzymanej odpowiedzi są takie same, jak na oryginalnej stronie http://www.socialsecurity.gov/OACT/babynames/#ht=1.

Wszystkie pomoc ceniona

Dzięki

+0

Nie użyłbym 'DataOutputStream' do napisania treści żądania, użyję zamiast tego' PrintStream'. Powinieneś również sprawdzić odpowiedź uzyskaną z serwera przed odczytaniem strumienia wejściowego ('getResponseCode'). – Perception

+0

Jakie są wyniki, które podaje Twoja klasa usług i czego oczekujesz? – Friso

Odpowiedz

Powiązane problemy