출처: https://www.edwith.org/boostcourse-android/lecture/17092/
1. Open API
영화진흥위원회에서 제공하는 Open API를 사용해 영화 정보를 요청하고 응답을 받아볼 수 있도록 한다.
영화진흥위원회 오픈API: http://www.kobis.or.kr/kobisopenapi/homepg/main/main.do
응답 데이터는 문자열 형식으로 받게 되고, JSON 포맷으로 되어 있다.
2. JSON (JavaScript Object Notation)
JSON은 Key-Value 쌍으로 이루어진 데이터 교환 포맷이다.
자바스크립트 객체 포맷의 데이터를 주고받을 때 사용할 수 있도록 만든 것이기 때문에, 자바스크립트 객체 포맷과 거의 동일하다.
JSON을 사용하면 서버에서 응답을 받을 때 자바스크립트 객체로 바꿔서 바로 사용할 수 있다.
자바스크립트 객체는 중괄호({, })를 이용해 만들 수 있고, 그 안에는 여러 개의 속성이 들어간다.
속성은 속성 이름과 속성 값이 콜론(:)으로 구분된다.
대괄호([, ])를 사용해 여러 개의 객체가 들어있는 배열을 넣어둘 수 있다.
3. Gson
Gson은 JSON 문자열을 java 객체로 변환해 주는 라이브러리이다.
Gson을 사용하면 한 줄의 코드로 JSON 문자열을 자바 객체로 바꾸어줄 수 있다.
Volley를 이용해 웹 서버로부터 JSON 응답을 받았다면, Gson을 이용해 자바 객체로 바꾸고 그 객체안의 데이터를 사용할 수 있다.
4. 구현 결과 화면
5. build.gradle (app)
Gson은 외부라이브러리이어서 dependencies에 추가한다.
1 | implementation 'com.google.code.gson:gson:2.8.2' | cs |
6. AndroidManifest.xml
인터넷 권한을 추가한다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.tistory.qlyh8.practice"> <uses-permission android:name="android.permission.INTERNET"/> <application 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="com.tistory.qlyh8.practice.MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> </manifest> | cs |
7. activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context="com.tistory.qlyh8.practice.MainActivity"> <Button android:id="@+id/button" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="요청하기"/> <ScrollView android:id="@+id/scroll_view" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@android:color/holo_blue_light" android:padding="10dp"> <TextView android:id="@+id/text_view" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="18sp"/> </ScrollView> </LinearLayout> | cs |
8. MovieList.java
JSON 문자열을 자바 객체로 변환하기 위해서는 먼저 자바 클래스를 정의해야 한다.
1 2 3 4 5 6 | package com.tistory.qlyh8.practice; public class MovieList { MovieListResult boxOfficeResult; } | cs |
9. MovieListResult.java
1 2 3 4 5 6 7 8 9 10 | package com.tistory.qlyh8.practice; import java.util.ArrayList; public class MovieListResult { String boxofficeType; String showRange; ArrayList<DailyBoxOffice> dailyBoxOfficeList = new ArrayList<>(); } | cs |
10. DailyBoxOffice.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | package com.tistory.qlyh8.practice; public class DailyBoxOffice { String rnum; String rank; String rankInten; String rankOldAndNew; String movieCd; String moviceNm; String openDt; String salesAmt; String salesShare; String salesInten; String salesChange; String salesAcc; String audiCnt; String audiInten; String audiChange; String audiAcc; String scrnCnt; String showCnt; } | cs |
11. MainActivity.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 | package com.tistory.qlyh8.practice; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.view.View; import android.widget.TextView; import com.android.volley.AuthFailureError; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.VolleyError; import com.android.volley.toolbox.StringRequest; import com.android.volley.toolbox.Volley; import com.google.gson.Gson; import java.util.HashMap; import java.util.Map; public class MainActivity extends AppCompatActivity { TextView textView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); textView = findViewById(R.id.text_view); findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 버튼을 클릭했을 때 request 객체를 만들고 request queue 에 넣는다. sendRequest(); } }); // request queue 는 앱이 시작되었을 때 한 번 초기화되기만 하면 계속 사용이 가능 if (AppHelper.requestqueue == null) AppHelper.requestqueue = Volley.newRequestQueue(getApplicationContext()); } public void sendRequest(){ String url = "http://www.kobis.or.kr/kobisopenapi/webservice/rest/boxoffice/searchDailyBoxOfficeList.json?key=430156241533f1d058c603178cc3ca0e&targetDt=20120101"; // 문자열을 주고 받기 위한 request 객체는 StringRequest 클래스를 이용해 만들 수 있다. // 요청방식, URL, 리스너, 에러 리스너를 전달한다. // 요청방식: GET, POST 메서드 // URL: 웹서버의 URL 정보 // 리스너: 응답을 성공적으로 받았을 때 리스너의 onResponse 메소드를 자동으로 호출 // 에러 리스너: 에러가 발생했을 때 호출 StringRequest request = new StringRequest( Request.Method.GET, url, new Response.Listener<String>() { @Override public void onResponse(String response) { println("응답: " + response); processResponse(response); // 응답 처리 메서드 } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { println("에러: " + error.getMessage()); } } ) { @Override protected Map<String, String> getParams() throws AuthFailureError { // 만약 POST 방식에서 전달할 요청 파라미터가 있다면 HashMap 객체에 넣어준다. Map<String, String> map = new HashMap<>(); return map; } }; request.setShouldCache(false); // 이전 결과가 있더라도 새로 요청해서 응답을 보여줌 AppHelper.requestqueue.add(request); // request queue 에 request 객체를 넣어준다. } public void processResponse(String response){ Gson gson = new Gson(); MovieList movieList = gson.fromJson(response, MovieList.class); if(movieList != null){ println("박스오피스 타입: " + movieList.boxOfficeResult.boxofficeType); println("박스오피스 기간: " + movieList.boxOfficeResult.showRange); println("영화 개수: " + movieList.boxOfficeResult.dailyBoxOfficeList.size()); } } public void println(String str){ textView.append(str + "\n"); } } | cs |
참고
google/json: https://github.com/google/gson
Leveraging the Gson Library: https://guides.codepath.com/android/leveraging-the-gson-library
'Android' 카테고리의 다른 글
SQLite database 사용해보기 (0) | 2018.08.19 |
---|---|
AsyncTask를 이용해 이미지 다운로드하기 (0) | 2018.08.04 |
Volley 사용하기 - (1) (0) | 2018.07.31 |
HTTP - 2. 웹으로 요청하기 (0) | 2018.07.30 |
HTTP - 1. HTTP란 (0) | 2018.07.30 |