348 Stimmen

Java - einfaches Senden von HTTP-Parametern über die POST-Methode

Ich verwende diesen Code erfolgreich zum Senden von HTTP Anfragen mit einigen Parametern über GET 方法

void sendRequest(String request)
{
    // i.e.: request = "http://example.com/index.php?param1=a&param2=b&param3=c";
    URL url = new URL(request); 
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();           
    connection.setDoOutput(true); 
    connection.setInstanceFollowRedirects(false); 
    connection.setRequestMethod("GET"); 
    connection.setRequestProperty("Content-Type", "text/plain"); 
    connection.setRequestProperty("charset", "utf-8");
    connection.connect();
}

Jetzt muss ich möglicherweise die Parameter (d.h. param1, param2, param3) über POST Methode, weil sie sehr lang sind. Ich dachte daran, dieser Methode einen zusätzlichen Parameter hinzuzufügen (z. B. String httpMethod).

Wie kann ich den obigen Code so wenig wie möglich ändern, um die Parameter entweder über GET o POST ?

Ich hatte gehofft, dass die Änderung

connection.setRequestMethod("GET");

zu

connection.setRequestMethod("POST");

hätte es auch getan, aber die Parameter werden immer noch über die GET-Methode gesendet.

Hat HttpURLConnection Haben Sie eine Methode, die helfen könnte? Gibt es ein hilfreiches Java-Konstrukt?

Für jede Hilfe wären wir sehr dankbar.

499voto

Alan Geleynse Punkte 24223

Bei einer GET-Anforderung werden die Parameter als Teil der URL gesendet.

Bei einer POST-Anforderung werden die Parameter als Körper der Anforderung nach den Kopfzeilen gesendet.

Um ein POST mit HttpURLConnection durchzuführen, müssen Sie die Parameter in die Verbindung schreiben, nachdem Sie die Verbindung geöffnet haben.

Dieser Code sollte Ihnen den Einstieg erleichtern:

String urlParameters  = "param1=a&param2=b&param3=c";
byte[] postData       = urlParameters.getBytes( StandardCharsets.UTF_8 );
int    postDataLength = postData.length;
String request        = "http://example.com/index.php";
URL    url            = new URL( request );
HttpURLConnection conn= (HttpURLConnection) url.openConnection();           
conn.setDoOutput( true );
conn.setInstanceFollowRedirects( false );
conn.setRequestMethod( "POST" );
conn.setRequestProperty( "Content-Type", "application/x-www-form-urlencoded"); 
conn.setRequestProperty( "charset", "utf-8");
conn.setRequestProperty( "Content-Length", Integer.toString( postDataLength ));
conn.setUseCaches( false );
try( DataOutputStream wr = new DataOutputStream( conn.getOutputStream())) {
   wr.write( postData );
}

258voto

Boann Punkte 46908

Hier ist ein einfaches Beispiel, das ein Formular absendet und dann die Ergebnisseite an System.out . Ändern Sie natürlich die URL und die POST-Parameter nach Bedarf:

import java.io.*;
import java.net.*;
import java.util.*;

class Test {
    public static void main(String[] args) throws Exception {
        URL url = new URL("http://example.net/new-message.php");
        Map<String,Object> params = new LinkedHashMap<>();
        params.put("name", "Freddie the Fish");
        params.put("email", "fishie@seamail.example.com");
        params.put("reply_to_thread", 10394);
        params.put("message", "Shark attacks in Botany Bay have gotten out of control. We need more defensive dolphins to protect the schools here, but Mayor Porpoise is too busy stuffing his snout with lobsters. He's so shellfish.");

        StringBuilder postData = new StringBuilder();
        for (Map.Entry<String,Object> param : params.entrySet()) {
            if (postData.length() != 0) postData.append('&');
            postData.append(URLEncoder.encode(param.getKey(), "UTF-8"));
            postData.append('=');
            postData.append(URLEncoder.encode(String.valueOf(param.getValue()), "UTF-8"));
        }
        byte[] postDataBytes = postData.toString().getBytes("UTF-8");

        HttpURLConnection conn = (HttpURLConnection)url.openConnection();
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
        conn.setRequestProperty("Content-Length", String.valueOf(postDataBytes.length));
        conn.setDoOutput(true);
        conn.getOutputStream().write(postDataBytes);

        Reader in = new BufferedReader(new InputStreamReader(conn.getInputStream(), "UTF-8"));

        for (int c; (c = in.read()) >= 0;)
            System.out.print((char)c);
    }
}

Wenn Sie das Ergebnis als String statt direkt auszudrucken, tun:

        StringBuilder sb = new StringBuilder();
        for (int c; (c = in.read()) >= 0;)
            sb.append((char)c);
        String response = sb.toString();

66voto

Craigo Punkte 2962

Ich konnte nicht bekommen Alans Beispiel um den Beitrag zu verfassen, und so kam ich zu dem hier:

String urlParameters = "param1=a&param2=b&param3=c";
URL url = new URL("http://example.com/index.php");
URLConnection conn = url.openConnection();

conn.setDoOutput(true);

OutputStreamWriter writer = new OutputStreamWriter(conn.getOutputStream());

writer.write(urlParameters);
writer.flush();

String line;
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));

while ((line = reader.readLine()) != null) {
    System.out.println(line);
}
writer.close();
reader.close();

25voto

hgoebl Punkte 11964

Ich finde HttpURLConnection wirklich umständlich zu bedienen. Außerdem muss man eine Menge fehleranfälligen Standardcode schreiben. Ich brauchte einen leichtgewichtigen Wrapper für meine Android-Projekte und kam mit einer Bibliothek heraus, die Sie auch verwenden können: DavidWebb .

Das obige Beispiel könnte folgendermaßen geschrieben werden:

Webb webb = Webb.create();
webb.post("http://example.com/index.php")
        .param("param1", "a")
        .param("param2", "b")
        .param("param3", "c")
        .ensureSuccess()
        .asVoid();

Eine Liste der alternativen Bibliotheken finden Sie unter dem angegebenen Link.

14voto

Manish Mistry Punkte 157
import java.net.*;

public class Demo{

  public static void main(){

       String data = "data=Hello+World!";
       URL url = new URL("http://localhost:8084/WebListenerServer/webListener");
       HttpURLConnection con = (HttpURLConnection) url.openConnection();
       con.setRequestMethod("POST");
       con.setDoOutput(true);
       con.getOutputStream().write(data.getBytes("UTF-8"));
       con.getInputStream();

    }

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X