14 Haziran 2016 Salı

Unity3d InvokeRepeating, Invoke ve CancelInvoke nedir ? | What is InvokeRepeating, Invoke and CancelInvoke on Unity3d ?

Yeni başladığım unityle karşılaştığım bir metodu sizinle paylaşacağım. Bu metod ile unityde süreklilik sağlayabilmekteyiz. Yani Unity3d de nesneler üzerinde sürekli işlemler yaptırmak istiyorsak zamanlayıcı gibi kullanabileceğimiz InvokeRepeating metodu bize oldukça yardımcı olmaktadır. Bu metodun kullanımı:


şeklindedir. InvokeRepeating' in ilk parametresi olan "PropFunction" string değeri, fonksiyonun ismidir. Biz fonksiyonun ismini vererek o fonksiyonu InvokeRepeating fonksiyonunda sürekli çağırmasını sağlamaktayız.
İkinci parametre olan 3 değeri ile InvokeRepeating metodunu, programın çalışmasında sonraki başlatılma süresidir. Yani program başladıktan 3 sn sonra InvokeRepeating çalışmaya başlayacak.
Son parametre olan 1 ise string olarak ismini verdiğimiz fonksiyonun kaç saniyede bir sürekli çalışması istiyorsak verdiğimiz değerdir.


Invoke metodumuz ise süreklilik ifade etmeden bir kereliğine çalıştırmak istediğimiz fonksiyonlar için kullanılmaktadır. Örneğin, Invoke metodumuz da başlangıçta belirleyeceğimiz değerleri fonksiyon çağrısı yaparak tanımlayabiliriz. Çalışacak fonksiyon için program başlamasından sonra belirli bir süre sonra çalışmasını istiyorsak bu fonksiyonun özelliğini kullanarak bunu gerçekleştirebiliriz.


İlk parametre ile fonksiyonumuzun ismini vererek çağırma işlemi gerçekleştiriliyor. İkinci parametremiz sayesinde ise fonksiyonun kaç saniye sonra çalışmasını istiyorsak o süre aralığını vererek istenilen zamanda çalışmasını istiyoruz.


CancelInvoke fonksiyonu, çalışan invoke fonksiyonunu sonlandırmak için kullanılır. Mesela InvokeRepeating fonksiyonumuz çalıştıktan sonra sürekli olarak çalışacaktır. InvokeRepeating fonksiyonun sürekliliğinin engellenmesini istediğimiz anda CancelInvoke metodunu çalıştırılarak sonlandırmış olacağız.


Görüldüğü gibi tek parametre alan CancelInvoke fonksiyonunun aldığı parametre, Daha önceden InvokeRepeating ile çalıştırdığımız fonksiyonun ismini vererek o fonksiyonun çalışmasını durdurmaktayız. CancelInvoke fonksiyonu son kez çağırılan fonksiyonun sonlanması ile sonlanacaktır. Çağırılan fonksiyon kesmeye uğramayacaktır.


11 Haziran 2016 Cumartesi

Android ile Php web servisi oluşturma - Mysql Oluşturma ve sunucuya yükleme | Create php web service use with Android - Creating Mysql and upload server

Merhaba arkadaşlar, Bu yazımızda Android ile php web servisleri projesinde veritabanımızı oluşturacağız. Veritabanımı olarak Mysql kullanacağız. Öncelikle lokalde oluşturacağımız veritabanını daha sonrasında sunucumuza yükleyeceğiz. Bir önceki yazımızda sunucumuzdan bahsetmiştik.

Buradan Yazının Videolu anlatımına geçebilirsiniz.

Şimdi gelelim Veritabanımızı oluşturmaya. Bunun için önceden yüklediğimiz XAMPP serverde apache ile MySQL' i çalıştırıyoruz.


Daha sonra tarayıcımıza http://localhost:(apache port)/phpmyadmin yazarak phpmyadminimizi açıyoruz. Apache portum 31 olarak ayarlı. O yüzden ben http://localhost:31/phpmyadmin yazarak phpmyadmine giriş yapıyorum. Kullanıcı adı ile şifrem olmadığı için direk bağlantı sağlıyorum. Eğer sizin kullanıcı adı ve şifreniz varsa lütfen bilgilerinizi girip giriş yapın. Giriş yaptıktan sonra;

Yeni veritabanı oluşturuyorum adını 'DBphp' koyuyorum.



Oluşturulan veritabanımın SQL sekmesine tıklayarak aşağıdaki kodları kopyalayıp çalıştırıyorum.

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

CREATE TABLE `uyeler` (
  `UyeID` int(11) NOT NULL,
  `AdSoyad` varchar(255) NOT NULL,
  `Email` varchar(255) NOT NULL,
  `Sifre` varchar(255) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin5;

 
ALTER TABLE `uyeler`
  ADD PRIMARY KEY (`UyeID`);


ALTER TABLE `uyeler`
  MODIFY `UyeID` int(11) NOT NULL AUTO_INCREMENT;


 
çalıştırdığım zaman veritabanımda bir tane tablo oluşması gerekmektedir. Sonra veritabanımızın yedeğini alacağız. Bu yedeği alıp sunucumuza yükleyeceğiz.



Veritabanımıza seçerek;


Üstteki menüden Dışa aktara tıklıyoruz. Hiç bir ayarı değiştirmeden Git'e tıklıyoruz ve veritabanımızın yedeğini indiriyoruz.


Oluşan DBphp.sql dosyasını masaüstümüze alalım ki sunucuya yüklerken birdaha dosya yolunu göstermekle uğraşmayalım.


Şimdi sunucumuza giriş yapalım. Giriş yaptıktan sonra menüden Gelişmiş Araçların altında bulunan Veri Tabanı Yöneticisi' ne tıklıyoruz.


Açılan pencerede yeni bir veritabanı oluşturmamız gerekiyor.Veritabanı adının başında değiştirilemez bir isim yer alıyor ve devamında koymak istediğimiz veritabanı adını yazıyoruz. Ben değiştirilemez ismin devamına "dbphp" ekliyorum. Şifremi yazıyorum. Veritabanı oluştura tıklıyorum.


Oluşan veritabanı hemen sayfanın alt tarafında görüntüleniyor.



Burada Yönetim Başlığı altında bulunan "phpMyAdmin 4 See all tools" linkine tıklayarak sunucumun phpmyadmini ni açıyorum.


Açılan panelde İçe aktara tıklıyorum.

Gözata tıklıyorum. Burada DBphp.sql dosyamı daha önceden masaüstüme almıştım. Masaüstüne aldığım dosyamı seçiyorum ve Git' e tıklayarak sunucumdaki veritabanıma yedeklemiş olduğum veritabanını yüklemiş oluyorum.

Şimdi projemizin geri kalanına devam edelim.

Kullanılan materyaller:
- DBphp.sql

Android ile Php Web Service Kullanmak | Php web service use with Android (Videolu Anlatım)

Merhabalar Arkadaşlar, Yakın zamanda Android ile Asp.Net web servis kullanımı ile ilgili bir projeyi beraber yapmıştık. Şimdi Android uygulaması ile birlikte php web servis kullanımı yapacağız. Yapacağımız servisler web üzerinde canlı olarak yayın yapacak. Lokal de sınırlı kalmayacağız. Böylece canlı ortamda uygulamalarımızın çalışırlığınıda bir nevi öğrenmiş olacağız. Biliyorsakta bilmeyen arkadaşlarımız için öğretici bir yazı olacak.

Android uygulamamız olarak basit bir uygulama olacak. İçerisinde üyelik bilgileri ile ekle, sil ve listele özelliği bulunan bir uygulama yapaccağız. Verilerimiz, android uygulamamızdan web servislerimiz aracılığıyla veritabanımıza ulaşacak.

Kullanılan Uygulamalar
- Android (Android Studio)
- Lokal sunucu (Xampp server) - Phpmyadmin kullanılacak.
- Web Hosting - Linux (Biz.nf - http://cp1.biz.nf/beta)
- Notepad++ (Web servis)
- FileZilla
- Advanced Rest Client (ARC - Web servis client)
- TeamViewer (Android Emülator)

Kurulumlar:
- Android Studio Kurulumu
- Lokal Sunucu Kurulumu
- Web Hosting Üyeliği alma
- Notepad++ Kurulumu
- Advanced Rest Client Kurulumu
- TeamViewer Kurulumu PC - Mobil Bağlantısı

1- Web hosting' den öncelikle üyeliğimizi alalım. Videolu anlatım.
2- Mysql veritabanımızı oluşturalım ve sunucuya yükleyelim. İkinci işlem olarak Android uygulamamızın tasarımını oluşturalım. Videolu anlatım.
3- Web servislerini Androidin isteklerine göre oluşturacağız. Videolu anlatım.
4- Android ile uye ekleme işlemini gerçekleştirelim. Videolu anlatım.
5- Android ile uye listeleme işlemini gerçekleştirelim. Videolu anlatım. 
6- Android ile uye silme işlemini gerçekleştirelim. Videolu anlatım.

Uygulamamızın sonuna gelmiş bulunmaktayız.


-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*

Uygulamamızda kullanılan dosyalara aşağıdaki linklerden edinebilirsiniz.



- Web Servisleri :
- Android Uygulama :
- DBphp.sql:





2 Nisan 2016 Cumartesi

html ile asenkron yapı kullanımı | use asenkron communication with html

En aşağıda gördüğümüz a href linkleri ile java fonksiyonuna parametre gönderiyoruz. Gönderdiğimiz parametre sonucu ilgili html sayfasını,

document.getElementById("ortaForm").innerHTML = xmlhttp.responseText;

komut satırında ortaForm id' sine sahip etiketin içersine gönderiyoruz.
fonksiyon içerisindeki yapı sayesinde çağırdığımız html sayfasını ana sayfa yenilenmeden yapıyoruz. Böylece oluşturulmuş projedeki sitenin performansının daha iyi olmasını sağlar. AJAX ile daha kullanışlı sayfalar oluşturabiliriz. Gerekli araçları kullanarak bir sayfada birden fazla işlem yaptırabiliriz. 


Bu yapı sadece html çağırımı ile sınırlı değildir. Php, .txt, .xml, .json vb. birçok değişik dosyayı asenkron biçimde çağırmaktadır.

<html>
<head>
    <script>
        function listele(file)
        {   
            if (window.XMLHttpRequest)
            {
                xmlhttp = new XMLHttpRequest();
            }
            else
            {
                xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
            }
            xmlhttp.onreadystatechange = function()
            {
                if (xmlhttp.readyState == 4 && xmlhttp.status == 200)
                {
                    document.getElementById("ortaForm").innerHTML = xmlhttp.responseText;
                }
            }
            xmlhttp.open("GET", file, true);
            xmlhttp.send();
        }
    </script>

</head>
<body>

    <a href="#" onclick = "
listele('ders.html')"> 1. Yarıyıl derslerini listele </a></br>
    <a href="#" onclick = "
listele('ders2.html')"> 2. Yarıyıl derslerini listele </a>

    <div style="border:1px solid red; width:500px; height:250px;">

        <div id="ortaForm">
        </div>
   
    </div>
</body>
</html>


Herhangi bir hata almanız durumunda, projenizdeki <script> tagları bu yapının kullanımını engelleyebilir. diğer script taglarını silip bu yapıyı birde öyle deneyin ve çalıştığını göreceksiniz.

1 Nisan 2016 Cuma

Sql injection Savunma Yolları - İnputları Filtrelemek | defense of inputs for SQL injection - Filtre inputs

Sql injection bir forma parametre girerek onu ilgili yere göndererek gerçekleştirilir. Bu gönderme sonucunda veri tabanı ile ilgili işlemler yapılır. Bu işlemlerin amacını girdiğimiz input değerleri ile değiştirebilmekteyiz. Biz geliştiriciler olarak fonksiyonumuzun amacı dışına çıkmasını istemeyiz. Bu yüzden de bu gibi input değerlerini engellemeliyiz. Öncelikle ne gibi inputlar la bizim fonksiyonumuzun amacını değiştirdiklerini bir görelim:

"select * from Admin Where AdminAdi = '" + input1 + "' and ' AdminSifre = '" + input2 + "'"

bu sorgumuzun sonucunda Admin adi ve şifresi ile eşleşen bir veri olursa değerimiz pozitif olacaktır. Eşleşme olmazsa değerimiz null olarak dönecektir. Bu sorguyu kötü niyetli kişiler istediği gibi girebilebilir. Mesela admin adı için girilen input 1 değeri

1' or '1' = '1'"-- olursa şöyle bir tablo ortaya çıkacaktır.

"select * from Admin Where AdminAdi = '1' or '1' = '1'"--' and ' AdminSifre = '" + input2 + "'

bu sorgu sonucu pozitif olarak dönecektir. Çünkü 1=1 sorgusu sayesinde sorgunun değeri 1 olacaktır ve AdminSifre bilgisi yorum satırı olarak görülecektir. Bu gibi açıklıklar için savunma yollarını konuşalım.

Örneklerimi C# üzerinden vereceğim fakat bu fikirleri kullanarak istediğiniz dilde sizde oluşturabilirsiniz.

1- Öncelikle bu örneğimizin önüne geçecek bir filtre oluşturalım.

            public static string Temizle(string Metin)
        {
            string deger = Metin;
            try {
            deger = deger.Replace("'", "");
            deger = deger.Replace("<", "");
            deger = deger.Replace(">", "");
            deger = deger.Replace("&", "");
            deger = deger.Replace("[", "");
            deger = deger.Replace("]", "");
            }catch(Exception e) { }
            return deger;
        } 

 bu fonksiyonumuzu kullanarak özel işaretlerin silinmesini engelleyebiliriz. Böylece kötü niyetli kişiler sorgumuzun amacını değiştiremez.

2- İnput değerimizin sadece sayı olarak girilmesini istiyorsak;

        public static string sayikontrol(string Text)
        {
            try
            {
                int x = Convert.ToInt32(Text);
            }
            catch
            {
                Text = "0";
            }

            return Text;
        }


kullanabiliriz. Böylece sayı olarak girilmeyen karakterlerin engellenmesini sağlamış oluruz.

3- Url adresini input olarak alır isek şöyle bir filtre uygulayabiliriz.

        public static string UrlSeo(string Metin)
        {
            string deger = Metin;
            deger = deger.Replace("'", "");
            deger = deger.Replace(" ", "_");
            deger = deger.Replace("<", "");
            deger = deger.Replace(">", "");
            deger = deger.Replace("&", "");
            deger = deger.Replace("[", "");
            deger = deger.Replace("]", "");
            deger = deger.Replace("ı", "i");
            deger = deger.Replace("ö", "o");
            deger = deger.Replace("ü", "u");
            deger = deger.Replace("ş", "s");
            deger = deger.Replace("ç", "c");
            deger = deger.Replace("ğ", "g");
            deger = deger.Replace("İ", "i");
            deger = deger.Replace("Ö", "o");
            deger = deger.Replace("Ü", "u");
            deger = deger.Replace("Ş", "s");
            deger = deger.Replace("Ç", "c");
            deger = deger.Replace("Ğ", "g");

            return deger;
        }

böylece türkçe karakterler ve bazı özel karakterlerin kullanılmasını engelleyebiliriz.

4- İnputlarımız için validator(doğrulayıcı) kullanımı oldukça iş görmektedir.  Bunun için ilgili makalelerde arama yapabilirsiniz. Size bu konuyu bir örnekle kısaca açıklayayım.

<td class="style2">
    <asp:TextBox ID="txtemail" runat="server">
    </asp:TextBox>
 </td>

 <td>
    <asp:RegularExpressionValidator ID="remail" runat="server"
       ControlToValidate="txtemail" ErrorMessage="Mail adresini gir"
       ValidationExpression="\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*">
    </asp:RegularExpressionValidator>
 </td>


burada email adresinde farklı karakterler olması durumunda input değerini kabul etmeyecektir ve ekrana ilgili hatayı bastıracaktır.

5- Url de görülen get metodu ile aldığımız bazı veriler bizim savunmasız kalmamıza neden olabilmektedir. Örneğin:

http://savunmasizsite.com/index.asp?id=1; SHUTDOWN WİTH NOWAIT;

parametresini girerek idnin yanındaki noktalı virgül ile sql cümlesini tamamlar ve yanındaki diğer komut cümlesi ile sql veritabanınızın servis hizmetini durdurabilir. Bu durumda bizim savunmamız burada gelen parametrenin belli uzunlukta olması gerektiğidir. Parametre uzunluğunu kısıtlarsak buradaki sorgu amacına ulaşmayacak ve veritabanımız hizmeti sağlamaya devam edecektir.

6- C#' ta sql sorugu için daha güvenilir bir kullanım mevcuttur. Sql sorgusunda parametre kullanılmalıdır. Yani;

string cmdStr = "SELECT * FROM Users WHERE UserName=@UserName AND Password=@Password";
SqlCommand cmd = new SqlCommand(cmdStr, sqlConnection);
cmd.Parameters.Add("@UserName",SqlDbType.NVarChar,50);
cmd.Parameters.Add("@Password",SqlDbType.NVarChar,50);
// İlk veri girişi
cmd.Parameters["@UserName"].Value="Burak";
cmd.Parameters["@Password"].Value="Burak12041976";
cmd.ExecuteNonQuery();


Bu sayede gelen parametreler tek tırnaktan bağımsız çalışacaktır ve hız açısından da bu kullanım önerilmektedir. Görüldüğü gibi gelen parametre tipleride belirlenmiş oldu. Veri tipleri farklı olursa bir engelleme söz konusu olacaktır.



Zamanla başka savunma yöntemlerimi sizinle bu yazımda tekrar paylaşacağım. Tekrar görüşmek üzere.

31 Mart 2016 Perşembe

Android ile Web Servis Kullanmak (Asp.Net) | asp.net web service use with Android (Video)

Asp.Web servisi oluşturuldu. Bu servisin içersinde sunucuya yüklenmiş olan veritabanına veri ekleme ve verileri getirme özellikleri içeren fonksiyonlar tanımlandı. Bu sayede Android uygulaması ile geliştirilen uygulamanın bu servisi kullanarak parametre göndermesi ya da bu servisten veri istekleri yapması sağlanmıştır. Böylece uygulama istekte bulunduğu web servis ile sunucudaki veritabanına ulaşması sağlanmıştır.

Birde bu yapıyı videolarla ve ya makale ile anlatmaya çalıştım. Kolay gelsin

1 - Somee.com'a üye olundu.



2 - VeriTabanı oluşturma ve bu veritabanını sunucuya yükleme işlemleri yapıldı.




3 - Asp.net Web servis projesi oluşturuldu. Web servis ile veri ekleme ve listeleme yapıldı. Web servis sunucuya yüklendi.



4 - Android uygulaması için proje oluşturuldu. Bu projenin ana menüsü tasarlandı ve çalışır hale getirildi.



5 - Android uygulaması ile web servis bağlandı. Web servise parametreler gönderilerek veri ekleme işlemi yapıldı.



6 - Android uygulama ile web servis bağlandı. Web servisten uygulamaya veriler getirildi ve veri listeleme yapıldı.



Projenin Dökümanları :
- Sql Veri Tabanı
- Asp.net web servis
- Android projesi

30 Mart 2016 Çarşamba

Android ile Web Servis Kullanmak (Asp.Net) | asp.net web service use with Android

Merhabalar arkadaşlar,
(Videolu anlatım)
Web Servis konusunda size yardımcı olmaya çalışacağım, Bu makalemde size android programlama yapanlar için, asp.net ile oluşturacağımız web servisini kullanmayı basit bir şekilde anlatmaya çalışacağım.

Öncelikle servisimiz için bir veritabanı oluşturalım. (MsSql oluşturma)

Veritabanımız hazır sırada webservisimizi oluşturalım. (Asp.net Web Servis Oluşturma)

Son olarak android ile bu servisleri kullanmak kaldı.
Android Studiomuzu açıyoruz ve yeni proje oluşturuyoruz. Projemizin adını WebServis koydum ve next dedim;

sonraki ekranda hiç bir değişiklik yapmadan next diyerek geçiyorum;

sonraki ekranda boş bir aktivity projesi seçeceğim. Bunun için "Add No Activity" seçiyorum. Finish tıklıyorum. Projemin oluşmasını bekliyorum.


Projem oluştuktan sonra ekranın solundaki "Project" etiketine tıklayarak projenin dosya hiyerarşisini görüntülüyorum. Bu görüntünün "Android" dosya hiyerarşisi olmasını istiyorum.
Projeme ilk olarak bir java sınıfı eklemek istiyorum. Eklemek için com.webservis klasörünün üzerine sağ tıklıyorum sonra New>Java Class tıklıyorum. Yeni sınıfımın adını "MainActivity" yazıyorum ve OK tıklıyorum. artık yeni sınıfım eklenmiş oluyor. Yeni sınıfıma aşağıdaki kodları ekliyorum.


MainActivity.java
package com.webservis;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

public class MainActivity extends Activity {

    Button bEkle, bListele, bSil;
    TextView etIP;
    String Url;
    View.OnClickListener Listener;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        install_elements();
        bEkle.setOnClickListener(Listener);
        bListele.setOnClickListener(Listener);
    }
    private void activity(Class c)
    {
        Intent intent = new Intent(MainActivity.this,c);
        intent.putExtra("Url", Url);
        startActivity(intent);
    }

    private void install_elements() {
        bEkle = (Button) findViewById(R.id.bEkleGit);
        bListele = (Button) findViewById(R.id.bListeleGit);
        etIP = (TextView) findViewById(R.id.etIP);
        Url = "http://denemelerdenemeler.somee.com/"; //--> Somee.com
        //Url = "http://10.7.1.183/";  //---> Ev ip
        //Url = "http://10.7.1.113/";    //---> Okul ip

        Listener = new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                switch (v.getId()) {

                    case R.id.bEkleGit:     activity(Ekle.class);    break;
                    case R.id.bListeleGit:  activity(Listele.class);   break;
                    default:                break;
                }
            }
        };
    }
}


Bu sınıf için bir görünüm dosyası oluşturmam lazım. Bu dosyayı oluşturabilmek için dosya hiyerarşisideki res klasörüne sağ tıklıyorum. New>Android resource directory tıklıyorum ve "Directory Name" kısmına "layout" yazıyorum ve OK butonuna tıklıyorum. Bu sayede klasörümüze layout dosyasını eklemiş oluyoruz. Bu klasörün altında yeni bi dosya oluşturacağım. layout klasörünün üstüne sağ tıklıyorum New > Layout resource file tıklıyorum. "File name" kısmına "activity_main" yazıyorum ve OK tıklıyorum. Oluşturduğum bu dosyaya çift tıklıyorum ve aşağıdaki gibi layout dosyanın text kısmına giriyorum. Aşağıda text kısmının nerede olduğunu görebilirsiniz.


Bu kısma aşağıdaki kodlarımı ekliyorum:

activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:layout_marginTop="100dp"
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:id="@+id/bEkleGit"
        android:text="Ekle"
        android:layout_gravity="center"/>
    <Button
        android:layout_width="200dp"
        android:layout_height="wrap_content"
        android:id="@+id/bListeleGit"
        android:text="Listele"
        android:layout_gravity="center"/>

    <EditText
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="@dimen/abc_action_button_min_width_material"
        android:id="@+id/etIP"/>
</LinearLayout>
 

Main Activity sınıfımız ile menü ekranımızı oluşturmuş oluyoruz. Bu ekranda Ekleme ve Listeleme butonları mevcuttur. Bu butonlara tıklandığında yeni görünümlere gidilecek. Bu görünümlerden ilki ekle görünümü. Öncelikle Ekle java sınıfımızı oluşturalım. Bunun için com.webservis klasörümüze sağ tıklayarak yeni bir java sınıfı oluşturacağız. Sınıfımızın adını "Ekle" koyuyorum. Aşağıdaki kodları bu sınıfıma ekliyorum.

Ekle.java
package com.webservis;

import android.app.Activity;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import java.net.URI;
import java.net.URLEncoder;

public class Ekle extends Activity {

    EditText etIsim, etEmail;
    Button bEkle;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ekle_main);
        install_elements();

        bEkle.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                new PhpGetSendWS().execute();
            }
        });

    }

    class PhpGetSendWS extends AsyncTask<String, String, String>
    {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

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

            try {
                HttpClient httpclient = new DefaultHttpClient();
                HttpGet request = new HttpGet();

                String isim = URLEncoder.encode(etIsim.getText().toString(),"utf-8");
                String email = URLEncoder.encode(etEmail.getText().toString(), "utf-8");

                request.setURI(new URI(getIntent().getStringExtra("Url") +
                        "uyelik.asmx/UyeEkle?AdSoyad=" + isim + "&E_posta=" + email));
                //Get isteğimizi URL yoluyla belirliyoruz.

                if(!httpclient.execute(request).equals(null)) //İsteğimizi gerçekleştiriyoruz.
                {
                    ToastYazdir("Eklendi");
                    Thread.sleep(1500);
                    Intent i = new Intent(Ekle.this,Listele.class);
                    i.putExtra("Url", getIntent().getStringExtra("Url"));
                    startActivity(i);
                }

            }catch (Exception e)
            {
                ToastYazdir("Hata oluştu.");
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
        }

    };
    public static String convertStreamToString(java.io.InputStream is){
        java.util.Scanner s = new java.util.Scanner(is).useDelimiter("\\A");
        return s.hasNext() ? s.next():"";
    }
    private void ToastYazdir(final String str)
    {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                Toast.makeText(getApplicationContext(), str, Toast.LENGTH_SHORT).show();
            }
        });
    }
    private void install_elements()
    {
        etIsim = (EditText) findViewById(R.id.etIsim);
        etEmail = (EditText) findViewById(R.id.etEmail);
        bEkle = (Button) findViewById(R.id.bEkle);
    }
}


Bu kodları Ekle sınıfımıza ekledikten sonra Http kütüphanesini dosyamıza dahil etmeliyiz. Http Kütüphanesini Ekledikten sonra Ekle sınıfımızın layout dosyasını ekleyelim. Dosya hiyerarşisindeki layout klasörüne daha öncedende eklediğimiz gibi sağ tıklayarak "ekle_main" adında layout ekliyorum. Bu layouta çift tıklıyorum ve Text bölümüne aşağıdaki kodları yapıştırıyorum.

ekle_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    tools:context=".MainActivity"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <EditText
        android:layout_marginTop="100dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:hint="Ad ve Soyad"
        android:ems="10"
        android:id="@+id/etIsim"
        android:layout_gravity="center_horizontal" />

    <EditText
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:inputType="textEmailAddress"
        android:hint="Email"
        android:ems="10"
        android:id="@+id/etEmail"
        android:layout_gravity="center_horizontal" />

    <Button
        android:layout_marginTop="50dp"
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:text="Ekle"
        android:id="@+id/bEkle"
        android:layout_gravity="center_horizontal" />
</LinearLayout>


Daha sonra ana ekranımızdaki listeleme özelliğini yapacağız. Bunun için Listele sınıfımı oluşturacağım. Oluşturabilmem için com.webservis dosyama sağ tıklıyorum ve yeni bir java sınıfını "Listele" adı altında ekliyorum. Bu sınıfıma aşağıdaki kodları ekliyorum.

Listele.java

package com.webservis;


import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.BasicResponseHandler;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

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

public class Listele extends Activity {
    ArrayAdapter<String> adapter;
    String resp = null;
    ArrayList<String> data = new ArrayList<>();
    boolean post=false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.listele);

        new AspData().execute();

    }

    public class AspData extends AsyncTask<String, String, String> {
        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

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

/*
            // GET METODU

            DefaultHttpClient hc = new DefaultHttpClient();
            ResponseHandler response = new BasicResponseHandler();
            HttpGet http = new HttpGet(getIntent().getStringExtra("Url")+"uyelik.asmx/GetUyeler?");

            try {
                resp = (String) hc.execute(http, response);
                resp = cutstring(resp);

                JSONArray json = new JSONArray(resp);

                for(int i=0;i<json.length();i++){
                    JSONObject e = json.getJSONObject(i);
                    data.add(e.getString("AdiSoyadi") + " - " + e.getString("Eposta"));
                }

                adapter = new ArrayAdapter<>(getApplicationContext(),android.R.layout.simple_list_item_1,data);
            } catch (IOException e) {
                e.printStackTrace();
            } catch (JSONException e) {
                e.printStackTrace();
            }
*/

          
            // POST METODU
            try
            {
                HttpClient httpClient=new DefaultHttpClient();
                HttpPost httpPost=new HttpPost(getIntent().getStringExtra("Url")+"uyelik.asmx/GetUyeler");
                HttpResponse httpResponse=  httpClient.execute(httpPost);
                resp = readResponse(httpResponse);
                post = true;
                resp = cutstring(resp);

                JSONArray json = new JSONArray(resp);

                for(int i=0;i<json.length();i++){
                    JSONObject e = json.getJSONObject(i);
                    data.add(e.getString("AdiSoyadi") + " - " + e.getString("Eposta"));
                }

                adapter = new ArrayAdapter<>(getApplicationContext(),android.R.layout.simple_list_item_1,data);
            }
            catch(Exception exception)  {}


            return null;
        }

        @Override
        protected void onPostExecute(String s) {
            super.onPostExecute(s);
            ListView lv = (ListView) findViewById(R.id.myListView);
            lv.setAdapter(adapter);
        }

        private  String cutstring(String resp)
        {
            resp = resp.replace("<?xml version=\"1.0\" encoding=\"utf-8\"?>", "");
            resp = resp.replace("<string xmlns=\"http://tempuri.org/\">", "");
            resp = resp.replace("</string>","");
            if(!post)
                resp = resp.substring(2,resp.length());
            return resp;
        }
        public String readResponse(HttpResponse res) {
            InputStream is=null;
            String return_text="";
            try {
                is=res.getEntity().getContent();
                BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(is));
                StringBuffer sb = new StringBuffer();
                String line="";
                while ((line=bufferedReader.readLine())!=null)
                {
                    sb.append(line);
                }
                return_text=sb.toString();

            } catch (Exception e)  { }
            return return_text;
        }
    }

}


sonrasında bu sınıfın görünüm dosyasını ekliyorum. Bunun için layout klasörüme sağ tıklıyorum yeni bir layout dosyasını "listele" adı altında ekliyorum. eklediğim bu dosyanın Text bölümüne geçip aşağıdaki kodları ekliyorum.

listele.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent">

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/myListView"
        android:background="@color/accent_material_light"
        android:layout_gravity="center_horizontal"/>

</LinearLayout>


projemin bütün sınıflarını ve görünümlerini tamamladım.Geriye tek bir adım kaldı buda AndroidManifest.xml dosyama aşağıdaki kodları eklemem. Bu kodlar Activity sınıfından kalıtım alan sınıfların görünümlerini sağlaması açısından luzumludur.

Android manifest dosyama;

AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.webservis">

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

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <activity android:name=".Ekle" >
        <intent-filter>
            <action android:name="android.intent.action.EKLE" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    <activity android:name=".Listele" >
        <intent-filter>
            <action android:name="android.intent.action.LISTELE" />

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


ekledikten sonra artık projemi çalıştırabilirim. Android studio da projemi çalıştırıyorum.
    Run > Run 'app'  (Shift + F10)


telefonda ilk olarak ekleme işlemi yapacağım bunun için Ekle butonuna tıklıyorum.



Ad Soyad ve Email bölümüne verilerimi yazıyorum ve Ekle butonuna tıklıyorum. Eklendi uyarısını aldıktan sonra listeleme ekranına yönlendirme yapıldı.


Görüldüğü gibi listeleme ekranında girdiğim veri görüntülendi.

Evet arkadaşlar Asp.net ile Web servisimizi oluşturduk, Sql veritabanımız ile web servisimizi bağladık ve android ile bu servisi kullandık. Buradaki ekranlarımız yaptığımızın uygulamanın görüntüleridir. Herhangi bir sorun olursa yorum olarak belirtirseniz yardımcı olmaya çalışacağım.

Proje Dökümanları :
- Sql Veri Tabanı 
- Asp.WebServis
- Android Uygulaması