Android, Spring(웹) 연동
안드로이드와 웹을 연동하는 실습을 하기위해 메모장을 만들어보기로 했다.
안드로이드 어플에서 Web으로 요청을 하면 Web에서 DB를 통해 데이터를 가져와 Android로 보낸다.
안드로이드는 이 데이터를 받아서 SQLite에 저장한다.
- 안드로이드에서 웹으로 데이터 전송
Spring 프로젝트 생성
STS에 웹프로젝트를 생성한다.
컨트롤러를 생성하고 Map 형태로 파라미터를 주고받는 테스트용 메소드를 생성한다.
@RequestMapping("/android3")
public void androidTestWithRequest(HttpServletRequest request){
System.out.println(request.getParameter("title"));
System.out.println(request.getParameter("memo"));
}
안드로이드 프로젝트 생성, 인터넷 권한
최소버전은 16으로 설정하고 안드로이드 프로젝트를 생성한다.
인터넷 권한을 위해 Android Manifest에 permission을 준다.
<uses-permission android:name="android.permission.INTERNET" />
HttpClient 클래스 생성
package com.ktds.jmj.myremoteweb;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class HttpClient {
private static final String WWW_FORM = "application/x-www-form-urlencoded";
private int httpStatusCode;
private String body;
public int getHttpStatusCode() {
return httpStatusCode;
}
public String getBody() {
return body;
}
private Builder builder;
private void setBuilder(Builder builder) {
this.builder = builder;
}
public void request() {
HttpURLConnection conn = getConnection();
setHeader(conn);
setBody(conn);
httpStatusCode = getStatusCode(conn);
body = readStream(conn);
conn.disconnect();
}
private HttpURLConnection getConnection() {
try {
URL url = new URL(builder.getUrl());
return (HttpURLConnection) url.openConnection();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
private void setHeader(HttpURLConnection connection) {
setContentType(connection);
setRequestMethod(connection);
connection.setConnectTimeout(5000);
connection.setDoOutput(true);
connection.setDoInput(true);
}
private void setContentType(HttpURLConnection connection) {
connection.setRequestProperty("Content-Type", WWW_FORM);
}
private void setRequestMethod(HttpURLConnection connection) {
try {
connection.setRequestMethod(builder.getMethod());
} catch (ProtocolException e) {
e.printStackTrace();
}
}
private void setBody(HttpURLConnection connection) {
String parameter = builder.getParameters();
if ( parameter != null && parameter.length() > 0 ) {
OutputStream outputStream = null;
try {
outputStream = connection.getOutputStream();
outputStream.write(parameter.getBytes("UTF-8"));
outputStream.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if ( outputStream != null )
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
private int getStatusCode(HttpURLConnection connection) {
try {
return connection.getResponseCode();
} catch (IOException e) {
e.printStackTrace();
}
return -10;
}
private String readStream(HttpURLConnection connection) {
String result = "";
BufferedReader reader = null;
try {
reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line = null;
while ( (line = reader.readLine()) != null ) {
result += line;
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(reader != null)
reader.close();
} catch (IOException e) {}
}
return result;
}
public static class Builder {
private Map<String, String> parameters;
private String method;
private String url;
public String getMethod() {
return method;
}
public String getUrl() {
return url;
}
public Builder(String method, String url) {
if(method == null) {
method = "GET";
}
this.method = method;
this.url = url;
this.parameters = new HashMap<String, String>();
}
public void addOrReplace(String key, String value) {
this.parameters.put(key, value);
}
public void addAllParameters(Map<String, String> param) {
this.parameters.putAll(param);
}
public String getParameters() {
return generateParameters();
}
public String getParameter(String key) {
return this.parameters.get(key);
}
private String generateParameters() {
StringBuffer parameters = new StringBuffer();
Iterator<String> keys = getKeys();
String key = "";
while ( keys.hasNext() ) {
key = keys.next();
parameters.append(String.format("%s=%s", key, this.parameters.get(key)));
parameters.append("&");
}
String params = parameters.toString();
if ( params.length() > 0 ) {
params = params.substring( 0, params.length() - 1 );
}
return params;
}
private Iterator<String> getKeys() {
return this.parameters.keySet().iterator();
}
public HttpClient create() {
HttpClient client = new HttpClient();
client.setBuilder(this);
return client;
}
}
}
NetworkTask 생성
NetworkTask는 AsyncTask를 상속받는 클래스이다.
AsyncTask 는 추상클래스이고 부모클래스이다.
package com.ktds.jmj.myremoteweb;
import android.os.AsyncTask;
import android.os.Bundle;
import android.support.v7.app.ActionBarActivity;
import android.util.Log;
import android.widget.TextView;
import com.google.gson.Gson;
import java.util.HashMap;
import java.util.Map;
public class MainActivity extends ActionBarActivity {
private TextView tvTitle;
private TextView tvMemo;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tvTitle = (TextView) findViewById(R.id.tvTitle);
tvMemo = (TextView) findViewById(R.id.tvMemo);
NetworkTask2 networkTask = new NetworkTask2();
Map<String, String> params = new HashMap<String, String>();
params.put("title", "메모입니다.");
params.put("memo", "메모를 입력했습니다.");
networkTask.execute(params);
}
public class NetworkTask2 extends AsyncTask<Map<String, String>, Integer, String> {
@Override
protected String doInBackground(Map<String, String>... maps) { // 내가 전송하고 싶은 파라미터
// Http 요청 준비 작업
HttpClient.Builder http = new HttpClient.Builder("POST", "http://아이피주소:8080/SpringToAndroid/android3");
// Parameter 를 전송한다.
http.addAllParameters(maps[0]);
//Http 요청 전송
HttpClient post = http.create();
post.request();
// 응답 상태코드 가져오기
int statusCode = post.getHttpStatusCode();
// 응답 본문 가져오기
String body = post.getBody();
return body;
}
@Override
protected void onPostExecute(String s) {
}
}
}
안드로이드를 실행시키면 STS에 안드로이드에서 보낸 데이터가 출력된다.
params.put("title", "메모입니다.");
params.put("memo", "메모를 입력했습니다.");
메모입니다.
메모를 입력했습니다.
가 출력될 것이다.
- 웹에서 안드로이드로 데이터전송
STS에 Dependency 추가
웹에서 안드로이드로 데이터를 전송하기 위해서 STS에서 pom.xml에 jackson-databind를 Dependency에 추가한다.
컨트롤러의 메소드를
@RequestMapping("/android3")
@ResponseBody
public Map<String, String> androidTestWithRequestAndResponse(HttpServletRequest request){
System.out.println(request.getParameter("title"));
System.out.println(request.getParameter("memo"));
Map<String, String> result = new HashMap<String, String>();
result.put("data1", "메모에요");
result.put("data2", "두번째 메모입니다.");
return result;
}
이와같이 수정한다.
안드로이드 스튜디오에서 NetworkTask를 수정
onPostExecute에서 로그를 찍어 받은 데이터를 확인해본다.
public class NetworkTask2 extends AsyncTask<Map<String, String>, Integer, String> {
@Override
protected String doInBackground(Map<String, String>... maps) { // 내가 전송하고 싶은 파라미터
// Http 요청 준비 작업
HttpClient.Builder http = new HttpClient.Builder("POST", "http://10.225.152.179:8080/SpringToAndroid/android3");
// Parameter 를 전송한다.
http.addAllParameters(maps[0]);
//Http 요청 전송
HttpClient post = http.create();
post.request();
// 응답 상태코드 가져오기
int statusCode = post.getHttpStatusCode();
// 응답 본문 가져오기
String body = post.getBody();
return body;
}
@Override
protected void onPostExecute(String s) {
Log.d("JSON_RESULT", s);
}
}
결과적으로 데이터가 성공적으로 넘어올 것이다.
GSON
안드로이드에서는 웹으로부터 데이터를 JSON 형식으로 받게된다.
GSON은 Java Object를 JSON 형식으로 주고 받을 수 있또록 도와준 것으로 구글에서 만든 라이브러리 이다.
안드로이드에서 build.gradle(Module:app)을 열어 Dependencies에 gson을 추가한다.
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:21.0.0'
compile 'com.google.code.gson:gson:2.7'
}
추가하고 Sync Now를 클릭한다.
Data 자바 클래스 생성
데이터를 받아오기 위해 Data라는 자바 클래스를 생성한다.
package com.ktds.jmj.myremoteweb;
/**
* Created by 206-020 on 2016-06-21.
*/
public class Data {
private String data1;
private String data2;
public String getData1() {
return data1;
}
public void setData1(String data1) {
this.data1 = data1;
}
public String getData2() {
return data2;
}
public void setData2(String data2) {
this.data2 = data2;
}
}
NetworkTask 수정
로그를 찍어 출력했던 onPostExecute 에서 받은 데이터를 Gson을 이용해 Data 형 객체로 만든다.
@Override
protected void onPostExecute(String s) {
Log.d("JSON_RESULT", s);
Gson gson = new Gson();
Data data = gson.fromJson(s, Data.class);
Log.d("JSON_RESULT", data.getData1());
Log.d("JSON_RESULT", data.getData2());
tvTitle.setText(data.getData1());
tvMemo.setText(data.getData2());
}
출처 : https://best421.tistory.com/86
'Back-End > 그 외' 카테고리의 다른 글
[Android] 사설 SSL 인증서를 이용한 https 통신 (0) | 2023.02.09 |
---|---|
[Android] Retrofit2 GET, POST 로 API 호출해서 JSON 데이터 받아오기 (0) | 2023.02.09 |
[Android] Android에서 SpringBoot JPA 서버와 연동하기 (0) | 2023.02.09 |
[Android] Retrofit POST 방식 간단 예제 (0) | 2023.02.09 |
[KAKAO + FLASK] 카카오 챗봇 만들기 블로그 링크 (0) | 2023.02.09 |