2013-04-04 13 views
5

Ciao Sto cercando di inviare il seguente modulo utilizzando HTTPURLConnection come esercizio.invia modulo utilizzando 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> 

Sto usando HttpURLConnection per fare il submit Questo è il mio codice e la mia classe di 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); 
} 
} 

E la mia classe di servizio, che fa il lavoro

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

chiunque può consigliare perché questo non funziona nell'invio del modulo. È perché non sto facendo clic sul pulsante di invio con un valore di GO. E se questo è il caso, allora come faccio a fare clic su di esso perché mi aspetterei di inviare una coppia di valori nome attraverso ma il pulsante di invio non ha un nome solo un valore.

Quando inserisco il modulo da questo codice, mi aspetto che la risposta contenga gli stessi dati di quando invio manualmente il modulo, ovvero i dati in questa pagina http://www.socialsecurity.gov/cgi-bin/popularnames.cgi.

Tuttavia, durante l'esecuzione della classe di test, i dati nella risposta che ottengo sono uguali a quelli della pagina originale http://www.socialsecurity.gov/OACT/babynames/#ht=1.

Tutto aiuto apprezzato

Grazie

+0

Non userei un 'DataOutputStream' per scrivere il corpo della richiesta, usare invece un' PrintStream'. Inoltre, dovresti controllare la risposta ricevuta dal server prima di leggere il flusso di input ('getResponseCode'). – Perception

+0

Qual è l'output che la classe di servizio sta dando e che cosa ti aspetti? – Friso

risposta