Android ile restful webservice kullanımını
Merhaba arakdaşlar,
Bu yazımda android ile restful web servis kullanımını anlatacağım. İlk önce rest servis tarafını yazalım.
Servisi yazacağımız projemiz springboot olacaktır. Maven ile oluşturacağımız için kütüphanelerimizi pom.xml’e ekliyoruz.
pom.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
<?xml version="1.0"?> <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <modelVersion>4.0.0</modelVersion> <packaging>jar</packaging> <groupId>io.bilisim.message</groupId> <artifactId>AndroidRestCallService</artifactId> <version>0.0.1-SNAPSHOT</version> <name>AndroidRestCallService</name> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.8</java.version> </properties> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.3.6.RELEASE</version> </parent> <dependencies> <dependency> <groupId>javax.ws.rs</groupId> <artifactId>jsr311-api</artifactId> <version>1.1.1</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.google.code.gson</groupId> <artifactId>gson</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> |
Projemizde src/main/resources dizininin altına application.properties isminde proje konfigurasyonlarının olduğu bir dosya açıyoruz ve ilgili değerleri giriyoruz.Bu dosyada tomcat’in hangi port’u kullanacağını yaazıyoruz.
Application.properties
1 2 3 4 5 |
server.port=8095 |
Android uygulamamızda ekrandan girilen bir text ‘i servisimizin endpointin’e bir object olarak post edeceğiz.Bu yüzden modelimiz şu şekidle olacaktır.
MessageObject.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package io.bilisim.message.modal; public class MessageObject { public String data; public String getData() { return data; } public void setData(String data) { this.data = data; } } |
Şimdi ise endpointimizi yazalım. Entpointimiz post edilen objenin çerisindeki data fieldini konsola yazsın.
MailServiceController.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 |
package io.bilisim.message.controller; import javax.ws.rs.Consumes; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; import org.apache.tomcat.util.codec.binary.Base64; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.PropertySource; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import io.bilisim.modal.MessageObject; @RestController @RequestMapping("/message") public class MailServiceController { @Value("${mail.username}") String username; @Value("${mail.password}") String password; @RequestMapping(value = "/running", method = RequestMethod.GET) @Consumes({ MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN, MediaType.APPLICATION_XML }) @Produces({ MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN, MediaType.APPLICATION_XML }) public String running() { System.out.println("www.bilisim.io"); return "true"; } //Endpointimiz url+controller path+ method path şeklinde olacaktır. //localhost:8095/message @RequestMapping(value = "/showMessage", method = RequestMethod.POST) @Consumes({ MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN, MediaType.APPLICATION_XML }) @Produces({ MediaType.APPLICATION_JSON, MediaType.TEXT_PLAIN, MediaType.APPLICATION_XML }) public String showMessage(@RequestBody MessageObject messageObject) { System.out.println("www.bilisim.io"); System.out.println("gelen mesaj : " + messageObject.getData()); return messageObject.getData(); } } |
Projemiz SpringBoot olduğu için application sınıfımız şu şekilde olacaktır.
Application.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package io.bilisim.message; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; /** * mkilic * */ @SpringBootApplication public class Application { private static final Logger logger = LoggerFactory.getLogger(Application.class); public static void main(String[] args) { logger.info("application start"); SpringApplication.run(Application.class, args); } } |
Servisimizi test edelim ve url şu şekilde olacaktır.
http://localhost:8095/message/showMessage
——>
Şimdi ise android tarafına geçelim.
Android studio ile yeni bir proje oluşturuyoruz . İlk önce bağımlılıklarımızı projemize ekleyelim.
build.gradle
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
apply plugin: 'com.android.application' android { compileSdkVersion 24 buildToolsVersion "24.0.2" defaultConfig { applicationId "bilisim.io.restcallexample" minSdkVersion 10 targetSdkVersion 24 versionCode 1 versionName "1.0" testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } android { useLibrary 'org.apache.http.legacy' } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', { exclude group: 'com.android.support', module: 'support-annotations' }) compile 'com.android.support:appcompat-v7:24.2.1' compile 'com.android.support:design:24.2.1' compile 'org.apache.httpcomponents:httpcore:4.4.1' compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.0-alpha4' compile 'org.apache.httpcomponents:httpclient:4.5' compile 'com.google.android.gms:play-services-appindexing:8.4.0' compile group: 'org.json', name: 'json', version: '20090211' compile 'com.loopj.android:android-async-http:1.4.9' compile 'org.springframework.android:spring-android-rest-template:1.0.1.RELEASE' testCompile 'junit:junit:4.12' } |
Ekranımızda TextView ve butondan oluşmaktadır. TextView ‘e yazıdığımız metni butona bastığımızda sunucumuzdaki rest servise göndermesini isteyeceğiz.
Şimdi ise MainActivity.java sınıfımızı yazalım. Çok basit bir şekilde ekranda butona basıldığında textview da olan text’I sunucumuza post ediyor.
MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 |
package bilisim.io.restcallexample; import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.EditText; import android.widget.TextView; import android.widget.Toast; import org.apache.http.HttpResponse; import org.apache.http.client.ClientProtocolException; import org.apache.http.client.HttpClient; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.DefaultHttpClient; import org.json.JSONException; import org.json.JSONObject; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class MainActivity extends AppCompatActivity { String url = "http://xxxxxxxxxxxx:8095/message/showMessage"; String veri_string; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final EditText editText = (EditText) findViewById(R.id.editText); final Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { public void onClick(View v) { String msg = editText.getText().toString(); //Service post ettiğimiz yer sendWebservis(msg); Toast.makeText(getBaseContext(), "Mesaj gödnerildi : " + msg, Toast.LENGTH_LONG).show(); } }); } public void sendWebservis(String data){ new HttpAsyncTaskPost().execute(url, data); } public String Post(String url,String message) { InputStream inputStream = null; String result = ""; HttpClient httpclient = new DefaultHttpClient(); HttpPost httppost = new HttpPost(url); String json = ""; JSONObject jsonObject = new JSONObject(); try { //gönderilecek bilgilerin json objesine eklendiği kısım jsonObject.accumulate("data", message); } catch (JSONException e2) { e2.printStackTrace(); } try { json = jsonObject.toString(); StringEntity se = null; se = new StringEntity(json, "UTF-8"); httppost.setEntity(se); } catch (Exception e23) { // TODO Auto-generated catch block e23.printStackTrace(); } httppost.setHeader("Accept", "application/json"); httppost.setHeader("Accept-Encoding", "utf-8"); httppost.setHeader("Accept-Language", "tr-TR"); httppost.setHeader("Content-Type", "application/json"); HttpResponse httpResponse = null; try { httpResponse = httpclient.execute(httppost); } catch (ClientProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } if(httpResponse.getEntity() != null) { try { inputStream = httpResponse.getEntity().getContent(); } catch (IllegalStateException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } if(inputStream != null) { try { result = convertInputStreamToString(inputStream); } catch (IOException e) { e.printStackTrace(); } } else { result = "hata var!"; } } return result; } private static String convertInputStreamToString(InputStream inputStream) throws IOException{ BufferedReader bufferedReader = new BufferedReader( new InputStreamReader(inputStream)); String line = ""; String result = ""; while((line = bufferedReader.readLine()) != null) result += line; inputStream.close(); return result; } private class HttpAsyncTaskPost extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... urls) { return Post(urls[0],urls[1]); } } } |
Şimdi ise test edelim. Telefonumuzdan gönder dediğimizde sunucu konsoluna post ettiğimiz text düşecekmi gözlemleyelim.
Gördüğünüz üzere konsola yazımız ulaştı.
Umarım yararlı olmuştur.
iyi Çalışmalar