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에 맞게 가공해서 구현하면 됩니다.
'Client > Android' 카테고리의 다른 글
Android - ViewPager 사용하기 (+CircleIndicator) (0) | 2020.08.13 |
---|---|
Android - JSON 파싱 예제 (6) | 2020.08.13 |
Android - Rest API에 POST 값 전송 (로그인 테스트) (18) | 2020.08.08 |