Envoyer une requête HTTP POST en Java

laisse supposer cette URL...

http://www.example.com/page.php?id=10            

(ici id doit être envoyé dans une demande de poste)

je veux envoyer le id = 10 au page.php du serveur , qui l'accepte par la méthode POST.

Comment puis-je faire cela depuis Java?

j'ai essayé ceci:

URL aaa = new URL("http://www.example.com/page.php");
URLConnection ccc = aaa.openConnection();

mais je ne sais toujours pas comment l'envoyer par la poste

232
demandé sur th3an0maly 2010-07-24 14:28:10

8 réponses

Mise À Jour De La Réponse:

étant donné que certaines classes, dans la réponse originale, sont dépréciées dans la nouvelle version des composants HTTP Apache, je poste cette mise à jour.

soit dit en passant, vous pouvez accéder à la documentation complète pour plus d'exemples ici .

HttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost("http://www.a-domain.com/foo/");

// Request parameters and other properties.
List<NameValuePair> params = new ArrayList<NameValuePair>(2);
params.add(new BasicNameValuePair("param-1", "12345"));
params.add(new BasicNameValuePair("param-2", "Hello!"));
httppost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));

//Execute and get the response.
HttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();

if (entity != null) {
    InputStream instream = entity.getContent();
    try {
        // do something useful
    } finally {
        instream.close();
    }
}

Réponse Originale:

je recommande D'utiliser Apache HttpClient. son plus rapide et plus facile à mettre en œuvre.

PostMethod post = new PostMethod("http://jakarata.apache.org/");
NameValuePair[] data = {
    new NameValuePair("user", "joe"),
    new NameValuePair("password", "bloggs")
};
post.setRequestBody(data);
// execute method and handle any error responses.
...
InputStream in = post.getResponseBodyAsStream();
// handle response.

pour plus d'informations, consultez cette url: http://hc.apache.org /

269
répondu mhshams 2016-03-15 17:50:22

L'envoi d'une demande de courrier est facile en Java classique. En commençant par un URL , nous avons besoin de le convertir en un URLConnection en utilisant url.openConnection(); . Après cela , nous avons besoin de le mouler à un HttpURLConnection , de sorte que nous pouvons accéder à sa méthode setRequestMethod() pour définir notre méthode. Nous disons enfin que nous allons envoyer des données sur la connexion.

URL url = new URL("https://www.example.com/login");
URLConnection con = url.openConnection();
HttpURLConnection http = (HttpURLConnection)con;
http.setRequestMethod("POST"); // PUT is another valid option
http.setDoOutput(true);

nous devons alors indiquer ce que nous allons envoyer:

envoyer un formulaire simple

un POST normal provenant d'un formulaire http a un format bien défini . Nous devons convertir nos entrées dans ce format:

Map<String,String> arguments = new HashMap<>();
arguments.put("username", "root");
arguments.put("password", "sjh76HSn!"); // This is a fake password obviously
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;

nous pouvons ensuite joindre le contenu de notre formulaire à la demande http avec les en-têtes appropriés et l'envoyer.

http.setFixedLengthStreamingMode(length);
http.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
http.connect();
try(OutputStream os = http.getOutputStream()) {
    os.write(out);
}
// Do something with http.getInputStream()

"1519150920 Envoi" JSON

nous pouvons aussi envoyer json en utilisant java, c'est aussi facile:

byte[] out = "{\"username\":\"root\",\"password\":\"password\"}" .getBytes(StandardCharsets.UTF_8);
int length = out.length;

http.setFixedLengthStreamingMode(length);
http.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
http.connect();
try(OutputStream os = http.getOutputStream()) {
    os.write(out);
}
// Do something with http.getInputStream()

Rappelez-vous que différents serveurs acceptent différents types de contenu pour json, voir cette "question 1519190920".


envoyer des fichiers avec java post

envoyer des fichiers peut être considéré comme plus difficile à gérer que le format est plus complexe. Nous allons également ajouter le support pour envoyer les fichiers sous forme de chaîne, puisque nous ne voulons pas tamponner le fichier complètement dans la mémoire.

pour ceci, nous définir quelques méthodes d'aide:

private void sendFile(OutputStream out, String name, InputStream in, String fileName) {
    String o = "Content-Disposition: form-data; name=\"" + URLEncoder.encode(name,"UTF-8") 
             + "\"; filename=\"" + URLEncoder.encode(filename,"UTF-8") + "\"\r\n\r\n";
    out.write(o.getBytes(StandardCharsets.UTF_8));
    byte[] buffer = new byte[2048];
    for (int n = 0; n >= 0; n = in.read(buffer))
        out.write(buffer, 0, n);
    out.write("\r\n".getBytes(StandardCharsets.UTF_8));
}

private void sendField(OutputStream out, String name, String field) {
    String o = "Content-Disposition: form-data; name=\"" 
             + URLEncoder.encode(name,"UTF-8") + "\"\r\n\r\n";
    out.write(o.getBytes(StandardCharsets.UTF_8));
    out.write(URLEncoder.encode(field,"UTF-8").getBytes(StandardCharsets.UTF_8));
    out.write("\r\n".getBytes(StandardCharsets.UTF_8));
}

nous pouvons alors utiliser ces méthodes pour créer une requête post multipart comme suit:

String boundary = UUID.randomUUID().toString();
byte[] boundaryBytes = 
           ("--" + boundary + "\r\n").getBytes(StandardCharsets.UTF_8);
byte[] finishBoundaryBytes = 
           ("--" + boundary + "--").getBytes(StandardCharsets.UTF_8);
http.setRequestProperty("Content-Type", 
           "multipart/form-data; charset=UTF-8; boundary=" + boundary);

// Enable streaming mode with default settings
http.setChunkedStreamingMode(0); 

// Send our fields:
try(OutputStream out = http.getOutputStream()) {
    // Send our header (thx Algoman)
    out.write(boundaryBytes);

    // Send our first field
    sendField(out, "username", "root");

    // Send a seperator
    out.write(boundaryBytes);

    // Send our second field
    sendField(out, "password", "toor");

    // Send another seperator
    out.write(boundaryBytes);

    // Send our file
    try(InputStream file = new FileInputStream("test.txt")) {
        sendFile(out, "identification", file, "text.txt");
    }

    // Finish the request
    out.write(finishBoundaryBytes);
}


// Do something with http.getInputStream()
137
répondu Ferrybig 2017-05-23 12:02:51
String rawData = "id=10";
String type = "application/x-www-form-urlencoded";
String encodedData = URLEncoder.encode( rawData, "UTF-8" ); 
URL u = new URL("http://www.example.com/page.php");
HttpURLConnection conn = (HttpURLConnection) u.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty( "Content-Type", type );
conn.setRequestProperty( "Content-Length", String.valueOf(encodedData.length()));
OutputStream os = conn.getOutputStream();
os.write(encodedData.getBytes());
93
répondu DuduAlul 2017-10-21 18:51:31

la première réponse était excellente, mais j'ai dû ajouter try/catch pour éviter les erreurs de compilateur Java.

Aussi, j'ai eu des problèmes pour comprendre comment lire le HttpResponse avec les bibliothèques Java.

voici le code le plus complet:

/*
 * Create the POST request
 */
HttpClient httpClient = new DefaultHttpClient();
HttpPost httpPost = new HttpPost("http://example.com/");
// Request parameters and other properties.
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("user", "Bob"));
try {
    httpPost.setEntity(new UrlEncodedFormEntity(params, "UTF-8"));
} catch (UnsupportedEncodingException e) {
    // writing error to Log
    e.printStackTrace();
}
/*
 * Execute the HTTP Request
 */
try {
    HttpResponse response = httpClient.execute(httpPost);
    HttpEntity respEntity = response.getEntity();

    if (respEntity != null) {
        // EntityUtils to get the response content
        String content =  EntityUtils.toString(respEntity);
    }
} catch (ClientProtocolException e) {
    // writing exception to log
    e.printStackTrace();
} catch (IOException e) {
    // writing exception to log
    e.printStackTrace();
}
20
répondu Mar Cnu 2014-02-12 01:31:53

une manière simple d'utiliser les composants HTTP Apache est

Request.Post("http://www.example.com/page.php")
            .bodyForm(Form.form().add("id", "10").build())
            .execute()
            .returnContent();

regardez l'API Fluent 151950920"

14
répondu Mathias Bak 2013-11-30 16:22:18

façon la plus simple d'envoyer des paramètres avec la requête post:

String postURL = "http://www.example.com/page.php";

HttpPost post = new HttpPost(postURL);

List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("id", "10"));

UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params, "UTF-8");
post.setEntity(ent);

HttpClient client = new DefaultHttpClient();
HttpResponse responsePOST = client.execute(post);

vous avez fait. maintenant, vous pouvez utiliser responsePOST . Obtenez le contenu de la réponse comme chaîne de caractères:

BufferedReader reader = new BufferedReader(new  InputStreamReader(responsePOST.getEntity().getContent()), 2048);

if (responsePOST != null) {
    StringBuilder sb = new StringBuilder();
    String line;
    while ((line = reader.readLine()) != null) {
        System.out.println(" line : " + line);
        sb.append(line);
    }
    String getResponseString = "";
    getResponseString = sb.toString();
//use server output getResponseString as string value.
}
5
répondu chandan kumar 2017-03-22 07:12:33

je vous conseille d'utiliser http-request construit sur apache http api.

HttpRequest<String> httpRequest = HttpRequestBuilder.createPost("http://www.example.com/page.php", String.class)
.responseDeserializer(ResponseDeserializer.ignorableDeserializer()).build();

public void send(){
   String response = httpRequest.execute("id", "10").get();
}
1
répondu Beno Arakelyan 2017-09-17 12:14:30

Call HttpURLConnection.setRequestMethod("POST") et HttpURLConnection.setDoOutput(true); en fait, seul ce dernier est nécessaire car POST devient alors la méthode par défaut.

0
répondu user207421 2012-04-03 23:34:08