Android ile bir Web Sitesinden Veri Okuma (Php & JSON)

Örneğin; bir haber uygulaması geliştiriyoruz.Fakat geliştirdiğimiz sitenin RSS i yetersiz yada yok ise mecburen sitenin kaynağına inerek html tag larini parse etmemiz gerekecek. İşte bu noktada aslında kullanabileceğimiz çeşitli yöntemler var. En çok kullanılanlar ise Client yani Android tarafında JSOUP kütüphanesi kullanarak,diğeri de php ile bot yazıp sonuçları web servis ile almak. Ben ikisini de ayrı yazı olarak anlatmayı düşündüm.Ama ben genelde bu tarz projelerde web servisi tercih ediyorum.Tag lari parçalama kısmını tamamen web serviste halledip android tarafında sadece web servisi çağırmak kalıyor. Veriyi çekeceğimiz site muhtemelen bizim elimizde olmadığı için site sahibi bir tane bile tag değiştirse android tarafını oturup baştan düzenlememiz gerekicek.Ama bunun yerine bu işlemi serviste yapmak daha kolay.Özellikle de php ile.
Şimdi bu yazıda yapacağımız örnek projeden bahsedeyim. Android kısmında sitemizdeki yazıları çekeceğiz.Tabi biraz php bilmek gerekiyor ama mantığı anlarsanız zorlanmazsınız.Çok karışık işler yapmayacağız. Siteden neleri çekeceğiz görsel olarak gösterelim:
Şimdi de çekeceğimz bu verilerin kaynaktaki kodlarını görelim.Hangi class da olduğu yada hangi id ye sahip vb. Sonrasında da web servisi yazmaya başlayacağız.
(Öğeyi denetle yaptığımızda gelen kodlar ile kaynaktaki kodlar farklı olabiliyor.Bot yazarken sonuç alamazsak kaynağı görüntüleyeceğiz.)
Şimdi web servisi yazmaya başlayalım.PHP ile bot yaparken aslında genelde 2 yol kullanılır. Birisi curl diğeri de file_get_gontents metodu. Curl daha fonksiyonel . O yüzden curl kullanarak hazırlayacağım botu.Ama ilerleyen derslerde file_get_contents ile de bir yazı yazmayı düşünüyorum.
Şimdi artık web servisimizi oluşturalım. thecodeprogram.php olarak oluşturdum ben. Gerekli açıklamaları kodlar üzerinde yaptım :
thecodeprogram.php
(.*?)@si';
//Burada da query içinden istediğimiz kısmı parçalayıp $basliklar değişkenine atıyoruz.
preg_match_all($parcala_baslik, $query, $basliklar);
echo "";
print_r($basliklar);
"";
?>
Şuan başlıkları aldık fakat daha bitmedi tabiki.Çıktısını göstermek için koydum.Devam edeceğiz fakat yukarıdaki kod bloğu bize şu çıktıyı verdi : Gördüğümüz gibi array şeklinde sonuçlar aldık.İşte biz bu arraylarin indekslerini json dizimize atıp döndüreceğiz. Mantık basit arkadaşlar.Şimdi web servise özet ve resim için eklemeler yapalım:
Özet eklemesi ile web servis devam :
(.*?)@si';
//Burada da query içinden istediğimiz kısmı parçalayıp $basliklar değişkenine atıyoruz.
preg_match_all($parcala_baslik, $query, $basliklar);
$parcala_ozet='@(.*?)@si'; //Özet için de query içinde arayacağımız kısımı bildirdik.
preg_match_all($parcala_ozet, $query, $ozetler);
print_r($ozetler);
?>
Şimdi son olarak da resimleri alalım.
(.*?)@si';
//Burada da query içinden istediğimiz kısmı parçalayıp $basliklar değişkenine atıyoruz.
preg_match_all($parcala_baslik, $query, $basliklar);
$parcala_ozet='@(.*?)@si'; //Özet için de query içinde arayacağımız kısımı bildirdik.
preg_match_all($parcala_ozet, $query, $ozetler);
$parcala_resim='@@si';
//Resimler için de query içinde arayacağımız kısımı bildirdik.
preg_match_all($parcala_resim, $query, $resimler);
echo "";
print_r($resimler);
"";
?>
Evet şimdi çekmek istediğimiz verileri array halinde tutmuş olduk.Sıra geldi bu array lari Json diziye atıp yollamak.
Web servisin son hali :
(.*?)@si';
//Burada da query içinden istediğimiz kısmı parçalayıp $basliklar değişkenine atıyoruz.
preg_match_all($parcala_baslik, $query, $basliklar);
$parcala_ozet='@(.*?)@si'; //Özet için de query içinde arayacağımız kısımı bildirdik.
preg_match_all($parcala_ozet, $query, $ozetler);
$parcala_resim='@@si';
//Resimler için de query içinde arayacağımız kısımı bildirdik.
//Bize android tarafında resimlerin linkleri lazım olduğu için src kısmını full değişken olarak belirttim.
preg_match_all($parcala_resim, $query, $resimler);
//Şimdi bu değişkenlerin bize getirdiği verileri ayrı ayrı array lere atayalım.
$gelen_basliklar=array();
for($i=0;$i
Web servisin JSON çıktısı da şu şekilde :
Görüldüğü üzere karmançorman görünüyo.Bunun için JSON Parser düzenleyecisi kullanırsak tag lari bulamda zorlanmayız. Ben bu adresi kullanıyorum.Burayı kullandıktan sonra web servisimizin çıktısı şu şekilde oldu :
Web kısmı uzun oldu ama tamamlandı şükür :) Şimdi Android kısmına geçelim. Tek activity kullanacağım. Birde bu activty de kullanacağım custom list için ayrı bir xml dosyamız olacak.Gerekli açıklamaları kod üzerinde yapacağım.Önce activity_main.xml kodlarını görelim :
activity_main.xml
Şimdi CustomList için oluşturacağımız layout dosyasını görelim :
customlist.xml
Şimdi ise JSON verimize ulaşabilmek için istek yollayacağımız bir class hazırladım.Bu kısıma url adresimizi gönderiyoruz ve response alıyoruz.
getResponse.java
package com.thekodprogram;
import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
public class getResponse {
public getResponse()
{
//constructor
}
public String getJSONData(String url)
{
String response=null;
DefaultHttpClient httpClient=new DefaultHttpClient();
HttpGet httpGet=new HttpGet(url);
httpGet.setHeader("Content-type", "application/json");
HttpEntity httpEntity=null;
HttpResponse httpResponse=null;
try{
httpResponse=httpClient.execute(httpGet);
httpEntity=httpResponse.getEntity();
response= EntityUtils.toString(httpEntity);
}catch (Exception e)
{
e.printStackTrace();
}
return response;
}
}
Şimdi de artık MainActivity.java kısmını ineleyelim.En önemli işleri bu class da yapıyoruz :
package com.thekodprogram;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.InputStream;
import java.util.ArrayList;
public class MainActivity extends Activity {
ListView veriler_listesi;
public String Url=" web servisinizin url adresi !!! ";
ProgressDialog p;
ArrayList<String> basliklar=new ArrayList<>();
ArrayList<String> ozetler=new ArrayList<>();
ArrayList<String> resim_linkleri=new ArrayList<>();
ArrayList<Bitmap> resimler=new ArrayList<>();
MyCustomAdapter adapter;
public class ParseJSONTask extends AsyncTask
{
@Override
protected void onPostExecute(Void aVoid) {
super.onPostExecute(aVoid);
p.dismiss();
for(int i=0;i {
public MyCustomAdapter(Context context, int textViewResourceId, ArrayList xmlList) {
super(context, textViewResourceId, xmlList);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View row = convertView;
if (row == null) {
LayoutInflater inflater = getLayoutInflater();
row = inflater.inflate(R.layout.customlist, parent, false);
}
//CustomList içerisindeki verilerimizi kendi oluşturduğumuz MyCustomAdapter ile doldurduk.
TextView baslik_textview=(TextView)row.findViewById(R.id.baslik_txt);
baslik_textview.setText(basliklar.get(position));
TextView ozet_textview=(TextView)row.findViewById(R.id.ozet_txt);
ozet_textview.setText(ozetler.get(position));
ImageView image=(ImageView)row.findViewById(R.id.logo);
image.setImageBitmap(resimler.get(position));
return row;
}
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
veriler_listesi=(ListView)findViewById(R.id.veriler_listview);
p=new ProgressDialog(this);
new ParseJSONTask().execute(); //Parse işlemlerini gerçekleştireceğimiz AsycnTask ı başlatıyoruz.
}
}
Manifest Dosyamızı da aşağıdaki gibi hazırlıyoruz.
AndroidManifest.xml
Biraz uzun bir yazı oldu.Bazı kısımları anlatmak benim içinde zor oldu.Umarım faydalı olur.
Bir sonraki yazıda görüşmek dileğiyle ...