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.
2 Nisan 2016 Cumartesi
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.
"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
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ı
(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ı
28 Mart 2016 Pazartesi
Json.net kütüphanesini C# projesine eklemek | add json.net library in C# project
Visual Studioyu ile projemizi açıyoruz. Üst menüden "Tools > Nuget Package Manager > Manage Nuget Package for solution" seçilerek paket yöneticimizi açıyoruz. Burada Browse seçilerek arama kutusunda "json.net" diye arama yaptırıyoruz. Arama sonucunda "Newtonsoft.Json" paketi seçilerek sağ menüden projemize tik atıyoruz ve install diyerek yüklemeyi başlatıyoruz. Karşımıza çıkan koşulları OK diyerek kabul ediyoruz. Ve artık projemize json.net kütüphanesi eklemiş oluyoruz.
26 Mart 2016 Cumartesi
httpclient kütüphanesi tanımlanamıyor | cannot resolve httpclient android studio
Android studioda webservisi yazarken karşılaştığım bir sorunu sizinle paylaşmak istiyorum. HttpClient sınıfından bir nesne türetecektim. Projemin Kütüphaneyi tanımlamadığını farkettim. Araştırdıktan sonra bu sorunun build dosyasına http kütüphanesini eklememizin gerekli olduğunu anladım. Bunun için build dosyamıza aşağıdaki kod parçasını
useLibrary 'org.apache.http.legacy'
aşağıdaki gibi ekliyoruz.
en son sync ederek HttpClient sınıfını kullanabiliriz.
useLibrary 'org.apache.http.legacy'
aşağıdaki gibi ekliyoruz.
en son sync ederek HttpClient sınıfını kullanabiliriz.
20 Mart 2016 Pazar
Javascript ile substring fonksiyonu | substring use with javascript
var deneme = "Merhaba Dünya";
var sbstr = deneme.substring(1,4);
çıktımız aşağıdaki gibi olacaktır;
erh
var sbstr = deneme.substring(1,4);
çıktımız aşağıdaki gibi olacaktır;
erh
Kaydol:
Kayıtlar (Atom)