L'envoi d'une requête POST est facile en Java vanille. En commençant par un URL
, nous avons besoin de t convertir en un URLConnection
utilisant url.openConnection();
. Après cela, nous devons le convertir en un HttpURLConnection
, afin que nous puissions accéder à sa setRequestMethod()
méthode pour définir notre méthode. Nous disons enfin que nous allons envoyer des données via 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 ensuite indiquer ce que nous allons envoyer:
Envoi d'un formulaire simple
Un POST normal provenant d'un formulaire http a un format bien défini . Nous devons convertir notre entrée 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()
Envoi de JSON
Nous pouvons également envoyer json en utilisant java, c'est aussi simple:
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()
N'oubliez pas que différents serveurs acceptent différents types de contenu pour json, voir cette question.
Envoi de fichiers avec Java Post
L'envoi de fichiers peut être considéré comme plus difficile à gérer car le format est plus complexe. Nous allons également ajouter la prise en charge de l'envoi des fichiers sous forme de chaîne, car nous ne voulons pas mettre le fichier entièrement en mémoire tampon.
Pour cela, nous définissons quelques méthodes d'assistance:
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 ensuite utiliser ces méthodes pour créer une demande de publication en plusieurs parties 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()
PostMethod
il semble que ce soit désormais appeléHttpPost
selon stackoverflow.com/a/9242394/1338936 - juste pour quiconque trouve cette réponse comme je l'ai fait :)