요즘에 REST API 소스를 직접 짜는 사람은 적을 것이라고 예상한다. (레트로핏 같은 걸 쓰겠지...?)
그래도 의미가 있지 않을까 해서 정리 해본다.
https://api.github.com 로 접속해서 그 중에 "current_user_url" 항목을 화면에 띄우는 예제이다.
RestfulAPI.zip
/*
* 목표
* 1. AsyncTask와 http url connection을 이용한 http 호출 만들기
* 2. 리턴된 json을 파싱하는 방법을 통하여 JSON 객체 다루는 법 습득하기
* 3. json 객체에서 원하는 데이터 빼내서 화면에 출력하기
*
* 작업 순서
* 1. 받을 response를 바탕으로 HubObject를 먼저 만들고
* 2. 통신할 모듈과 파싱할 모듈을 APIClient로 만들고
* 3. APIClient를 감쌀 AsyncTask class를 만든다.
* 4. Main class에서는 AsyncTask를 생성하여 호출하고 데이터를 받는다.
*
* */
class HubObject { private String current_user_url; private String hub_url;
public String getCurrent_user_url() { return current_user_url; }
public void setCurrent_user_url(String current_user_url) { this.current_user_url = current_user_url; }
public String getHub_url() { return hub_url; }
public void setHub_url(String hub_url) { this.hub_url = hub_url; } }
|
public class APIClient { final static String GITURL = "https://api.github.com";
public HubObject getHubObject() { HubObject obj = new HubObject();
try{ // 통신하고 URL url = new URL(GITURL); HttpsURLConnection urlConnection = (HttpsURLConnection)url.openConnection(); // urlConnection.setConnectTimeout(30); // urlConnection.setReadTimeout(30);
InputStream in = new BufferedInputStream(urlConnection.getInputStream()); JSONObject json = new JSONObject(getStringFromInputStream(in));
// json에서 데이터를 가져오는 코드가 존재 해야 함 obj = parseJSON(json);
}catch (MalformedURLException e){ System.err.println("MalformedURLException URL"); e.printStackTrace();
return null; } catch (IOException e) { System.err.println("MalformedURLException IO"); e.printStackTrace();
return null; } catch (JSONException e) { System.err.println("MalformedURLException JSON"); e.printStackTrace();
return null; }
return obj; }
private HubObject parseJSON(JSONObject json) { HubObject obj = new HubObject(); try { obj.setCurrent_user_url(json.getString("current_user_url")); } catch (JSONException e) { e.printStackTrace(); }
return obj; }
private String getStringFromInputStream(InputStream is) {
BufferedReader br = null; StringBuilder sb = new StringBuilder();
String line; try{ br = new BufferedReader(new InputStreamReader(is)); while( (line = br.readLine()) != null){ sb.append(line); } }catch (IOException e) { e.printStackTrace(); }finally { if(br != null){ try{ br.close(); } catch (IOException e) { e.printStackTrace(); } } }
return sb.toString(); }
} |
public class AsyncConnection extends AsyncTask{
@Override public HubObject doInBackground(Object[] objects) {
APIClient apiClient = new APIClient();
HubObject obj = apiClient.getHubObject();
return obj; }
} |
public class MainActivity extends AppCompatActivity {
/* * 목표 * 1. AsyncTask와 http url connection을 이용한 http 호출 만들기 * 2. 리턴된 json을 파싱하는 방법을 통하여 JSON 객체 다루는 법 습득하기 * 3. json 객체에서 원하는 데이터 빼내서 화면에 출력하기 * * 작업 순서 * 1. 받을 response를 바탕으로 HubObject를 먼저 만들고 * 2. 통신할 모듈과 파싱할 모듈을 APIClient로 만들고 * 3. APIClient를 감쌀 AsyncTask class를 만든다. * 4. Main class에서는 AsyncTask를 생성하여 호출하고 데이터를 받는다. * * */
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main);
AsyncConnection connection = new AsyncConnection();
try{ HubObject obj = (HubObject)connection.execute().get();
TextView tv = (TextView)findViewById(R.id.response); tv.setText(obj.getCurrent_user_url());
} catch (InterruptedException e) { e.printStackTrace(); } catch (ExecutionException e) { e.printStackTrace(); }
}
} |
참고 :
https://code.tutsplus.com/ko/tutorials/android-from-scratch-using-rest-apis--cms-27117
http://bcho.tistory.com/1050