23 Aralık 2019 Pazartesi

HttpURLConnection Sınıfı - Send and Receive Data

Giriş
Şu satırı dahil ederiz. Bu sınıf Java 1.1'den beri var. Yani kullanım tarzı olarak oldukça eski. 
Bu sınıfın kardeşi HttpsURLConnection sınıfı. Java 11 ile gelen HTTPClient  daha iyi
import java.net.HttpURLConnection;
Persitent connection kullanır. Açıklaması şöyle
By default, the HttpURLConnection is smart enough to reuse a connection to the same host if keep-alive is enabled by the host.
Bu sınıfın C#'taki karşılığı WebRequest sınıfıdır. Bu sınıfla ilgili en açıklayıcı örnekler burada. Bu sınıfla şu işleri yapabiliriz. 
GET
GET + Sorgu Parametreleri
POST + Sorgu Parametreleri

Kullanım
Örnek - GET
Şöyle yaparız. Burada sadece getInputStream tüketiliyor. HttpURLConnection.disconnect() ile kapatılıyor
String url = "https://api.github.com/users/google";
HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod("GET");

int status = con.getResponseCode();             
if (status == 200) {
  BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
  ...
  in.close(); 
} con.disconnect();
Örnek - GET
Şöyle yaparız. Burada  HttpURLConnection.disconnect ile kapatılıyor
URL url = new URL("http://example.com"); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setRequestProperty("User-Agent", "Java HttpURLConnection"); try (BufferedReader reader = new BufferedReader( new InputStreamReader(connection.getInputStream()))) { StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } // Process the response content System.out.println(response.toString()); } connection.disconnect();
Örnek - GET
Şöyle yaparız. Burada gerekirse getInputStream, gerekirse getErrorStream tüketiliyor.
byte[] responseBody(HttpURLConnection conn) throws IOException { try (InputStream in = getStream(conn)) { if (in != null) { ByteArrayOutputStream out = new ByteArrayOutputStream(); in.transferTo(out); return out.toByteArray(); } } return EMPTY_BYTE_ARRAY; } InputStream getStream(HttpURLConnection conn) throws IOException { InputStream inputStream; int responseCode = conn.getResponseCode(); if (responseCode < HttpURLConnection.HTTP_BAD_REQUEST) { inputStream = conn.getInputStream(); } else { inputStream = conn.getErrorStream(); } return inputStream; }

Örnek - POST
Şöyle yaparız.
String url = "https://httpbin.org/post";

HttpURLConnection con = (HttpURLConnection) new URL(url).openConnection();
con.setRequestMethod("POST");
con.setRequestProperty("User-Agent", "Mozilla/5.0");
con.setDoOutput(true);

String data = "custname=google";
OutputStream os = con.getOutputStream();
os.write(data.getBytes());
os.flush();
os.close();

int status = con.getResponseCode();
if (status == HttpURLConnection.HTTP_OK) {
  BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
  ...
  in.close();
}
constructor
Şöyle yaparız.
URL url = new URL("https://www.youtube.com/results");
HttpURLConnection con = (HttpURLConnection)url.openConnection();
disconnect metodu
Şöyle yaparız.
con.disconnect(); 
getErrorStream metodu
Örnek
Şöyle yaparız.
HttpURLConnection con = ... 
...
int responseCode = con.getResponseCode();
InputStream inputStream;
if (200 <= responseCode && responseCode <= 299) {
  inputStream = con.getInputStream();
} else {
  inputStream = con.getErrorStream();
}
getInputStream metodu
Örnek
Post isteğini cevabını okumak için önce stream'i elde ederiz. Şöyle yaparız.
InputStream in;
if(con.getResponseCode() == HttpURLConnection.HTTP_OK){
  in = connection.getInputStream();
} else {
  in = connection.getErrorStream();
}
if(null == in){
  return String.valueOf(connection.getResponseCode());
}
Eğer okunacak bir stream varsa şöyle yaparız.
BufferedReader reader = new BufferedReader(
                    new InputStreamReader(con.getInputStream()));
Cevabı StringBuilder'a toplamak için şöyle yaparız.
StringBuilder response = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(in))) {
  String line;
  while (null != (line = reader.readLine())) {
    response.append(line);
    response.append("\r");
  }
}
getOutputStream metodu
Post isteğinde şöyle yaparız.
//Send request
try(DataOutputStream outputStream = new DataOutputStream(con.getOutputStream())){
  JsonObject jsonParam = new JsonObject();
  jsonParam.putString("loginName", "loginName");
  outputStream.writeBytes(jsonParam.toString());
  outputStream.flush();
}
getResponseCode metodu
Örnek
Bazı kodlarda direk 200 ile karşılaştırma yapılıyor. Şöyle yaparız.
int status = con.getResponseCode();
if (status == 200) {...}
Ben tanımlı sabitleri kullanmayı tercih ediyorum.Şöyle yaparız.
if(con.getResponseCode() == HttpURLConnection.HTTP_OK){
  ...
}
setDoOutput metodu
Post işlemi ile nesnenin OutputStream'ine bir şey yazacaksak şöyle yaparız.
con.setDoOutput(true);
setFixedLengthStreamingMode metodu
Şöyle yaparız.
byte[] bytes = ...;
con.setFixedLengthStreamingMode(bytes.length);
setFollowRedirects metodu
Şöyle yaparız.
HttpURLConnection.setFollowRedirects(false);
setRequestMethod metodu
Şöyle yaparız.
con.setRequestMethod("POST");
setRequestProperty metodu
Örnek
Eğer GET isteği için kullanıyorsak ve parametre gönderiyorsak şöyle yaparız. Böylece sunucuya UTF-8 okuyabildiğimizi bildiririz. Sunucu da parametrelerin muhtemelen UTF-8 olduğunu düşünür.
URLConnection connection = new URL(url + "?" + query).openConnection();
connection.setRequestProperty("Accept-Charset", "UTF-8");
Örnek
Şöyle yaparız.
con.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
Örnek
Şöyle yaparız.
con.setRequestProperty("Content-Type",
                        "application/x-www-form-urlencoded;charset=UTF-8");
Örnek
Şöyle yaparız.
con.setRequestProperty("Content-Length",...);
setUseCaches metodu
Şöyle yaparız.
con.setUseCaches(false);


Hiç yorum yok:

Yorum Gönder