Client/Android

Android - Rest API에 GET 통신하기

JaeHoney 2020. 8. 3. 17:49

Rest API와 GET 통신하기

위 API서버의 URL은 index.php/visit_place/check_place?id=building1010 이다. 

안드로이드에서 서버의 값이나 서버와 연동된 DB의 값을 불러오는 방법을 사용하려 한다.

파싱에는 일반적으로 xml파싱과 JSON파싱이 있는데  JSON 파싱을 해보자.

 

접근 권한 허용

 

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.group6.apiexam">

    <uses-permission android:name="android.permission.INTERNET" /> // 인터넷 접근을 위해 추가
    <application
        android:usesCleartextTraffic="true" // http 사이트 접근을 위해 추가
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        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>
    </application>

</manifest>

 

인터넷 접근을 허용하고 http 사이트 접근을 허용해줘야 합니다.

 

 

MainActivity.java

 

import android.os.Bundle;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import java.util.concurrent.ExecutionException;


public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView textView = (TextView)findViewById(R.id.text1); 
        String resultText = "[NULL]";

        try {
            resultText = new Task().execute().get();
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }

        textView.setText(resultText);
    }
}

 

resultText를 기본을 NULL이라고 해서 값이 없다는 것을 의미하도록 했습니다. 

 

Task 클래스의 생성자를 이용해 값을 가져옵니다.

 

텍스트뷰의 id는 임의로 text1으로 사용했습니다.

 

 

Task.java

 

import android.os.AsyncTask;
import android.util.Log;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class Task extends AsyncTask<String, Void, String> {

    String clientKey = "#########################";;
    private String str, receiveMsg;
    private final String ID = "########";

    @Override
    protected String doInBackground(String... params) {
        URL url = null;
        try {
            url = new URL("http://101.101.xxx.189/api/index.php/visit_place/check_place?id=building1010"); // 서버 URL

            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=UTF-8");
            conn.setRequestProperty("x-waple-authorization", clientKey);

            if (conn.getResponseCode() == conn.HTTP_OK) {
                InputStreamReader tmp = new InputStreamReader(conn.getInputStream(), "UTF-8");
                BufferedReader reader = new BufferedReader(tmp);
                StringBuffer buffer = new StringBuffer();
                while ((str = reader.readLine()) != null) {
                    buffer.append(str);
                }
                receiveMsg = buffer.toString();
                Log.i("receiveMsg : ", receiveMsg);

                reader.close();
            } else {
                Log.i("결과", conn.getResponseCode() + "Error");
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return receiveMsg;
    }
}

 

URL부분에 요청 받을 서버의 주소를 입력하고 JSON 값을받아옵니다.

 

 

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/text1" />

</LinearLayout>

 

이렇게 서버 값을 테스트 출력 해보기 위해 테스트뷰를 하나 만듭니다.

 

 

출력결과

 

 

이렇게 api 정의에 맞는 값이 출력 되는 것을 확인할 수 있습니다.

이 예제를 통해 얻은 값을 사용할 앱의 UI에 맞게 가공해서 구현하면 됩니다.