26 Haziran 2018 Salı

URL Sınıfı

Giriş
Şu satırı dahil ederiz.
import java.net.URL;
- Bu sınıfı kullanmak URLConnection veya HttpURLConnection sınıfını kullanmaktan daha kolay.
Bu sınıfın openConnection() metodu URLConnection nesnesi döner. Bu nesne HttpURLConnection olabilir.

- Bu sınıfı URI sınıfına çevirmek te mümkün

URL şu kısımlardan oluşur.
scheme:[//host[:port]][/]path[?query][#fragment]
Bir URL'nin location kısmı büyük küçük harf farkından etkilenmez, ancak data kısmı etkilenebilir.
 scheme:[//host[:port]][/]path[?query][#fragment]
 \____________________/\________________________/
        Location                 Data
Biraz daha kolay anlaşılır bir gösterim şöyle
   foo://example.com:8042/over/there?name=ferret#nose
    \_/   \______________/\_________/ \_________/ \__/
     |           |            |            |        |
  scheme     authority       path        query   fragment
path alanından sonra gelen parametreler ? karakteri ile başlar. Şu url doğru olan
http://192.168.2.33:554?user=admin&password=&channel=2&stream=1.sdp
Ancak bir çok tarayıcı ? karakterinin önüne / karakterini ekliyor. Niçin bilmiyorum
http://192.168.2.33:554/?user=admin&password=&channel=2&stream=1.sdp
Örnek - Jar İçindeki File
Şöyledir. Burada scheme "jar:file:" şeklinde. 
jar:file:/C:/foo.jar!/res/bar.htm
constructror - String
Şöyle yaparız.
URL url = new URL("http://my.real.url.com/");
Bu metod exception atabilir.
try {
  URL url  = new URL("https://...");
} catch (MalformedURLException e) {
  ...
}
getPath metodu
Şöyle yaparız.
String url1 = new URL("http://1.1.1.1/dl/pi/1").getPath(); // returns /dl/pi/1
String url2 = new URL("https://www.example.org/dl/pi/1").getPath(); // returns /dl/pi/1

System.out.println(url1.equals(url2));
openConnection metodu - Proxy 
Proxy nesnesini oluşturmak için şöyle yaparız.
InetSocketAddress proxyLocation = new InetSocketAddress(proxyHost, proxyPort);
Proxy proxy = new Proxy(Proxy.Type.HTTP, addr);
Ya da şöyle yaparız.
SocketAddress addr = new InetSocketAddress("my.proxy.com", 8080);
Proxy proxy = new Proxy(Proxy.Type.HTTP, addr);
Daha sonra bir bağlantı açarız. Bu metod hemen GET veya POST isteği göndermez. Şöyle yaparız.
URLConnection connection = url.openConnection(proxy);
Çoğu kod connection nesnesini cast ediyor.
HttpURLConnection httpURLConnection =
  (HttpURLConnection) url.openConnection(proxy);
Daha sonra proxy bilgisi doldurulur. Bu yöntem HTTP için çalışıyor.
String encoded = new sun.misc.BASE64Encoder().
encodeBuffer((proxyUserName + ":" + proxyPassword).getBytes()).replace("\r\n","");
httpURLConnection.setRequestProperty("Proxy-Authorization", "Basic " + encoded);
HTTPS için proxy bilgisi şöyle doldurulur.
// Works for HTTP and HTTPS, but sets a global default!
Authenticator.setDefault(new Authenticator() {
  protected PasswordAuthentication getPasswordAuthentication() {
    return new PasswordAuthentication(proxyUserName, proxyPassword.toCharArray());
  }
});
En son olarak URLConnection sınıfının getInputStream metodu çağrılırsa adres http ise GET veya POST isteği yapılır.

Proxy ile çalışırken önce proxy adresine şu istek gönderilir.
CONNECT stackoverflow.com:443 HTTP/1.0\r\n
Proxy-Authorization: Basic c2F5WW91SGF2ZVNlZW5UaGlzSW5UaGVDb21tZW50cw==\r\n
\r\n
Proxy isteği kabul ederse şöyle başlayan bir cevap verir.
HTTP/1.0 200
Daha sonra gerçekten bağlanmak istediğimiz adresi veririz.
GET /questions/3304006/persistent-httpurlconnection-in-java HTTP/1.0\r\n
Host: stackoverflow.com\r\n
\r\n
Proxy bizim adımıza bağlantı kurup cevabı gönderir.

openStream metodu
Bir InputStream döner. Eğer adres http ise GET isteği gönderir. Sunucu 404 gönderirse exception fırlatır.
Örnek
Şöyle yaparız.
String url = "http://...";

try {
  InputStream in = new java.net.URL(url).openStream();
  ...
} catch (MalformedURLException e) {
    e.printStackTrace();
} catch (FileNotFoundException e) {
    e.printStackTrace();
}
Örnek
XML'i okumak için şöyle yaparız.
URL url = new URL("http://www.rssmix.com/u/8171434/rss.xml");
Document doc = builder.parse(url.openStream());
Örnek
Bellekteki bir değişkene okumak için Apache Commons IO kullanarak şöyle yaparız.
final URL url = new URL("http://pat/to.tile");
final String content = IOUtils.toString(url.openStream(), "UTF-8");
Örnek
Satır satır okumak için şöyle yaparız.
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String inputLine;
ArrayList <String> arr = new ArrayList<String>();
while ((inputLine = in.readLine()) != null)
{
  arr.add(inputLine);
}

in.close();
toURI metodu
Şöyle yaparız
URL url = ...;
URI uri = url.toURI();

Hiç yorum yok:

Yorum Gönder