Ana içeriğe atla

Commons Httpclient

Jakarta tarafından geliştirilen bu proje HTTP protokolünde esnek bir erişim olanağını uygulamalarınızda kullanmanızı sağlamaktadır. Bir çok uygulama HTTP protokolü kullanarak web üzerinden bilgi alımını Httpclient projesiyle gerçekleştirmektedir. Ben de çalışmasını denemek ve kullanımının kolaylığını anlamak için örnek bir proje yaptım.
Bu projedeki amacım Google ve Altavista'daki dil çevirme yeteneklerine Httpclient ile erişerek bir metin kutusundaki metni seçilen diller arasında (Türkçe desteği yok, çünkü bu servislerin de Türkçe desteği yok) çevirmesini sağlamak. Bunu yapmamın tek amacı Httpclient'ın yeteneklerini denemekten ibaret. Bunu siz çok daha farklı işler için de kullanabilirsiniz.

Aşağıda yaptığım uygulamanın ekran görüntüsü var:

Gelelim bir HTTP servisine erişmek için ne yaptığım konusuna; Aşağıdaki sınıf sizin de işinizi görecektir. Post ile çağrılan formları program içerisinden çağırmanızı mümkün kılacaktır. Dilerseniz GET yöntemini de desteklemek için sınıfı genişletebilirsiniz. Bu sınıftaki executeMethod metodunu çalıştırdığınız zaman sayfada submit düğmesine basmanızla ilgili eylemin çalışmasıyla oluşan web sayfasının içeriği döndürülecektir. Daha sonra yapılan işlem bu web sayfasını içerisinden istediğiniz veriyi String parsing ile almaktır. Elbette bu yöntemin bir çok eksisi var ancak en kolayı budur :)

package net.tekrei.owt.utility;

import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.NameValuePair;
import org.apache.commons.httpclient.methods.PostMethod;

public class HttpUtility {

private static HttpUtility instance = null;
private HttpClient client = null;
private PostMethod method = null;

private HttpUtility() {
}

public static HttpUtility getInstance() {
if (instance == null) {
instance = new HttpUtility();
}
return instance;
}

/**
* Bu metod actionURL eylemini postData parametreleriyle calistirilmasini
* (POST olarak) gerceklestirir
*
* @param actionURL
* calistirilacak eylem
* @param postData
* parametreler
* @return eylemin sonucu olusan cikti html icerigi
* @throws Exception
*/
public String executeMethod(String actionURL, NameValuePair[] postData)
throws Exception {
String result = "";
// HttpClient nesnesi olusturalim
HttpClient client = getHttpClient();
// PostMethod olarak calistirilacak
PostMethod method = getPostMethod(actionURL, postData);
// Eylemi calistiralim
int status = client.executeMethod(method);
// Sonuc basarisiz ise gerekli cevabi dondurelim
if (status != HttpStatus.SC_OK) {
System.err.println("Metod Calismasi: " + method.getStatusLine());
result = "BAGLANTI HATASI";
} else {
// Metod istedigimiz gibi calisti
// Eylem sonucu uretilen html ciktisini dondurelim
result = method.getResponseBodyAsString();
}
// Baglantiyi birakalim
method.releaseConnection();
return result;
}

private PostMethod getPostMethod(String actionURL, NameValuePair[] postData) {
if (method == null) {
method = new PostMethod();
}
// Calistirilacak eylem adresi
method.setPath(actionURL);
// Parametreleri
method.setRequestBody(postData);
return method;
}

private HttpClient getHttpClient() {
if (client == null) {
client = new HttpClient();
}
return client;
}
}

Yaptığım programın kodlarını ve çalışan bir sürümünü şuradan indirebilirsiniz.

Kodu incelediğiniz zaman web sayfasındaki formda girilmesi gereken verilerin parametre olarak verildiğini göreceksiniz. Elbette bu formun eylemini gerçekleştiren sunucu taraflı script değiştikçe benimde kodumu uygun şekilde değiştirmem gerekecek. :)

Not:Singleton yazılım desenini bu kadar kullanıyorsun diye bir soru soracak olursanız hoşuma gittiği ve işimi kolaylaştırdığı için diyeceğim. Yakında bu "kötü" alışkanlığımdan (Bkz. Singleton kötüdür) kurtulmaya çalışacağım.

Kaynak:
http://wiki.apache.org/jakarta-httpclient/HttpClientPowered

Yorumlar

süleyman dedi ki…
httpclient kodumuzu nasıl çalıştıracağız? ne gerekli?küçük bir nasılyaparsak bunu işleyebiliriz.yani bahsedilen url yi httpclientin bir browseri mi var
?jar dosyaları ve kütüphanaleer nasıl kullanılacak
Tahir Emre Kalaycı dedi ki…
Merhaba,

Soruyu tam anlamadım ama sanırım JAR'ları nereye koyacağımızı soruyorsunuz. JAR dosyalarını yani gereken kütüphaneleri classpathe eklemek gerekiyor. Yazıda verdiğim örnek, her ne kadar sürümü eskise de, JARların classpathe koyulmasıyla çalışacaktır.

http://kodveus.blogspot.com/2008/06/jdbc-veritabanlar-classpath-falan-filan.html yazısının sonunda classpathlerden bahsetmiştim.
süleyman dedi ki…
claspath ayarları demiyorum.yazdığım java kodunu htppclient olarak bir web sayfasını parse etmem için nerde derlemem lazım.yani bunu nasıl yapacam? jakartanın httpclientı sanırım 4.0 bunlar lib ve jar dosyalarından oluşuyorum.java kodumu örnedğin sizin burda yazdığınız görünen kodu nasıl çalıştıracağım?benim sorum bu.
Tahir Emre Kalaycı dedi ki…
Merhaba,

Bir Eclipse projesi olarak derleyebilirsiniz veya bildiğimiz Java derlemesini kullanabilirsiniz. Bu noktada classpathe ihtiyacınız olacak. Jakarta'nın kütüphanesini bulabilmesi lazım benim yazdığım kodun.Benim indirebilirsiniz dediğim sıkıştırılmış dosyayı indirip içerisindeki OWT.bat dosyasını çalıştırdığınızda (GNU/Linux için OWT.sh) program çalışacaktır. Ben gerekli ayarları orada yapıyorum. O dosyaları inceleyip nasıl yapıldığını da görebilirsiniz. Bu dosyalar basit bir metin dosyasıdır.
Tahir Emre Kalaycı dedi ki…
Doğru çalışmayabilir çünkü google ve altavistanın hizmetleri değişmiştir.