30 Ekim 2014 Perşembe

Android Web Servis Kullanıcı Adı ve Parola Ayarlama


Merhaba arkadaşlar,

Bu yazımda daha önce yayınlamış olduğum Android te web servis kullanımına ilişkin ek bir ilave yapacağım. Eğer servisimizde kullanıcı adı ve parola erişim kısıtı varsa bu durumda servisimizde SOAP header’ına bu parametreleri set etmemiz gerekecektir. Eğer Android te web servis kullanımı ile alakalı yazımı okumamışsanız buradan okumanızı tavsiye ederim çünkü kodları oradaki yapı üzerinden vereceğim.

Servis request değerimi oluşturup SoapSerializationEnvelope nesneme set ederken burada headerOut fonksiyonunu kullanarak kullanıcı adı ve parola değerlerimi set ediyorum. Bunun için önceki yazımda WebServiceCall.java sınıfımız içerisinde SetEnvelop() metodumda şu kodları ekliyoruz.


    protected void SetEnvelope() {
         
        try {
             
            // Creating SOAP envelope          
            envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
             
            //You can comment that line if your web service is not .NET one.
            envelope.dotNet = true;
            
            //header'a kullanıcı adı ve parola değerlerini set et
            envelope.headerOut = new Element[1]; 
            envelope.headerOut[0] = buildAuthHeader();
            
            envelope.setOutputSoapObject(request);
            androidHttpTransport = new AndroidHttpTransport(URL);
            androidHttpTransport.debug = true;
             
        } catch (Exception e) {
            System.out.println("Soap Exception---->>>" + e.toString());   
        }
    }
    
    
    private Element buildAuthHeader() {
        Element h = new Element().createElement(NAMESPACE, "AuthHeader");
        Element username = new Element().createElement(NAMESPACE, "Username");
        username.addChild(Node.TEXT, USERNAME);
        h.addChild(Node.ELEMENT, username);
        Element pass = new Element().createElement(NAMESPACE, "Password");
        pass.addChild(Node.TEXT, PASSWORD);
        h.addChild(Node.ELEMENT, pass);

        return h;
    }

Umarım faydalı olur, yardıma ihtiyacınız olduğunda yardımcı olabilirim.

Android Web Servis Kullanımı


Merhaba arkadaşlar, .net web servislerinin android te nasıl kullanılacağından bahsedeceğim.  Bunun için http://www.webservicex.net/ sitesinde sunulan ağırlık birimleri arası dönüşüm yapan basit bir servisi kullanacağız. Bu servis .net ile yazılmış web servisidir. Bunu bilmekte fayda var çünkü java ile yazılmış servislerin kullanımı biraz daha farklı.

Öncelikle Android de web servislerini kullanabilmemiz için ksoap2 kütüphanesine ihtiyaç var. Bu kütüphaneyi buradan indirerek projemize import ediyoruz. Bunun için önce indirdiğimiz .jar dosyamızı projemizde libs klasörünün altına kopyalayalım, ardından projemizin üzerine gelerek sağ tıklayıp Build Path > Add External Archives.. seçeneğini seçiyoruz. İndirdiğimiz ksopa2 jar’ını göstererek ekliyoruz.



Aşağıda kullanacağımız servisin açıklamalarını verdim. Uygulamada kullanacağımız servis değişkenleri şu şekilde.





NAMESPACE = “http://www.webserviceX.NET/
URL = “http://www.webservicex.net/ConvertWeight.asmx”
METHOD_NAME = “ConvertWeight”
SOAP_ACTION = NAMESPACE + METHOD_NAME 



Şimdi servisi uygulamamızda nasıl kullanacağımıza geçebiliriz. Ben basit bir uygulama ile servisten dönen cevabı bir text içerisinde göstereceğim. Siz kendi uygulamanıza göre uyarlarsınız. Proje structure olarak resimde verildiği şekliyle.















1) Öncelikle layout’umuzu oluşturalım. Ben servise parametre olarak geçeceğimiz değerleri alacağım 3 textbox ve servis çağrısı yapacağımız bir buton kullanıyorum ve servis cevabını gösterebileceğim bir label ekliyorum. 




    

    

    

    

    

    

    


2) Servis bağlantımı oluşturacağım WebServiceCall sınıfımı oluşturuyorum.  Bu sınıf içerisinde Soap requestimi oluşturuyor varsa gerekli request parametrelerimi, servis kullanıcı adı ve parolamı set ediyorum. Bu servisimizde kullanıcı adı ve parola istemediği için SOAP header 'ına müdahale etmedik. Ancak başka yazımda ele aldım. Buradan (Servis Kullanıcı Adı ve Parola Set Etme) servis header parametrelerinin nasıl set edileceğine ulaşabilirsiniz.


package com.ahmetbz.usingwebservices;

import org.ksoap2.SoapEnvelope;
import org.ksoap2.serialization.PropertyInfo;
import org.ksoap2.serialization.SoapObject;
import org.ksoap2.serialization.SoapPrimitive;
import org.ksoap2.serialization.SoapSerializationEnvelope;
import org.ksoap2.transport.AndroidHttpTransport;
import org.kxml2.kdom.Element;
import org.kxml2.kdom.Node;

public class WebServiceCall {

    String NAMESPACE = "http://www.webserviceX.NET/";
    private String URL = "http://www.webservicex.net/ConvertWeight.asmx";
    String METHOD_NAME = "ConvertWeight";
    String SOAP_ACTION;
    SoapObject request = null, objMessages = null;
    SoapSerializationEnvelope envelope;
    AndroidHttpTransport androidHttpTransport;
     
    WebServiceCall() {
    }

    protected void SetEnvelope() {
         
        try {
             
            // Creating SOAP envelope          
            envelope = new SoapSerializationEnvelope(SoapEnvelope.VER11);
             
            //You can comment that line if your web service is not .NET one.
            envelope.dotNet = true;
            
            envelope.setOutputSoapObject(request);
            androidHttpTransport = new AndroidHttpTransport(URL);
            androidHttpTransport.debug = true;
             
        } catch (Exception e) {
            System.out.println("Soap Exception---->>>" + e.toString());   
        }
    }
    
    // MethodName variable is define for which webservice function  will call
    public String getConvertedWeight(String weight, String fromUnit, String toUnit)
      {
         
        try {
            SOAP_ACTION = NAMESPACE + METHOD_NAME;
             
            //Adding values to request object
            request = new SoapObject(NAMESPACE, METHOD_NAME);
            

            //Adding Double value to request object
            PropertyInfo weightProp =new PropertyInfo();
            weightProp.setName("Weight");
            weightProp.setValue(weight);
            weightProp.setType(double.class);
            request.addProperty(weightProp);
             
            //Adding String value to request object
            request.addProperty("FromUnit", "" + fromUnit);
            request.addProperty("ToUnit", "" + toUnit);
            
            SetEnvelope();
             
            try {
                 
                //SOAP calling webservice
                androidHttpTransport.call(SOAP_ACTION, envelope);
                 
                //Got Webservice response
                SoapPrimitive response = (SoapPrimitive)envelope.getResponse();
 
                return response.toString();
                 
            } catch (Exception e) {
                // TODO: handle exception
                return e.toString();
            }
        } catch (Exception e) {
            // TODO: handle exception
            return e.toString();
        }
 
    }

}


3) Butona tıklayınca servis çağrısı yapacağım DotNetWebServiceActivity sınıfımda hazırladığım layottan servise göndereceğim parametreleri alıyorum ve servis çağrısını yaparak dönen değeri labelda gösteriyorum.

package com.ahmetbz.usingwebservices;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class DotNetWebServiceActivity extends Activity {

 @Override
 protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.mainlayout);
          
         final Button webserviceCallButton = (Button) findViewById(R.id.callServiceButton);
         final EditText weightEditText = (EditText) findViewById(R.id.weightEditText);
         final EditText fromUnitEditText = (EditText) findViewById(R.id.fromUnitEditText);
         final EditText toUnitEditText = (EditText) findViewById(R.id.toUnitEditText);
         final TextView webserviceResponse = (TextView) findViewById(R.id.serviceResponseTextView);
          
         webserviceCallButton.setOnClickListener(new OnClickListener() {
             public void onClick(View v) {
                  
                 webserviceResponse.setText("Requesting to server .....");
                  
                 //Create Webservice class object
                 WebServiceCall service = new WebServiceCall();
                  
                 // Initialize variables
                 String weight   = weightEditText.getText().toString();
                 String fromUnit = fromUnitEditText.getText().toString();
                 String toUnit   = toUnitEditText.getText().toString();
                  
                 //Call Webservice class method and pass values and get response
                 String aResponse = service.getConvertedWeight(weight, fromUnit, toUnit);  
                     
                 Log.i("AndroidExampleOutput", "----"+aResponse);
                  
                 webserviceResponse.setText("Service Response : "+aResponse);
             }
         });
       
 }

}


4) AndroidManifest.xml dosyamızda Activity’i kaydetmeyi ve internet iznini vermeyi unutmayalım.



    
 
    
        
            
                
                
            
        
    
 






Evet arkadaşlar, uygulamaızı çalıştırıp ilgili değerleri girdiğimizde sonucun döndüğünü görebiliriz.

Veritabanı Tablo index Oluşturma / Sql Index


Veriler disk tabanlı belleklere depolanırken bloklar halinde depolanır. Disk blokları genelde bağlı listeler gibi yapılandırılmıştır; her ikisi de verinin tutulduğu kısım ve bir sonraki düğüme gösteren pointer kısmından oluşur ve her ikiside ardarda depolanmak zorunda değildir.

Sıralama yapılmamış bir alanda arama yapmak Lineer Arama yapmayı gerektirir, bu da N/2 blok erişimi gerektirir. Buradaki N tablonun disk üzerinde bulunduğu blok sayısıdır. Eğer bu alan anahtar olmayan bir alan ise arama N tane blok erişimi gerektirir.
Oysa sıralanmış bir alan olsaydı Binary Arama kullanılabilirdi, bu da log2 N blok erişimi gerektirir. Bununla birlikte anahtar olmayan alan sıralanmış ise tablonun geri kalanı duplicate değerleri bulmak için aranmaz. Çünkü alan sıralanmış olduğu için aranan değerden farklı bir değere erişildiğinde arama bitmiş demektir. Böylece performans önemli ölçüde artar.

İndex Nedir, Neden Kullanılır

Bir index, veri tabanı ortamında bir tablo ya da bir view gibi bir nesnedir ve ilişkili olarak kullanıldığı tablo ya da view'deki satırların, index alanı olarak kullanılan kolondaki verilere göre sıralanmış biçimde işlenme sokulmasını sağlar.

Bir tablo, indekslenmiş ise , bu tablo içinde gerçekleştirilecek bir arama ya da koşullu listeleme işlemi çok daha hızlı biçimde gerçekleştirecektir.

Index Oluşturma

      CREATE INDEX index adı
      ON tabloadı (kolonadı 1,kolonadı 2,....,kolonadı n );

Index artan (ascending) ya da azalan (decending) şeklinde olabilir. Artan, alfabetik olarak A’dan Z’ye nümerik olarak küçükten büyüğe şeklindedir. Azalan ise bunun tersidir. Hiçbir özel sözcük kullanılmazsa index artan sayılır ya da alan adının yanında bir boşluktan sonra ASC sözcüğü kullanılırsa bu alana göre artan sıralama yapılacak demektir.

Herhangi bir alanın adının yanında DESC sözcüğünün kullanılması ise index azalan olacağını gösterir. Komutun yazılış biçiminden anlaşılacağı gibi, aynı anda, birden çok alana göre index de yapılabilir.

Tek Bir Alana Göre Artan Sırada Index

İşletmede çalışan personeli maaşlarına göre artan sırada listelemek istersek, maas alanına göre bir index oluşturmalıyız.

     CREATE INDEX pers_maas
      ON Personel (maas);

Personel tablosunu listelersek personeller maaşlarına göre sıralı liste olarak gelecektir.

Tek Bir Alana Göre Artan Sırada Index 

    CREATE INDEX pers_maas
    ON Personel (maas DESC);

Birden Fazla Alana Göre Index

İşletmedeki personelin öncelikle adlarına göre, aynı ad da olanların soyadlarına göre, hem adı hem soyadı aynı olanların maaşlarına göre sıralanmış olarak listelenmesi istenirse aşağıdaki komut kullanılmalıdır:

 CREATE INDEX p_ad_soy_m
 ON Personel (ad,soyad,maas); 

Mevcut Bir Index’in Silinmesi 

Bir tablo üzerinde tanımlanmış herhangi bir indeks , o tablonun veri tabanından silinmesi ile otomatik olarak silinecektir. Tablo silinmeksizin , o tablo üzerinde oluşturulan indeksin silinmesi içinse DROP INDEX komutu kullnılmalıdır.

   DROP INDEX index_adi ;