GET ve POST Metodları ve Java

GET ve POST kısaca http’de kullanılan metodlardır. HTML altında bir form oluşturduğunuzda bu form default haliyle GET istekeleri üretir. Eğer formunuzun POST istekleri üretmesini isterseniz bunu form tagınızın altında method özelliği ile belirtirsiniz.

Peki tam olarak GET ve POST metodlarının farkı nedir?

Bu iki method ile istekleri Java kullanarak nasıl gönderebiliriz?

İş yerimde rast geldiğim bir olay üzerine kısaca araştırdığım bu soruların cevapları bu günkü yazımın başlıca konusu haline gelecek.

GET vs POST

Asıl konuya, yani java ile bu iki çağrının nasıl yapılacağına, gelmeden önce iyice netleşmesi açısından GET ve POST metodlarının farklarına kısaca bir göz atalım.

Eğer bir html formu tasarlamış ve test etmişseniz, şu ana kadar zaten en temel farkı görmüşsünüzdür. Eğer GET metodu kullanıyorsanız internet tarayıcınızda gönderdiğiniz datayı görebilirsiniz. Tabi POST için bu geçerli değil. POST metodlarının verileri HTTP isteğinin içerisinde gönderiliyorlar. İlerki bölümde Java ile örneğini yaptığımızda daha iyi anlayacaksınız.

Sonraki önemli farklardan biri yapabileceğiniz çağrıların uzunluğu. GET ile sadece 255 karakter uzunluğunda çağrı yapabilirken, POST ile 32000 karakter uzunluğuna kadar çağrı üretebiliyorsunuz.

Bunun yanı sıra GET istekleri sadece text olurken, ki bu textlerde sadece ASCII olmak durumunda, POST istekleri için böyle bir kısıtlamanız yok. Binary de dahil olmak üzere bir çok şekilde veri gönderebiliyorsunuz. Yine bu farkı ileride Java kodumuzu yazarken göreceksinizdir.

Performans açısından değerlendirecek olursak, tahmin edeceğiniz üzere GET istekleri, POST isteklerinden çok daha hızlı istekler. Sadece bir soru işareti koyup hazır hale gelecek kadar basit olduklarından GET isteklerinin daha hızlı olduğuna şaşırmamak gerekir.

Ayrıca HTML 4.01 Spesifikasyonu* GET ve POST metodlarının hangisinin ne zaman kullanıması gerektiğini, yaptığınız işin yani submit edilen formun ne tür değişiklikler yapacağıyla ilişkilendirmiş. Mesela kısa bir database taraması yapacaksa GET metodunun kullanılmasını tavsiye etmiş. Yani herhangibir yan etki oluşmayacaksa, durumun değişmesi gibi, GET metodu kullanılması tavsiye ediliyor. Fakat durumda bir değişikliğe yol açacaksa database’de bir şey değiştirecekse falan POST metodunun kullanılması gerektiğini söylüyor.

GET ve POST isteklerinin Java’da Üretilmesi

Bu kısma başlamadan önce şunu belirtmemde fayda var. Burada sadece Http isteklerinin nasıl oluşturulacağı ve cevaplarının nasıl yorumlanabileceğini anlatacağım. Ayrınca bir form oluşturup nasıl gerçekleştirileceği üzerinde durmayacağım. Bir http isteği oluşturmakta zorlanacağınızı düşünmüyorum.

Öncelikle basit olandan başlayalım. GET isteklerinin nasıl üretileceğine bakalım. Bunun için içinde sadece bir static methodu olan bir class yazdım.

HttpGetRequest.java


import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

public class HttpGetRequest {

public static String sendGetRequest(String hostAddress, String data) {
String result = null;
if (hostAddress.startsWith("http://")) {
try {
String urlAsString = createGetUrl(hostAddress, data);
URL url = new URL(urlAsString);
URLConnection urlConnection = url.openConnection();
result = parseGetResponse(urlConnection);
} catch (IOException e) {
System.out.println("Bağlantı Hatası...M: " + e.getMessage());
}
}
return result;
}

private static String createGetUrl(String hostAddress, String args) {
String urlAsString = hostAddress;
if (args != null && args.length() > 0) {
urlAsString += "?" + args;
}
return urlAsString;
}

private static String parseGetResponse(URLConnection urlConnection) {
String result = "";
BufferedReader bufferedReader;
try {
bufferedReader = new BufferedReader(new InputStreamReader(
urlConnection.getInputStream()));
StringBuffer stringBuffer = new StringBuffer();
String line;
while ((line = bufferedReader.readLine()) != null) {
stringBuffer.append(line);
}
bufferedReader.close();
result = stringBuffer.toString();
} catch (IOException e) {
System.out
.println("GET Response parse edilirken hata ile karşılaşıldı. M:"
+ e.getMessage());
}
return result;
}
}

Kodun ne yaptığından kısaca basedecek olursak, verdiğiniz sunucu adresine, ki bizim durumumuzda html formunu içinde barındıran adres oluyor, verdiğimiz argumanları gönderecek. Koddan da anlayacağınız üzere ? ile uğraşmanıza gerek yok kod kendisi bunu sizin yerinize hallediyor.

Örnek bir kullanımda isterseniz 192.168.1.38 sunucuna Command=Set verisini göndermek için “HttpGetRequest.sendGetRequest(“http://192.168.1.38”, “Command=Set”);” şekilnde bir satır yeterli olacaktır.

Şimdi biraz daha zor olan kısma geliyoruz. Ne gönderdiğimiz data sadece yazı olacak kadar kolay nede kullanacağımız metod POST olacağından alacağım data yine bir string olacak kadar kolay olmayacak.

Bunun için yine tek bir metodu olan bir class yazdım.

HttpPostRequest.java


import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;
import java.net.HttpURLConnection;
import java.net.ProtocolException;
import java.net.URL;

public class HttpPostRequest {

public static void sendPostRequest(Reader data, URL hostAddress,
Writer output) {
HttpURLConnection urlc = null;

try {
urlc = setHttpConnectionRequestMethod(hostAddress);
configureHttpConnection(urlc);
OutputStream out = urlc.getOutputStream();
postData(data, out);
parsePostResponse(output, urlc);

} catch (IOException e) {
System.out.println("Bağlantı Hatası...M: " + e.getMessage());
} finally {
if (urlc != null)
urlc.disconnect();
}
}

private static void parsePostResponse(Writer output, HttpURLConnection urlc)
throws IOException {
InputStream in = urlc.getInputStream();
try {
Reader reader = new InputStreamReader(in);
pipe(reader, output);
reader.close();
} catch (IOException e) {
System.out.println("Response okunurken hata ile karşılaşıldı. M:"
+ e.getMessage());
} finally {
if (in != null)
in.close();
}
}

private static void postData(Reader data, OutputStream out)
throws IOException {
try {
Writer writer = new OutputStreamWriter(out, "UTF-8");
pipe(data, writer);
writer.close();
} catch (IOException e) {
System.out.println("Data Post Edilirken Hata ile karşılaşıldı. M:"
+ e.getMessage());
} finally {
if (out != null)
out.close();
}
}

private static HttpURLConnection setHttpConnectionRequestMethod(URL endpoint)
throws IOException {
HttpURLConnection urlc;
urlc = (HttpURLConnection) endpoint.openConnection();
try {
urlc.setRequestMethod("POST");
} catch (ProtocolException e) {
System.out
.println("HttpURLConnection oluşturulamadı. Bu bağlantı POST desteklemiyor olabilir. M:"
+ e.getMessage());
}
return urlc;
}

private static void configureHttpConnection(HttpURLConnection urlc) {
urlc.setDoOutput(true);
urlc.setDoInput(true);
urlc.setUseCaches(false);
urlc.setAllowUserInteraction(false);
urlc.setRequestProperty("Content-type", "text/xml; charset=" + "UTF-8");
}

private static void pipe(Reader reader, Writer writer) throws IOException {
char[] buf = new char[1024];
int read = 0;
while ((read = reader.read(buf)) >= 0) {
writer.write(buf, 0, read);
}
writer.flush();
}
}

Post için anında bir örnek kullanım bulamadığımdan bu kısmı geçiyorum. Ama elinizde POST için yazılmış bir form varsa bu örnek içinde zorlanacağınızı zannetmiyorum.

End Of Line