Retrofit 2를 사용하여 모든 요청에 머리글 추가
Retrofit 2의 설명서는 다음과 같습니다.
모든 요청에 추가해야 하는 헤더는 OkHttp 대행 수신기를 사용하여 지정할 수 있습니다.
이전 버전을 사용하여 쉽게 수행할 수 있습니다. 다음은 관련 QA입니다.
근데 레트로핏2를 사용해보니 이런 게 없어서setRequestInterceptor
또는setInterceptor
적용할 수 있는 방법Retrofit.Builder
물건.
또 다른 방법은 없는 것 같습니다.RequestInterceptor
더 이상 OkHttp에 있지 않습니다.Retrofit의 문서에서는 Interceptor에 대해 언급하고 있습니다. 이 용도로 사용하는 방법을 잘 이해하지 못했습니다.
이거 어떻게 해?
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request().newBuilder().addHeader("parameter", "value").build();
return chain.proceed(request);
}
});
Retrofit retrofit = new Retrofit.Builder().addConverterFactory(GsonConverterFactory.create()).baseUrl(url).client(httpClient.build()).build();
최신 버전 -> 2.1.0.
람다 버전:
builder.addInterceptor(chain -> {
Request request = chain.request().newBuilder().addHeader("key", "value").build();
return chain.proceed(request);
});
못생긴 긴 버전:
builder.addInterceptor(new Interceptor() {
@Override public Response intercept(Chain chain) throws IOException {
Request request = chain.request().newBuilder().addHeader("key", "value").build();
return chain.proceed(request);
}
});
풀 버전:
class Factory {
public static APIService create(Context context) {
OkHttpClient.Builder builder = new OkHttpClient().newBuilder();
builder.readTimeout(10, TimeUnit.SECONDS);
builder.connectTimeout(5, TimeUnit.SECONDS);
if (BuildConfig.DEBUG) {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BASIC);
builder.addInterceptor(interceptor);
}
builder.addInterceptor(chain -> {
Request request = chain.request().newBuilder().addHeader("key", "value").build();
return chain.proceed(request);
});
builder.addInterceptor(new UnauthorisedInterceptor(context));
OkHttpClient client = builder.build();
Retrofit retrofit =
new Retrofit.Builder().baseUrl(APIService.ENDPOINT).client(client).addConverterFactory(GsonConverterFactory.create()).addCallAdapterFactory(RxJavaCallAdapterFactory.create()).build();
return retrofit.create(APIService.class);
}
}
gradle file(로그 대행 수신기를 사용할 계획인 경우 추가 필요):
//----- Retrofit
compile 'com.squareup.retrofit2:retrofit:2.1.0'
compile "com.squareup.retrofit2:converter-gson:2.1.0"
compile "com.squareup.retrofit2:adapter-rxjava:2.1.0"
compile 'com.squareup.okhttp3:logging-interceptor:3.4.0'
Retrofit 1.9 및 2.0의 경우 이 유형의 헤더를 사용해 보십시오.Json Content Type의 경우.
@Headers({"Accept: application/json"})
@POST("user/classes")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);
더 많은 헤더를 추가할 수 있습니다.
@Headers({
"Accept: application/json",
"User-Agent: Your-App-Name",
"Cache-Control: max-age=640000"
})
헤더에 동적으로 추가:
@POST("user/classes")
Call<ResponseModel> addToPlaylist(@Header("Content-Type") String content_type, @Body RequestModel req);
Call Method(메서
mAPI.addToPlayList("application/json", playListParam);
또는
매번 전달하고 나서 Http Interceptor를 사용하여 HttpClient 개체를 만듭니다.
OkHttpClient httpClient = new OkHttpClient();
httpClient.networkInterceptors().add(new Interceptor() {
@Override
public com.squareup.okhttp.Response intercept(Chain chain) throws IOException {
Request.Builder requestBuilder = chain.request().newBuilder();
requestBuilder.header("Content-Type", "application/json");
return chain.proceed(requestBuilder.build());
}
});
그런 다음 개조 객체에 추가
Retrofit retrofit = new Retrofit.Builder().baseUrl(BASE_URL).client(httpClient).build();
업데이트(Kotlin 사용 시){ }
그렇지 않으면 효과가 없을 것이다
요청 및 응답 기록에는 인터셉터가 필요하고 헤더 설정에는 인터셉터가 필요합니다.여기에서는 retrofit 2.1을 사용하여 인터셉터를 한 번에 추가할 수 있는 솔루션이 있습니다.
public OkHttpClient getHeader(final String authorizationValue ) {
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor();
interceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient okClient = new OkHttpClient.Builder()
.addInterceptor(interceptor)
.addNetworkInterceptor(
new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
Request request = null;
if (authorizationValue != null) {
Log.d("--Authorization-- ", authorizationValue);
Request original = chain.request();
// Request customization: add request headers
Request.Builder requestBuilder = original.newBuilder()
.addHeader("Authorization", authorizationValue);
request = requestBuilder.build();
}
return chain.proceed(request);
}
})
.build();
return okClient;
}
이 헤더를 클라이언트에 추가합니다.
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.client(getHeader(authorizationValue))
.addConverterFactory(GsonConverterFactory.create())
.build();
저 같은 경우에는addInterceptor()
HTTP 헤더를 요청에 추가할 수 없었습니다.addNetworkInterceptor()
코드는 다음과 같습니다.
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addNetworkInterceptor(new AddHeaderInterceptor());
그리고 인터셉터 코드:
public class AddHeaderInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request.Builder builder = chain.request().newBuilder();
builder.addHeader("Authorization", "MyauthHeaderContent");
return chain.proceed(builder.build());
}
}
이 요지의 예와 더 많은 예.
addInterceptor 메서드를 사용하여 HttpLogging을 추가하는 경우인터셉터, HttpLogging보다 나중에 적용된 다른 인터셉터에 의해 추가된 것은 로깅되지 않습니다.가로채기.
예를 들어 다음과 같습니다.2개의 인터셉터가 있는 경우 "HttpLogging"Interceptor" 및 AuthInterceptor 및 HttpLogging먼저 Interceptor가 적용된 후 AuthInterceptor에 의해 설정된 http-params 또는 헤더를 볼 수 없습니다.
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.addNetworkInterceptor(logging)
.addInterceptor(new AuthInterceptor());
add Network를 사용하여 해결했습니다.인터셉터 방식
코틀린에서 가로채기 추가는 다음과 같습니다.
.addInterceptor{ it.proceed(it.request().newBuilder().addHeader("Cache-Control", "no-store").build())}
이 Retrofit 클라이언트 사용
class RetrofitClient2(context: Context) : OkHttpClient() {
private var mContext:Context = context
private var retrofit: Retrofit? = null
val client: Retrofit?
get() {
val logging = HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)
val client = OkHttpClient.Builder()
.connectTimeout(Constants.TIME_OUT, TimeUnit.SECONDS)
.readTimeout(Constants.TIME_OUT, TimeUnit.SECONDS)
.writeTimeout(Constants.TIME_OUT, TimeUnit.SECONDS)
client.addInterceptor(logging)
client.interceptors().add(AddCookiesInterceptor(mContext))
val gson = GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").create()
if (retrofit == null) {
retrofit = Retrofit.Builder()
.baseUrl(Constants.URL)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client.build())
.build()
}
return retrofit
}
}
모든 요청에 따라 JWT를 전달하고 있습니다.변수 이름은 신경 쓰지 마세요. 좀 헷갈리거든요.
class AddCookiesInterceptor(context: Context) : Interceptor {
val mContext: Context = context
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val builder = chain.request().newBuilder()
val preferences = CookieStore().getCookies(mContext)
if (preferences != null) {
for (cookie in preferences!!) {
builder.addHeader("Authorization", cookie)
}
}
return chain.proceed(builder.build())
}
}
개조코틀린으로 작성된 도우미 라이브러리는 몇 줄의 코드를 사용하여 API 호출을 할 수 있도록 합니다.
다음과 같이 응용 프로그램클래스에 헤더를 추가합니다.
class Application : Application() {
override fun onCreate() {
super.onCreate()
retrofitClient = RetrofitClient.instance
//api url
.setBaseUrl("https://reqres.in/")
//you can set multiple urls
// .setUrl("example","http://ngrok.io/api/")
//set timeouts
.setConnectionTimeout(4)
.setReadingTimeout(15)
//enable cache
.enableCaching(this)
//add Headers
.addHeader("Content-Type", "application/json")
.addHeader("client", "android")
.addHeader("language", Locale.getDefault().language)
.addHeader("os", android.os.Build.VERSION.RELEASE)
}
companion object {
lateinit var retrofitClient: RetrofitClient
}
}
그런 다음 전화를 겁니다.
retrofitClient.Get<GetResponseModel>()
//set path
.setPath("api/users/2")
//set url params Key-Value or HashMap
.setUrlParams("KEY","Value")
// you can add header here
.addHeaders("key","value")
.setResponseHandler(GetResponseModel::class.java,
object : ResponseHandler<GetResponseModel>() {
override fun onSuccess(response: Response<GetResponseModel>) {
super.onSuccess(response)
//handle response
}
}).run(this)
상세한 것에 대하여는, 메뉴얼을 참조해 주세요.
코틀린 버전은
fun getHeaderInterceptor():Interceptor{
return object : Interceptor {
@Throws(IOException::class)
override fun intercept(chain: Interceptor.Chain): Response {
val request =
chain.request().newBuilder()
.header(Headers.KEY_AUTHORIZATION, "Bearer.....")
.build()
return chain.proceed(request)
}
}
}
private fun createOkHttpClient(): OkHttpClient {
return OkHttpClient.Builder()
.apply {
if(BuildConfig.DEBUG){
this.addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BASIC))
}
}
.addInterceptor(getHeaderInterceptor())
.build()
}
언급URL : https://stackoverflow.com/questions/32605711/adding-header-to-all-request-with-retrofit-2
'programing' 카테고리의 다른 글
C 구조 상속 포인터 정렬 (0) | 2022.08.15 |
---|---|
Vuex getter에서 rootState에 액세스하는 중 (0) | 2022.08.15 |
$router로 데이터를 전달하려면 어떻게 해야 합니까?Vue.js를 밀어넣을까요? (0) | 2022.08.15 |
C에 문자열 타입이 있나요? (0) | 2022.08.15 |
Apache Camel이 정확히 무엇입니까? (0) | 2022.08.15 |