Vanilya Java'da bir POST isteği göndermek kolaydır. Bir başlayarak URL
, biz t bir dönüştürmek gerek URLConnection
kullanarak url.openConnection();
. Bundan sonra, onu bir yöntemine dökmeliyiz HttpURLConnection
, böylece setRequestMethod()
yöntemimizi ayarlamak için yöntemine erişebiliriz . Sonunda bağlantı üzerinden veri göndereceğimizi söylüyoruz.
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);
O zaman ne göndereceğimizi belirtmemiz gerekir:
Basit bir form gönderme
Bir http formundan gelen normal bir POST, iyi tanımlanmış bir biçime sahiptir. Girişimizi şu biçime dönüştürmeliyiz:
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;
Daha sonra form içeriklerimizi uygun başlıklarla http isteğine ekleyip gönderebiliriz.
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()
JSON gönderme
Json'u java kullanarak da gönderebiliriz, bu da kolaydır:
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()
Farklı sunucuların json için farklı içerik türlerini kabul ettiğini unutmayın, bu soruya bakın .
Java yayını ile dosya gönderme
Biçim daha karmaşık olduğu için dosya gönderme işlemlerinin daha zor olduğu düşünülebilir. Ayrıca dosyaları dize olarak göndermek için destek ekleyeceğiz, çünkü dosyayı tam olarak belleğe arabelleğe almak istemiyoruz.
Bunun için bazı yardımcı yöntemler tanımlarız:
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));
}
Daha sonra aşağıdaki yöntemleri kullanarak çok parçalı bir yayın isteği oluşturmak için bu yöntemleri kullanabiliriz:
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
aslında şimdi stackoverflow.com/a/9242394/1338936HttpPost
olarak adlandırılan görünüyor - sadece benim gibi bu cevabı bulan herkes için :)