์ถ์ฒ
ChatGPT
๋ฐฉ๋ฒ
- Interceptor๋ฅผ ์ฌ์ฉํ์ฌ ๊ณตํต ํด๋ ์ถ๊ฐ
- '@Header' ์ด๋ ธํ ์ด์ ์ฌ์ฉ
- '@Headers' ์ด๋ ธํ ์ด์ ์ฌ์ฉ
- OkHttp3 Authenticator ์ฌ์ฉ (ํ ํฐ ์๋ ๊ฐฑ์ )
1. Interceptor๋ฅผ ์ฌ์ฉํ์ฌ ๊ณตํต ํค๋ ์ถ๊ฐ
Interceptor๋ ๋ชจ๋ ๋คํธ์ํฌ ์์ฒญ์ ๊ณตํต์ ์ธ ์์ ์ ์ํํ ์ ์๊ฒ ํด์ค๋ค. ์ด๋ฅผ ํตํด ๊ณตํต ํค๋ ๊ฐ์ ์ฝ๊ฒ ์ถ๊ฐํ ์ ์๋ค.
Interceptor๋ก ๊ณตํต ํค๋ ์ถ๊ฐํ๊ธฐ
์ฅ์
- ์ฝ๋์ ๋ฐ๋ณต์ ์ค์ฌ์ฃผ๊ณ , ๋ชจ๋ ์์ฒญ์ ์๋์ผ๋ก ํค๋๋ฅผ ์ถ๊ฐํ๋ค.
- ๋ณด์ ํ ํฐ๊ณผ ๊ฐ์ ๊ณตํต ์ ๋ณด๋ฅผ ์ถ๊ฐํ๋ ๋ฐ ์ ์ฉํ๋ค.
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
import java.io.IOException;
public class ApiClient {
private static final String BASE_URL = "https://api.example.com/";
private static Retrofit retrofit = null;
public static Retrofit getClient() {
if (retrofit == null) {
// Interceptor ์ค์
OkHttpClient client = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Request request = original.newBuilder()
.header("Authorization", "Bearer YOUR_TOKEN_HERE") // ๊ณตํต ํค๋ ์ถ๊ฐ
.header("Content-Type", "application/json")
.method(original.method(), original.body())
.build();
return chain.proceed(request);
}
})
.build();
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
}
์ค๋ช
- OkHttpClient: OkHttp ํด๋ผ์ด์ธํธ์ Interceptor๋ฅผ ์ถ๊ฐํ์ฌ ๋ชจ๋ ์์ฒญ์ ๊ณตํต ํค๋๋ฅผ ์๋์ผ๋ก ์ถ๊ฐํ๋ค.
- header(): ์์ฒญ์ ํค๋๋ฅผ ์ถ๊ฐํ๋ ๋ฉ์๋์ ๋๋ค. ์ฌ๋ฌ ๊ฐ์ ํค๋๋ฅผ ์ถ๊ฐํ ์ ์๋ค.
- chain.proceed(request): ์์ฒญ์ ๊ณ์ ์งํํ๋ค.
2. '@Header' ์ด๋ ธํ ์ด์ ์ฌ์ฉ
'@Header' ์ด๋ ธํ ์ด์ ์ ํน์ ์์ฒญ์๋ง ํค๋๋ฅผ ๋์ ์ผ๋ก ์ถ๊ฐํ ์ ์๊ฒ ํด์ค๋ค. ์ด ๋ฐฉ๋ฒ์ ๋งค๋ฒ ๋ค๋ฅธ ํค๋ ๊ฐ์ ๋ฃ๊ณ ์ถ์ ๋ ์ ์ฉํ๋ค.
@Header ์ด๋ ธํ ์ด์ ์ฌ์ฉ ์์
์ฅ์
- ์์ฒญ๋ง๋ค ๋ค๋ฅธ ํค๋ ๊ฐ์ ์ ๊ณตํ ์ ์๋ค.
import retrofit2.Call;
import retrofit2.http.GET;
import retrofit2.http.Header;
import retrofit2.http.Headers;
import retrofit2.http.Path;
public interface ApiService {
// ๋์ ์ผ๋ก Authorization ํค๋ ์ถ๊ฐ
@GET("users/{id}")
Call<User> getUserById(@Path("id") int userId, @Header("Authorization") String token);
// ๋์ ์ผ๋ก Content-Type ํค๋ ์ถ๊ฐ
@GET("users/{id}")
Call<User> getUserByIdWithContentType(@Path("id") int userId, @Header("Content-Type") String contentType);
}
์ค๋ช
- @Header("Authorization"): ๋ฉ์๋์ ๋งค๊ฐ๋ณ์๋ก Authorization ํค๋ ๊ฐ์ ์ ๋ฌํ๋ค.
- @Header("Content-Type"): Content-Type ํค๋๋ฅผ ๋ฉ์๋ ํธ์ถ ์์ ์ ๋ฌํ๋ค.
์ฌ์ฉ ์์
ApiService apiService = retrofit.create(ApiService.class);
Call<User> call = apiService.getUserById(1, "Bearer YOUR_TOKEN_HERE");
call.enqueue(new Callback<User>() {
@Override
public void onResponse(Call<User> call, Response<User> response) {
if (response.isSuccessful()) {
User user = response.body();
// ์ฌ์ฉ์ ์ ๋ณด ์ฒ๋ฆฌ
}
}
@Override
public void onFailure(Call<User> call, Throwable t) {
// ์ค๋ฅ ์ฒ๋ฆฌ
}
});
3. '@Headers' ์ด๋ ธํ ์ด์ ์ฌ์ฉ
'@Headers' ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ํน์ API ์์ฒญ์ ๋ํด ์ ์ ์ธ ํค๋๋ฅผ ์ถ๊ฐํ ์ ์๋ค. ์ด๋ ํน์ ์๋ํฌ์ธํธ์ ๋ํด ํญ์ ์ผ์ ํ ํค๋๊ฐ ํ์ํ ๋ ์ ์ฉํ๋ค.
@Headers ์ด๋ ธํ ์ด์ ์ฌ์ฉ ์์
์ฅ์
- ํน์ ์์ฒญ์ ๋ํด ๊ณ ์ ๋ ํค๋ ๊ฐ์ ๋ช ์ํ ์ ์๋ค.\
public interface ApiService {
// ๊ณ ์ ๋ ํค๋ ์ถ๊ฐ
@Headers({
"Authorization: Bearer YOUR_TOKEN_HERE",
"Content-Type: application/json"
})
@GET("users/{id}")
Call<User> getUserById(@Path("id") int userId);
}
์ค๋ช
- @Headers: ํค๋ ์ ๋ณด๋ฅผ ๊ณ ์ ์ ์ผ๋ก ์ถ๊ฐํ์ฌ ํน์ ์์ฒญ์ ์ฌ์ฉํ๋ค. ์ด ๋ฐฉ๋ฒ์ ๋งค๋ฒ ๊ฐ์ ํค๋๋ฅผ ํ์๋ก ํ๋ ๊ฒฝ์ฐ์ ์ ์ฉํ๋ค.
4. OkHttp3 Authenticator ์ฌ์ฉ (ํ ํฐ ์๋ ๊ฐฑ์ )
์ฌ์ฉ์๊ฐ ์ธ์ฆ์ด ํ์ํ API๋ฅผ ํธ์ถํ ๋ ํ ํฐ์ ์๋์ผ๋ก ๊ฐฑ์ ํด์ผ ํ๋ ๊ฒฝ์ฐ, "Authenticator"๋ฅผ ์ฌ์ฉํ ์ ์๋ค. ์ด๋ฅผ ํตํด ์ธ์ฆ ์คํจ ์ ์๋์ผ๋ก ์๋ก์ด ํ ํฐ์ ๋ฐ๊ธ๋ฐ๊ณ ์์ฒญ์ ์ฌ์๋ํ ์ ์๋ค.
Authenticator ์ฌ์ฉ ์์
์ฅ์
- ์๋์ผ๋ก ํ ํฐ์ ์์ ํ๊ณ , ์์ฒญ์ ์ฌ์๋ํ ์ ์๋ค.
import okhttp3.Authenticator;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import okhttp3.Route;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;
public class ApiClient {
private static final String BASE_URL = "https://api.example.com/";
private static Retrofit retrofit = null;
public static Retrofit getClient() {
if (retrofit == null) {
OkHttpClient client = new OkHttpClient.Builder()
.authenticator(new Authenticator() {
@Override
public Request authenticate(Route route, Response response) {
// ์๋ก์ด ํ ํฐ ๋ฐ๊ธ ๋ก์ง (์์)
String newAccessToken = getNewAccessToken();
// ์๋ก์ด ์์ฒญ์ ๊ธฐ์กด ์์ฒญ๊ณผ ํจ๊ป ์ ํ ํฐ์ผ๋ก ์์ฑ
return response.request().newBuilder()
.header("Authorization", "Bearer " + newAccessToken)
.build();
}
})
.build();
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
}
return retrofit;
}
private static String getNewAccessToken() {
// ์๋ก์ด ์ก์ธ์ค ํ ํฐ ๋ฐ๊ธ ๋ก์ง ๊ตฌํ
return "NEW_ACCESS_TOKEN";
}
}
์ค๋ช
- Authenticator: ์ธ์ฆ ์คํจ ์ ํธ์ถ๋๋ ์ธํฐํ์ด์ค๋ก, ์๋ก์ด ์ธ์ฆ ์ ๋ณด๋ฅผ ์ ๊ณตํ๊ณ ์์ฒญ์ ์ฌ์๋ํ๋ค.
- authenticate(): ์๋ก์ด ์์ฒญ์ ๊ตฌ์ฑํ์ฌ ๋ฐํํ๋ฉฐ, ์์ฒญ์ด ์๋์ผ๋ก ๋ค์ ์๋๋๋ค.
๊ฒฐ๋ก
Retrofit2์์ ๊ณตํต ํค๋ ๊ฐ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ผ๋ฉฐ, ๊ฐ๊ฐ์ ๋ฐฉ๋ฒ์ ํน์ ์ํฉ์ ๋ง๊ฒ ์ฌ์ฉํ ์ ์๋ค.
- Interceptor๋ ๋ชจ๋ ์์ฒญ์ ๋ํด ๊ณตํต์ ์ธ ํค๋๋ฅผ ์ถ๊ฐํ ๋ ๊ฐ์ฅ ๊ฐ๋จํ๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ด๋ค.
- @Header ์ด๋ ธํ ์ด์ ์ ๋์ ์ผ๋ก ํค๋๋ฅผ ์ค์ ํ ๋ ์ ์ฉํ๋ค.
- @Headers ์ด๋ ธํ ์ด์ ์ ๊ณ ์ ๋ ํค๋ ๊ฐ์ ํน์ ์์ฒญ์ ์ถ๊ฐํ ๋ ์ฌ์ฉ๋๋ค.
- Authenticator๋ ์๋์ผ๋ก ํ ํฐ์ ๊ฐฑ์ ํ์ฌ ์ธ์ฆ ์์ฒญ์ ์ฌ์๋ํ ๋ ์ ํฉํ๋ค.
ํ๋ก์ ํธ์ ์๊ตฌ์ฌํญ์ ๋ง๊ฒ ์ ์ ํ ๋ฐฉ๋ฒ์ ์ ํํด Retrofit2์์ ํค๋๋ฅผ ํจ๊ณผ์ ์ผ๋ก ๊ด๋ฆฌํ ์ ์๋ค.
'๋น ๊ตฌ๋ฉ ์ฑ์ฐ๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ฉ์ด][Android] BTS (1) | 2024.07.29 |
---|---|
[Android] Retrofit2 ๊ธฐ๋ณธ ์ค๋ช (0) | 2024.07.29 |
[Retrofit2] Retrofit2์์ ํ์์์ ๋ฐ ๋ฆฌํธ๋ผ์ด ์ค์ (0) | 2024.07.29 |
[RESTful API]RESTful API๋ (0) | 2024.07.29 |
[Android][ART] ART์ ํ๋กํ์ผ ๊ธฐ๋ฐ ์ปดํ์ผ (0) | 2024.07.26 |