안드로이드 API서버(API Server)

황제낙엽 2019.03.24 21:47 조회 수 : 792

안드로이드는 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

리턴값을 페이지 이동이 아니라 데이터로 전달해주는 것.