2017-08-31 83 views
6

Celem kodu jest wstawienie parametrów do formularza, a następnie przesłanie formularza, który z kolei wprowadza dane do bazy danych MySQL. Problem polega na tym, że metoda nie publikuje danych. Nie jestem pewien, co robię źle, patrzyłem na tak wiele pytań dotyczących tego, ale nic nie działa.Nie można wysłać formularza pocztowego w Javie

Oto formularz.

<form action="http://localhost/Documents/dataadded.php" method="post"> 

<b>Add a New Data</b> 

<p>Email Address: 
<input type="text" name="email_address" size="30" value="" /> 
</p> 

<p>Email Pass: 
<input type="text" name="email_pass" size="30" value="" /> 
</p> 

<p> 
<input type="submit" name="submit" value="Send" /> 
</p> 

</form> 

Oto kod Java.

public static void main(String[] args) { 


    String key1 = "email_address"; 
    String key2 = "email_pass"; 
    String key3 = "submit"; 

    String param1 = "[email protected]"; 
    String param2 = "password123"; 
    String param3 = "Send"; 
    try { 
     URL website = new URL("http://localhost/Documents/added.php"); 

     Map<String,String> arguments = new LinkedHashMap<>(); 
     arguments.put(key1, param1); 
     arguments.put(key2, param2); 
     arguments.put(key3, param3); 

     StringJoiner sj = new StringJoiner("&"); 
     for(Map.Entry<String,String> entry : arguments.entrySet()) 
      sj.add(URLEncoder.encode(entry.getKey(), "UTF-8") + "=" 
       + URLEncoder.encode(entry.getValue(), "UTF-8")); 
     byte[] out = sj.toString().getBytes(StandardCharsets.UTF_8); 
     int length = out.length; 

     HttpURLConnection connection = (HttpURLConnection) website.openConnection(); 
     connection.setRequestMethod("POST"); 
     connection.setFixedLengthStreamingMode(length); 
     connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); 
     connection.setDoOutput(true); 
     connection.getOutputStream().write(out); 


     System.out.println(sj.toString()); 

     InputStream response = connection.getInputStream(); 

     @SuppressWarnings("resource") 
     Scanner scan = new Scanner(response); 
     String responsebody = scan.useDelimiter("\\A").next(); 
     System.out.println(responsebody); 



    } catch (IOException e) { 

     e.printStackTrace(); 
    } 

} 

Jeśli ktoś może rzucić trochę światła na to, co jest nie tak z kodem, będzie to bardzo cenne.

+1

W jaki sposób zaangażowany jest PHP? –

+0

Po przesłaniu formularza dane są przekazywane do http: //localhost/Documents/dataadded.php, który ma kod PHP, który obsługuje dane i dodaje je do bazy danych. –

+1

@ C.Trant Ale czy jest to rzeczywiście związane z twoim pytaniem? Sposób obsługi danych wydaje się nieistotny, problemem jest przekazywanie danych. – GrumpyCrouton

Odpowiedz

0

Musisz opróżnić OutputStream, zanim będzie można otworzyć InputStream. Poniżej znajduje się metoda, którą utworzyłem, aby wykonać żądania POST.

private String doPost(String urlString, LinkedHashMap<String, String> params) throws Exception { 
    //...make the content 
    StringBuilder content = new StringBuilder(); 
    //...append params 
    boolean first = true; 
    for (Map.Entry<String, String> entry : params.entrySet()) { 
     if (!first) { 
      content.append("&"); 
     } else { 
      first = false; 
     } 
     content.append(entry.getKey()).append("=").append(URLEncoder.encode(entry.getValue(), charset)); 
    } 
    //... send POST request 
    URL url = new URL(urlString); 
    HttpURLConnection con; 
    con = (HttpURLConnection) url.openConnection(); 
    con.setDoInput(true); 
    con.setDoOutput(true); 
    con.setUseCaches(false); 
    try (OutputStreamWriter writer = new OutputStreamWriter(con.getOutputStream(), charset)) { 
     writer.write(content.toString()); 
     writer.flush(); 
    } 
    //...get response 
    try (Scanner s = new Scanner(con.getInputStream(), charset)) { 
     String resp = s.useDelimiter("\\A").hasNext() ? s.next() : ""; 
     return resp; 
    } 
} 
+0

To jest kod Java 7, więc przepraszam za starą pętlę for. –

+0

Funkcja try-with-resources zamyka strumień wyjściowy, a zamknięcie strumienia wyjściowego powoduje jego opróżnienie i na pewno nie należy przepłukiwać wewnętrznych pętli. – EJP

+0

W odpowiedzi stwierdza się, że należy przepłukać. Ty nie. – EJP