Ash*_*lak 112 java android header httprequest retrofit
可以使用OkHttp拦截器指定需要添加到每个请求的标头.
可以使用以前的版本轻松完成,这是相关的QA.
但是使用改造2,我找不到可以应用于对象的类似物setRequestInterceptor或setInterceptor方法Retrofit.Builder.
此外,它似乎没有RequestInterceptor在OkHttp了.Retrofit的doc将我们引用到Interceptor,我不太明白如何将它用于此目的.
我怎样才能做到这一点?
dtx*_*x12 177
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();
Run Code Online (Sandbox Code Playgroud)
OWA*_*DVL 73
lambda版本:
builder.addInterceptor(chain -> {
Request request = chain.request().newBuilder().addHeader("key", "value").build();
return chain.proceed(request);
});
Run Code Online (Sandbox Code Playgroud)
丑陋的长版:
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);
}
});
Run Code Online (Sandbox Code Playgroud)
完整版本:
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);
}
}
Run Code Online (Sandbox Code Playgroud)
gradle文件(如果你打算使用它,你需要添加日志拦截器):
//----- 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'
Run Code Online (Sandbox Code Playgroud)
swe*_*man 11
对于记录您的请求和响应,您需要一个拦截器,并且还需要设置拦截器,您需要一个拦截器,这是使用改造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;
}
Run Code Online (Sandbox Code Playgroud)
现在,在您的改造对象中,在客户端中添加此标头
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(url)
.client(getHeader(authorizationValue))
.addConverterFactory(GsonConverterFactory.create())
.build();
Run Code Online (Sandbox Code Playgroud)
我找到了Retrofit 1.9和2.0的另一种方式,用于Json内容类型.
@Headers({"Accept: application/json"})
@POST("user/classes")
Call<playlist> addToPlaylist(@Body PlaylistParm parm);
Run Code Online (Sandbox Code Playgroud)
你可以添加更多的标题,即
@Headers({
"Accept: application/json",
"User-Agent: Your-App-Name",
"Cache-Control: max-age=640000"
})
Run Code Online (Sandbox Code Playgroud)
在我的情况下addInterceptor()无法为我的请求添加HTTP标头,我不得不使用addNetworkInterceptor().代码如下:
OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
httpClient.addNetworkInterceptor(new AddHeaderInterceptor());
Run Code Online (Sandbox Code Playgroud)
和拦截器代码:
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());
}
}
Run Code Online (Sandbox Code Playgroud)
关于这个要点的这个和更多的例子
如果您使用 addInterceptor 方法添加 HttpLoggingInterceptor,它将不会记录由晚于 HttpLoggingInterceptor 应用的其他拦截器添加的内容。
例如:如果您有两个拦截器“HttpLoggingInterceptor”和“AuthInterceptor”,并且首先应用了HttpLoggingInterceptor,那么您将无法查看AuthInterceptor 设置的http-params 或headers。
OkHttpClient.Builder builder = new OkHttpClient.Builder()
.addNetworkInterceptor(logging)
.addInterceptor(new AuthInterceptor());
Run Code Online (Sandbox Code Playgroud)
我通过使用 addNetworkInterceptor 方法解决了它。
| 归档时间: |
|
| 查看次数: |
83854 次 |
| 最近记录: |