일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- jvm이란
- 안드로이드 레트로핏 crud
- 안드로이드 레트로핏 사용법
- rxjava cold observable
- ar vr 차이
- 안드로이드 유닛 테스트
- android ar 개발
- rxjava disposable
- 클래스
- 안드로이드 유닛 테스트 예시
- 객체
- 멤버변수
- ANR이란
- 자바 다형성
- Rxjava Observable
- 스택 자바 코드
- rxjava hot observable
- 플러터 설치 2022
- 큐 자바 코드
- 스택 큐 차이
- 안드로이드 라이선스
- 서비스 vs 쓰레드
- 2022 플러터 안드로이드 스튜디오
- 안드로이드 유닛테스트란
- 2022 플러터 설치
- 서비스 쓰레드 차이
- android retrofit login
- jvm 작동 원리
- 안드로이드 os 구조
- 안드로이드 라이선스 종류
- Today
- Total
나만을 위한 블로그
[Android] 레트로핏으로 네이버 검색 API 사용하는 법 본문
네이버 검색 API를 사용할 일이 생겨서 찾아보는데, 자바 언어로 레트로핏을 사용해 가져오는 예제가 보이질 않았다.
비슷한 API를 코틀린으로 작성한 건 있었는데, 이걸 보면서 자바로 바꿔봤더니 잘 되서 여기에 기록한다.
당연한 거지만 네이버 디벨로퍼에 앱을 등록하고 검색 API를 사용할 수 있도록 설정해야 한다. 이 방법은 검색하면 잘 나와 있으니 여기서 굳이 설명하진 않는다. 아래는 네이버 디벨로퍼 사이트 링크다.
https://developers.naver.com/main/
먼저 의존성 문구부터 앱 수준 gradle 파일에 넣어주자.
implementation 'com.squareup.retrofit2:retrofit:2.6.4'
implementation 'com.squareup.retrofit2:converter-gson:2.6.4'
implementation 'com.squareup.retrofit2:converter-scalars:2.6.4'
implementation 'com.google.code.gson:gson:2.8.6'
gson 라이브러리는 혹시 몰라서 같이 넣어뒀다.
그리고 매니페스트에 인터넷 퍼미션을 넣어준다.
<uses-permission android:name="android.permission.INTERNET" />
다음은 ApiClient.java 클래스다. 레트로핏 객체를 만들어 반환하는 클래스다.
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import retrofit2.converter.scalars.ScalarsConverterFactory;
public class ApiClient
{
private static final String BASE_URL = "https://openapi.naver.com/v1/";
private static Retrofit retrofit;
public static Retrofit getInstance()
{
Gson gson = new GsonBuilder()
.setLenient()
.create();
if (retrofit == null)
{
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(ScalarsConverterFactory.create())
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
}
return retrofit;
}
}
그리고 레트로핏 객체를 통해 호출할 추상 메서드를 정의한 인터페이스 파일이다.
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Path;
import retrofit2.http.Query;
public interface ApiInterface
{
@GET("search/{type}")
Call<String> getSearchResult(
@Header("X-Naver-Client-Id") String id,
@Header("X-Naver-Client-Secret") String pw,
@Path("type") String type,
@Query("query") String query
);
}
네이버 검색 API 명세를 보면 GET으로 데이터를 전송하기 때문에 메서드의 어노테이션은 GET으로 설정했고, 소괄호 안에는 Path 값이 들어갈 공간을 마련해둔다.
헤더에 클라이언트 id와 secret을 넣어주기 위해 @Header를 2개 넣어주고, 구체적인 API의 URI로 이동하기 위해 @Path를 String으로 선언했다. 마지막으로 쿼리를 날리기 위해 @Query도 String으로 선언했다.
검색 API의 요청 URL은 아래와 같다.
https://openapi.naver.com/v1/search/book.json
밑의 자바 파일에서 보겠지만, type에는 book.json이, 그 뒤에는 쿼리할 단어가 들어간다. 그렇기 때문에 레트로핏 추상 메서드의 매개변수를 위와 같이 구성했다.
마지막으로 메인 액티비티의 자바 파일이다. 결과 확인은 로그로도 충분히 할 수 있기 때문에 xml은 만들지 않았다.
책 검색을 원했기 때문에 3번 인자로 book.json을 넣었고, 4번 인자에는 editText에 입력된 값을 getText().toString()으로 가져온 걸 변수에 넣어서 써도 무관하다.
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
public class MainActivity extends AppCompatActivity
{
private final String TAG = this.getClass().getSimpleName();
private String client_id = "클라이언트 id";
private String client_pw = "클라이언트 secret";
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getResultSearch();
}
void getResultSearch()
{
ApiInterface apiInterface = ApiClient.getInstance().create(ApiInterface.class);
Call<String> call = apiInterface.getSearchResult(client_id, client_pw, "book.json", "안드로이드");
call.enqueue(new Callback<String>()
{
@Override
public void onResponse(Call<String> call, Response<String> response)
{
if (response.isSuccessful() && response.body() != null)
{
String result = response.body();
Log.e(TAG, "성공 : " + result);
}
else
{
Log.e(TAG, "실패 : " + response.body());
}
}
@Override
public void onFailure(Call<String> call, Throwable t)
{
Log.e(TAG, "에러 : " + t.getMessage());
}
});
}
}
이렇게 할 경우 아래와 같은 결과가 나온다.
E/MainActivity: 성공 : {
"lastBuildDate": "Wed, 04 Aug 2021 01:07:19 +0900",
"total": 2179,
"start": 1,
"display": 10,
"items": [
{
"title": "Do it! <b>안드로이드</b> 앱 프로그래밍(8판) (자바로 모바일 앱 개발하기, 개정8판)",
"link": "http://book.naver.com/bookdb/book_detail.php?bid=20660759",
"image": "https://bookthumb-phinf.pstatic.net/cover/206/607/20660759.jpg?type=m1&udate=20210706",
"author": "정재곤",
"price": "40000",
"discount": "36000",
"publisher": "이지스퍼블리싱",
"pubdate": "20210623",
"isbn": "116303262X 9791163032625",
"description": "<b>안드로이드</b> 분야 1위 도서!\n《Do it! <b>안드로이드</b> 앱 프로그래밍》 개정 8판이 나왔다!\n<b>안드로이드</b> 11 버전과 <b>안드로이드</b> 스튜디오 4.2 버전을 반영한 《Do it! <b>안드로이드</b> 앱 프로그래밍》의 개정 8판이 나왔다. 이번 개정판에도 입문자를 위한 <b>안드로이드</b> 스튜디오 사용법을 담았고, 그동안 독자에게 받은 질문... "
},
{
"title": "초보 입문자를 위한 <b>안드로이드</b> 스튜디오",
"link": "http://book.naver.com/bookdb/book_detail.php?bid=20794313",
"image": "https://bookthumb-phinf.pstatic.net/cover/207/943/20794313.jpg?type=m1&udate=20210722",
"author": "이정택",
"price": "39900",
"discount": "39900",
"publisher": "퍼플",
"pubdate": "20210715",
"isbn": "8924083473 9788924083477",
"description": "이 책은 구글이 제공하는 <b>안드로이드</b> 운영체제(AOS)를 이용하여 모바일 등에 사용하는 애플리케이션을 개발하고자 하는 초보 개발자들을 위한 <b>안드로이드</b> 스튜디오의 사용 설명서이다.이 책의 구성은 1장과 2장에서 개요를 설명하고, 3장에서 앱을 작성한다. 4장에서 앱을 빌드하고 실행한다. 그러므로, 앱을... "
},
{
"title": "이것이 <b>안드로이드</b>다 with 코틀린 (<b>안드로이드</b> 입문의 3가지 장벽, 언어+실전+환경 완벽 대응!)",
"link": "http://book.naver.com/bookdb/book_detail.php?bid=18006551",
"image": "https://bookthumb-phinf.pstatic.net/cover/180/065/18006551.jpg?type=m1&udate=20210329",
"author": "고돈호",
"price": "34000",
"discount": "30600",
"publisher": "한빛미디어",
"pubdate": "20210302",
"isbn": "1162243945 9791162243947",
"description": "최신 버전에 맞춰 완벽하게 실습할 수 있는 코틀린 <b>안드로이드</b> 앱 개발 도서!\n코틀린, <b>안드로이드</b>, <b>안드로이드</b> 스튜디오! 코틀린으로 <b>안드로이드</b> 앱을 개발하려면 살펴봐야 할 사항이 많습니다. 특히 코틀린 1.4.20 버전부터는 코틀린 익스텐션이 폐기되는 터라 입문자로서 더욱 혼란스럽습니다. 〈이것이... "
},
{
"title": "Do it! <b>안드로이드</b> 앱 프로그래밍",
"link": "http://book.naver.com/bookdb/book_detail.php?bid=16242159",
"image": "https://bookthumb-phinf.pstatic.net/cover/162/421/16242159.jpg?type=m1&udate=20210717",
"author": "정재곤",
"price": "40000",
"discount": "36000",
"publisher": "이지스퍼블리싱",
"pubdate": "20200123",
"isbn": "1163031410 9791163031413",
"description": "9년 연속 <b>안드로이드</b> 분야 1위!\nDo it! <b>안드로이드</b> 앱 프로그래밍이 새 옷을 갈아입고 돌아왔다!\n《Do it! <b>안드로이드</b> 앱 프로그래밍》 전면 개정 7판이 나왔습니다. 이번 개정판은 <b>안드로이드</b> 운영체제가 ‘파이’에서 ‘<b>안드로이드</b> 10’으로 바뀌면서 외부 라이브러리가 androidx로 변경된 점에 맞춰... "
},
{
"title": "<b>안드로이드</b> 프로그래밍(Android Studio를 활용한)(6판) (Android 11.0 (R) 지원, Android Studio 4.x 사용, 6판)",
"link": "http://book.naver.com/bookdb/book_detail.php?bid=17764819",
"image": "https://bookthumb-phinf.pstatic.net/cover/177/648/17764819.jpg?type=m1&udate=20210624",
"author": "우재남|박길식",
"price": "32000",
"discount": "31360",
"publisher": "한빛아카�
여기까지 됐으면 json 값을 파싱해서 텍스트뷰에 보여주든 리사이클러뷰에 보여주든 다양한 처리가 가능할 것이다.
'Android' 카테고리의 다른 글
[Android] Rxjava와 Retrofit 같이 사용하는 법 (0) | 2021.08.04 |
---|---|
[Android] 레트로핏 사용 시 Expected a string but was BEGIN_OBJECT at line 1 column 2 path $ 에러 해결 (0) | 2021.08.04 |
[Android] Duplicate class android.support.v4.app.INotificationSideChannel 에러 해결 (0) | 2021.08.04 |
[Android] 갤러리에서 사진을 선택해 프로필 이미지로 지정하고 Volley로 서버에 업로드하는 법 (0) | 2021.07.27 |
[Android] JSONArray 안의 JSONArray 파싱하는 방법 (0) | 2021.06.26 |