728x90
1. Retrofit2 라이브러리 사용을 위한 설정 방법
1. 모듈 추가 build.gradle
dependencies {
implementation 'com.squareup.retrofit2:retrofit:2.9.0'
implementation 'com.squareup.retrofit2:converter-gson:2.9.0'
implementation("com.squareup.okhttp3:logging-interceptor:4.9.0")
}
2. 기본 설정 ( NetworkClient 클래스 )
이건 이해하는 것보다는 복사해서 쓰는 것이 편하다.
주의해야 할 부분은 Config.DOMAIN 부분만 자신의 API URL로 변경하면 된다.
보통은 보안상의 이유로(키 값, 시크릿 키 값 노출) 다른 클래스에 저장하여 비공개로 두는 경우가 많다.
API 서버를 설정하는 단계라고 보면 된다.
public class NetworkClient {
public static Retrofit retrofit;
public static Retrofit getRetrofitClient(Context context){
if(retrofit == null){
// 통신 로그 확인할 때 필요한 코드
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor();
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
// 네트워크 연결관련 코드
OkHttpClient httpClient = new OkHttpClient.Builder().connectTimeout(1, TimeUnit.MINUTES)
.readTimeout(1,TimeUnit.MINUTES).writeTimeout(1,TimeUnit.MINUTES).
addInterceptor(loggingInterceptor).build();
// 네트워크로 데이터를 보내고 받는 레트로핏 라이브러리 관련 코드
retrofit = new Retrofit.Builder().baseUrl(Config.DOMAIN).client(httpClient).addConverterFactory(GsonConverterFactory.create()).build();
}
return retrofit;
}
}
2. Retrofit2 라이브러리를 이용한 POST로 API 호출하여 처리하는 방법
- 파라미터에 바디(@Body)를 사용, PUT/POST는 바디를 사용
- 주의! 요청과 응답도 모두 바디로 사용하므로 혼동하면 안된다!!!
(내가 그랬음)
- 주의! 요청과 응답도 모두 바디로 사용하므로 혼동하면 안된다!!!
- 사용자가 서버에 데이터를 추가하거나 정보를 입력 할 때 사용 (회원가입, 글쓰기 등)
- 예시 API서버에서의(로그인 기능) POST 메소드 필수 파라미터
- Body : email, password
- 소스 코드에서는 User클래스의 user객체를 이용하여 email과 password의 값을 대체하였다.
- Body : email, password
btnLogin.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String email = editEmail.getText().toString().trim();
Pattern pattern = Patterns.EMAIL_ADDRESS;
if(pattern.matcher(email).matches()==false){
Toast.makeText(LoginActivity.this,"이메일 형식이 올바르지않습니다.",Toast.LENGTH_SHORT).show();
return;
}
// 비밀번호 체크
String password = editPassword.getText().toString().trim();
if(password.length()<4 || password.length()>12){
Toast.makeText(LoginActivity.this, "비밀번호 길이를 확인하세요.", Toast.LENGTH_SHORT).show();
return;
}
showProgress("로그인 중입니다...");
Retrofit retrofit = NetworkClient.getRetrofitClient(LoginActivity.this);
UserApi api = retrofit.create(UserApi.class);
User user = new User(email,password);
Call<UserRes> call = api.login(user);
call.enqueue(new Callback<UserRes>() {
@Override
public void onResponse(Call<UserRes> call, Response<UserRes> response) {
dismissProgress();
if(response.isSuccessful()){
UserRes res = response.body();
// 억세스 토큰을 api할 때마다 헤더에서 사용하므로
// 회원가입이나 로그인이 끝나면 파일로 꼭 저장해놔한다.
SharedPreferences sp = getApplication().getSharedPreferences(Config.PREFERENCE_NAME,MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
editor.putString(Config.ACCESS_TOKEN,res.getAccess_token());
editor.apply();
Intent intent = new Intent(LoginActivity.this,MainActivity.class);
startActivity(intent);
finish();
}else if(response.code() == 400){
Toast.makeText(LoginActivity.this, "회원가입이 되어있지 않거나 비밀번호가 틀렸습니다.", Toast.LENGTH_SHORT).show();
return;
}else{
Toast.makeText(LoginActivity.this, "정상적으로 처리되지 않았습니다.", Toast.LENGTH_SHORT).show();
return;
}
}
3. Retrofit2 라이브러리를 이용한 GET으로 API 호출하여 처리하는 방법
- 파라미터에 쿼리(@Query)를 사용, GET/DELETE는 쿼리스트링 사용
- 하위 경로 뒤에 '?키=밸류' 로 구성, 예시) /posting?page=1
- 보통은 게시판의 목록을 보여주는 기능으로 사용
- 예시 API서버에서의(내 포스팅 보기 기능) GET 메소드 필수 파라미터
- Header : 인증키(Authorization)
- Query : 페이지 번호
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 억세스 토큰이 저장되어있으면 로그인한 유저이므로 메인액티비티를 실행하고
// 그렇지 않으면 회원가입 액티비티를 실행하고 메인 액티비티는 종료!
SharedPreferences sp = getSharedPreferences(Config.PREFERENCE_NAME, MODE_PRIVATE);
accessToken = sp.getString(Config.ACCESS_TOKEN, "");
if (accessToken.isEmpty()) {
Intent intent = new Intent(MainActivity.this, RegisterActivity.class);
startActivity(intent);
finish();
return;
}
// 회원가입 / 로그인 유저면 아래 코드를 실행하도록 둔다.
btnAdd = findViewById(R.id.btnAdd);
progressBar = findViewById(R.id.progressBar);
recyclerView = findViewById(R.id.recyclerView);
recyclerView.setHasFixedSize(true);
recyclerView.setLayoutManager(new LinearLayoutManager(MainActivity.this));
// 네트워크로부터 메모를 가져온다.
getNetworkData();
}
private void getNetworkData() {
// 1. progressBar를 보여준다.
progressBar.setVisibility(View.VISIBLE);
// 2. Retrofit을 만든다.
Retrofit retrofit = NetworkClient.getRetrofitClient(MainActivity.this);
// 3. API를 만든다 => api 패키지에 MemoApi 생성 후 코드 작업
MemoApi api = retrofit.create(MemoApi.class);
Call<MemoList> call = api.getMemoList("Bearer "+accessToken, 0, 20);
call.enqueue(new Callback<MemoList>() {
@Override
public void onResponse(Call<MemoList> call, Response<MemoList> response) {
progressBar.setVisibility(View.GONE);
if(response.isSuccessful()){
// 정상적으로 데이터 받았으니, 리사이클러뷰에 표시시
MemoList memoList = response.body();
memoArrayList.addAll(memoList.getItems());
adapter = new MemoAdapter(MainActivity.this,memoArrayList);
recyclerView.setAdapter(adapter);
}else{
Toast.makeText(MainActivity.this, "서버에 문제가 있습니다.", Toast.LENGTH_SHORT).show();
return;
}
}
@Override
public void onFailure(Call<MemoList> call, Throwable t) {
progressBar.setVisibility(View.GONE);
}
});
}
3. Retrofit2 라이브러리를 이용한 RecyclerView화면 처리하는 방법
if(response.isSuccessful()){
// 정상적으로 데이터 받았으니, 리사이클러뷰에 표시시
MemoList memoList = response.body();
memoArrayList.addAll(memoList.getItems());
adapter = new MemoAdapter(MainActivity.this,memoArrayList);
recyclerView.setAdapter(adapter);
'Android Studio' 카테고리의 다른 글
Android - Retrofit Multipart 사용 방법, 파일 업로드하기 (0) | 2023.02.14 |
---|---|
Android - 카메라와 사진첩을 이용하여 이미지 뷰에 사진 출력하기 (0) | 2023.02.13 |
Android - ProgressDialog (0) | 2023.02.09 |
Android - recyclerView 페이징 처리 (recyclerView.addOnScrollListener) (0) | 2023.02.08 |
Android - Intent 활용 - 주소록, 웹페이지, 메시지, 이메일 (0) | 2023.02.07 |