반응형
인터셉터를 사용하여 Retrofit 2.0에서 헤더를 추가하는 방법은 무엇입니까?
우리 팀은 Retrofit 2.0 을 채택하여 결정에 대한 초기 연구를 진행 중입니다. 저는이 도서관의 하나입니다.
Android 앱에서 Retrofits 2.0 을 interceptor
통해 사용자 지정 헤더를 추가 하는 방법을 궁금합니다 . 개조 1.X 헤더를 추가에서 하는 데 사용 하는 방법에 , 대한 많은 자습서 가 있지만 최신 버전에서 API가 많이 변경 되었기 때문에 새 버전에서 이러한 메서드를 적용하는 방법을 잘 모르겠습니다 . 또한 Retrofit은 아직 새 문서를 업데이트하지 않습니다.interceptor
예를 들어, 다음 코드에서 Interceptor
추가 헤더를 추가 할 단계 를 구현 해야합니까? 구별, 문서화되지 않은 Chain
개체 는 정확히 무엇입니까? 은 언제 intercept()
호출?
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
// How to add extra headers?
return response;
}
});
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(BASE_API_URL)
.client(client)
.addConverterFactory(GsonConverterFactory.create())
.build();
이것 좀 봐.
public class HeaderInterceptor
implements Interceptor {
@Override
public Response intercept(Chain chain)
throws IOException {
Request request = chain.request();
request = request.newBuilder()
.addHeader("appid", "hello")
.addHeader("deviceplatform", "android")
.removeHeader("User-Agent")
.addHeader("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0")
.build();
Response response = chain.proceed(request);
return response;
}
}
Kotlin
class HeaderInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response = chain.run {
proceed(
request()
.newBuilder()
.addHeader("appid", "hello")
.addHeader("deviceplatform", "android")
.removeHeader("User-Agent")
.addHeader("User-Agent", "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:38.0) Gecko/20100101 Firefox/38.0")
.build()
)
}
}
받아 들여진 답변의 또 다른 대안
public class HeaderInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request();
request = request.newBuilder()
.addHeader("headerKey0", "HeaderVal0")
.addHeader("headerKey0", "HeaderVal0--NotReplaced/NorUpdated") //new header added
.build();
//alternative
Headers moreHeaders = request.headers().newBuilder()
.add("headerKey1", "HeaderVal1")
.add("headerKey2", "HeaderVal2")
.set("headerKey2", "HeaderVal2--UpdatedHere") // existing header UPDATED if available, else added.
.add("headerKey3", "HeaderKey3")
.add("headerLine4 : headerLine4Val") //line with `:`, spaces doesn't matter.
.removeAll("headerKey3") //Oops, remove this.
.build();
request = request.newBuilder().headers(moreHeaders).build();
/* ##### List of headers ##### */
// headerKey0: HeaderVal0
// headerKey0: HeaderVal0--NotReplaced/NorUpdated
// headerKey1: HeaderVal1
// headerKey2: HeaderVal2--UpdatedHere
// headerLine4: headerLine4Val
Response response = chain.proceed(request);
return response;
}
}
public class ServiceFactory {
public static ApiClient createService(String authToken, String userName, String password) {
OkHttpClient defaultHttpClient = new OkHttpClient.Builder()
.addInterceptor(
chain -> {
Request request = chain.request().newBuilder()
.headers(getJsonHeader(authToken))
.build();
return chain.proceed(request);
})
.authenticator(getBasicAuthenticator(userName, password))
.build();
return getService(defaultHttpClient);
}
private static Headers getJsonHeader(String authToken) {
Headers.Builder builder = new Headers.Builder();
builder.add("Content-Type", "application/json");
builder.add("Accept", "application/json");
if (authToken != null && !authToken.isEmpty()) {
builder.add("X-MY-Auth", authToken);
}
return builder.build();
}
private static Authenticator getBasicAuthenticator(final String userName, final String password) {
return (route, response) -> {
String credential = Credentials.basic(userName, password);
return response.request().newBuilder().header("Authorization", credential).build();
};
}
private static ApiClient getService(OkHttpClient defaultHttpClient) {
return new Retrofit.Builder()
.baseUrl(BASE_URL)
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.client(defaultHttpClient)
.build()
.create(ApiClient.class);
}
}
다음과 같은 내장 메소드와 함께 인터셉터를 사용하여 헤더를 사용할 수 있습니다.
interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Request.Builder builder = original.newBuilder();
builder.header("Authorization","Bearer "+ LeafPreference.getInstance(context).getString(LeafPreference.TOKEN));
Request request = builder.method(original.method(), original.body())
.build();
Log.e("request",request.urlString());
Log.e("header",request.header("Authorization"));
return chain.proceed(request);
}
});
}
참고 URL : https://stackoverflow.com/questions/32963394/how-to-use-interceptor-to-add-headers-in-retrofit-2-0
반응형
'IT' 카테고리의 다른 글
Git이 파일을 바이너리로 취급하게 지불해야합니까? (0) | 2020.09.12 |
---|---|
RESTful 로그인 실패 : 401 또는 사용자 지정 응답 반환 (0) | 2020.09.12 |
Git이 잘못된 지적로 푸시 (0) | 2020.09.12 |
WiX에서 MSI 설치 프로그램을 만드는 방법을 배우기위한 좋은 리소스 (0) | 2020.09.12 |
펼쳐지는 이벤트를 시작합니다. (0) | 2020.09.12 |