Android ile RESTful Web Servisi Kullanımı

Nisan 28, 2013

Merhaba arkadaşlar, Android ile diğer iletişim cihazları ile haberleşme konusunda web servisleri çok aktif bir şekilde kullanılmaktadır bu yazımızda RESTful servislerini inceleyeceğiz.Oldukça hızlı bir yapıya sahiptir veri tipi olarak json kullanıyor olacağız.Daha önceleri kullandığımız ksoap2 artık yavaş kalmakta ve geliştirilmemektedir.Android cihazdan servisi kullanmak için ilk önce Asp.Net ile bir sayfa hazırlayacağız ve bu sayfa da gelen paramereyi okuyarak local bilgisayarımızda bulunan veri tabanını sorgulayarak ulaştığımız veriyi json formatında yazdıracağız daha sonra Android ile yazacağımız uygulamada bu sayfaya istekde bulunarak geri dönen json veri yi okuyarak işlem yaypacağız RESTful ile ilgili daha detaylı bilgiye buradan ulaşabilirsiniz.

İlk olarak Asp.Net ile bir proje oluşturalım ve sayfamızda şu kodları yazalım

.Net projesinde Android ile bağlanacağımız sayfayı hazırlıyoruz.Bu kodları sayfanın Page_Load olayına yazıyoruz


            Response.Clear();
            Response.ClearContent();
            Response.ClearHeaders();

            int productID = Convert.ToInt32(Request.QueryString["ProductID"]);

            string strSonuc = "";

            try
            {
                string conStr = "data source=.;database=Northwind;user=Android;password=123456;Integrated Security=True;";

                SqlConnection connection = new SqlConnection(conStr);
                connection.Open();

                string sorgu = "select p.ProductID,p.ProductName,c.CategoryName,p.UnitPrice from Products p join " +
                                                    "Categories c on p.CategoryID = c.CategoryID where p.ProductID = @productID";

                SqlCommand cmd = new SqlCommand(sorgu, connection);
                cmd.Parameters.AddWithValue("@productID", productID);

                SqlDataReader reader = cmd.ExecuteReader();

                while (reader.Read())
                {
                    var nes = new
                    {
                        ProductID = reader["ProductID"].ToString(),
                        ProductName = reader["ProductName"].ToString(),
                        CategoryName = reader["CategoryName"].ToString(),
                        UnitPrice = reader["UnitPrice"].ToString()
                    };
                    strSonuc = new System.Web.Script.Serialization.JavaScriptSerializer().Serialize(nes);
                }
            }
            catch (Exception ex)
            {
                strSonuc = "Hata : " + ex.Message;
            }

            Response.Write(strSonuc);


Bu kodlar yardımı ile url de parametre olarak gelen ProductID değerini okuyoruz ve local bilgisayırımda bulunan Northwind veri tabanına bağlantı kurarak Products tablosunda sorgulama yapıyoruz.Bu örneğimizde senaryo olarak kullanıcının ID bilgisine göre Products tablosunu sorgulamasını yapıyoruz.

Bu projeyi IIS altında yayınlayıp sayfaya bağlantı kurduğumuz zaman ise çıktısı şu şekildedir



Url kısmında görülen 192.168.1.222 bilgisi benim local bilgisayarımız ip bilgisidir.Siz kendi bilgisayarınızın ip adresini yazmalısınız.Bunu öğrenmek için Çalıştır > cmd > ipconfig > IPv4 Address sizin bilgisayarınızın ip adresidir

Web sayfamızı IIS altında yayınladıktan sonra .Net tarafında işimiz bitiyor şimdi Android uygulamamızı geliştirelim

Android uygulamamızın arayüzü



<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:layout_marginTop="20dp" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:text="ID" />

        <EditText
            android:id="@+id/etID"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginRight="5dp" >

            <requestFocus />
        </EditText>
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:layout_marginTop="70dp" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:text="Product Name" />

        <EditText
            android:id="@+id/etProductName"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginRight="5dp" >

            <requestFocus />
        </EditText>
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:layout_marginTop="120dp" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:text="Category Name" />

        <EditText
            android:id="@+id/etCategoryName"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginRight="5dp" >

            <requestFocus />
        </EditText>
    </LinearLayout>

    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="50dp"
        android:layout_marginTop="170dp" >

        <TextView
            android:id="@+id/textView1"
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:text="Unit Price" />

        <EditText
            android:id="@+id/etUnitPrice"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_marginRight="5dp" >

            <requestFocus />
        </EditText>
    </LinearLayout>

    <Button
        android:id="@+id/bSorgula"
        android:layout_width="fill_parent"
        android:layout_height="40dp"
        android:layout_marginTop="250dp"
        android:text="Sorgula" />

</RelativeLayout>


Basit bir çalışma yaptığımız için uygulamanın arayüz’ününde oldukça sade olmasına özen gösterdim amacımız ekrandan ProductID bilgisini aldıktan sonra local veritabanında sorgulayarak gelen veriyi ekrandaki kontrollere atamak

Arayüz çalışmasından sonra

MainActivity.java sınıfı kodlarımız



package com.example.webserviceapp;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener {

	Button bSorgula;
	EditText etID, etProductName, etCategoryName, etUnitPrice;

	@Override
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		bSorgula = (Button) findViewById(R.id.bSorgula);
		bSorgula.setOnClickListener(this);

		etID = (EditText) findViewById(R.id.etID);
		etProductName = (EditText) findViewById(R.id.etProductName);
		etCategoryName = (EditText) findViewById(R.id.etCategoryName);
		etUnitPrice = (EditText) findViewById(R.id.etUnitPrice);

	}

	@Override
	public void onClick(View v) {
		new myAsyncTask("Yükleniyor").execute();
	}

	private class myAsyncTask extends AsyncTask<Void, Void, Void> {

		String modalMesaj;
		ProgressDialog dialog;

		JSONObject jsonObject = null;

		String productName = "";
		String categoryName = "";
		String unitPrice = "";

		public myAsyncTask(String mMesaj) {
			this.modalMesaj = mMesaj;
			this.dialog = new ProgressDialog(MainActivity.this);
		}

		@Override
		protected void onPreExecute() {
			dialog.setMessage(modalMesaj);
			dialog.setIndeterminate(true);
			dialog.setCancelable(false);
			dialog.show();
		}

		@Override
		protected Void doInBackground(Void... params) {

			Integer productID = Integer.valueOf(etID.getText().toString());

			String url = "http://192.168.1.222:8080/AndWeb/Products.aspx?ProductID="
					+ productID;

			HttpClient httpclient = new DefaultHttpClient();

			HttpGet httpget = new HttpGet(url);

			HttpResponse response;
			try {
				response = httpclient.execute(httpget);

				HttpEntity entity = response.getEntity();

				if (entity != null) {
					InputStream instream = entity.getContent();
					String result = convertStreamToString(instream);

					jsonObject = new JSONObject(result);

					instream.close();
				}

			} catch (ClientProtocolException e) {
				Mesaj(e.getMessage());
			} catch (IOException e) {
				Mesaj(e.getMessage());
			} catch (JSONException e) {
				Mesaj(e.getMessage());
			}

			return null;
		}

		@Override
		protected void onPostExecute(Void str) {

			if (dialog.isShowing())
				dialog.dismiss();

			try {

				productName = jsonObject.getString("ProductName").toString();
				categoryName = jsonObject.getString("CategoryName").toString();
				unitPrice = jsonObject.getString("UnitPrice").toString();

				etProductName.setText(this.productName);
				etCategoryName.setText(this.categoryName);
				etUnitPrice.setText(this.unitPrice);

			} catch (JSONException e) {
				e.printStackTrace();
			}

		}
	}

	private static String convertStreamToString(InputStream is) {

		BufferedReader reader = new BufferedReader(new InputStreamReader(is));
		StringBuilder sb = new StringBuilder();

		String line = null;
		try {
			while ((line = reader.readLine()) != null) {
				sb.append(line + "\n");
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			try {
				is.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		return sb.toString();
	}

	private void Mesaj(String s) {

		Toast.makeText(this, s, Toast.LENGTH_LONG).show();
	}

}


Uygulama arayüz’ünde eklediğimiz kontrollere kod tarafından ulaşıp gerekli atamaları yapıyoruz.Uygulamada web servisi kullanacağımız için bu işlemi asynctask kullanarak yapmak zorundayız bunun nedeni ise Android ‘in yeni sürümlerinde main thread de internet ile ilgili bir işlemin yapılamaması.AsyncTask ‘ı başlatıyoruz ve doInBackground() kısmında işlemlerimizi yapıyoruz.Hazırladığımız web sayfasının url’ini belirterek bağlanıyoruz ve uygulamadan aldığımız ProductID bilgisini url’e parametre olarak ekliyoruz daha sonra HttpClient, HttpGet, HttpResponse, HttpEntity kullanarak sayfadan geriye dönen veriyi alıyoruz bu değer json formatında olduğu için bu kısımda JsonObject ‘e çeviriyoruz.Aldığımız bu bilgiyi onPostExecute() kısmında kullanarak json string içerisinden istediğimiz değere ulaşıyoruz ve ekrandaki EditText kontrollerinin text özelliklerine atama yapıyoruz.

Android uygulamamısının

AndroidManifest.xml dosyası kodları


<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.webserviceapp"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="8"
        android:targetSdkVersion="15" />

    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/title_activity_main" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
</manifest>

Buraya internet izin kısmınıda ekliyoruz.Uygulamada yapmamız gereken işlemler bu kadar uygulamamızı çalıştırıp ID kısmına veri tabanında buluan bir değer girip test yapabiliriz.

Northwind veri tabanı Products tablosu içeriği





Uygulama ekran görüntüleri












Uygulamanın .Net Kaynak Kodlarını Buradan İndirebilirsiniz

Uygulamanın Android Kaynak Kodlarını Buradan İndirebilirsiniz




posted in Android by gokhan

Follow comments via the RSS Feed | Yorum yapın | Trackback URL

Leave Your Comment

*

 
Powered by Wordpress and MySQL. Theme by Shlomi Noach, openark.org