안드로이드는 HTTPConnection 을 이용해서 서버에 접근한 다음, 그 리턴값을 받아 DB 로 이용한다.
API 서버측과 안드로이드 양쪽 모두 같은 *VO 를 만들어 사용해야 데이터를 받을 수 있다.
공통
ApiVO.java
public class ApiVO {
private String v1;
private String v2;
public String getV1() {
return v1;
}
public void setV1(String v1) {
this.v1 = v1;
}
public String getV2() {
return v2;
}
public void setV2(String v2) {
this.v2 = v2;
}
}
스프링
HomeController 에서 안드로이드가 호출할 메소드.
//text/plain -> 글자 그대로 리턴.
@RequestMapping(value = "/getData", method = RequestMethod.GET, produces="text/plain; charset=UTF-8")
public @ResponseBody String getData(Locale locale, Model model) throws Exception {
System.out.println("안드로이드로부터 호출됨.");
List<ApiVO> arr = service.list();
//1. 직렬화
//2. 역직렬화
Gson gson = new Gson();
String jsonStr = gson.toJson(arr);
return jsonStr;
}
안드로이드
MainActivity.java
package com.example.it.dataex01;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
Button btn_1;
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_1 = findViewById(R.id.btn_1);
btn_1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
new Thread(new Runnable() {
@Override
public void run() {
getData();
}
}).start();
}
});
}
public void getData(){
try {
BufferedReader in;
URL url = new URL("http://너의아이피는:8000/controller/getData");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
int responseCode = con.getResponseCode();
Log.i(TAG,responseCode+"");
if(responseCode == 200){
//바이트 단위 스트림이므로 getInputStream -> BufferedReader
//인풋스트림에 utf8 를 달 수도 있다.
//ex) new InputStreamReader(con.getInputStream(), utf-8)
in = new BufferedReader(new InputStreamReader(con.getInputStream()));
}else{
in = new BufferedReader(new InputStreamReader(con.getErrorStream()));
}
String inputData;
StringBuffer res = new StringBuffer();
int i = 0;
while ((inputData = in.readLine()) != null){
res.append(inputData);
i++;
Log.i(TAG,"count :"+i);
}
in.close();;
Log.i(TAG,res.toString());
Gson gson = new Gson();
//JSONArray 를 Gson 으로 받는 방법에는 두가지가 있다.
ApiVO[] arr = gson.fromJson(res.toString(), ApiVO[].class);
//List<ApiVO> arr2 = gson.fromJson(res.toString(), new TypeToken<List<ApiVO>>(){}.getType());
for(ApiVO api : arr){
Log.i(TAG, "arr 1 :"+api.getV1());
Log.i(TAG, "arr 1 :"+api.getV2());
}
}catch (Exception e){
e.printStackTrace();
}
}
}
Gson
Gson 은 JSONObject 를 편리하게 사용할 수 있게 해주는 라이브러리이다.
직렬화
List<ApiVO> arr = service.list();
Gson gson = new Gson();
String jsonStr = gson.toJson(arr);
역직렬화
JSONObject 하나를 받을 때에는
ApiVO = gson(res.toString(), ApiVO.class);
같은 방법으로 간단하게 받을 수 있지만
여러개의 ApiVO (JSONArray) 를 받을 때에는 다른 방법을 사용해야 한다.
ApiVO[] arr = gson.fromJson(res.toString(), ApiVO[].class)
List<ApiVO> arr = gson.fromJson(res.toString(), new TypeToken<List<ApiVO>>(){}.getType());
@Annotation
@RequestBody
요청한 결과값을 요청자가 원하는 타입으로 변환해서 사용할 수 있게 해 주는 것.
(데이터가 이동할 때에는 모두 바이트 스트림으로 이동하기 때문에 라이브러리(Jackson)를 통해서 원하는대로 변경이 가능하다.)
@ResponseBody
리턴값을 페이지 이동이 아니라 데이터로 전달해주는 것.
댓글 0
번호 | 제목 | 글쓴이 | 날짜 | 조회 수 |
---|---|---|---|---|
공지 | 이 게시판의 게시물들은 테스트 되지 않았음 | 황제낙엽 | 2019.08.28 | 445 |
» | 안드로이드 API서버(API Server) | 황제낙엽 | 2019.03.24 | 862 |
4 |
화면회전(Orientation)에 따른 화면구성하기(레이아웃 분리) [2]
![]() | 황제낙엽 | 2018.12.05 | 73 |
3 | 화면회전(Orientation)에 따른 화면구성하기(레이아웃 분리) [1] | 황제낙엽 | 2018.12.05 | 76 |
2 | 공공데이터 JSON 파싱하기 (HttpURLConnection, JSON) | 황제낙엽 | 2018.10.25 | 1491 |
1 | HttpURLConnection 을 이용하여 JSON데이터 읽어오는 샘플 | 황제낙엽 | 2018.10.25 | 144 |