我们的团队决定采用改型2.0,我正在做一些初步的研究。我是这个图书馆的新手。
我想知道如何使用拦截器
在我们的Android应用程序中通过改装2.0添加自定义标题。有很多教程介绍如何使用拦截器
在翻新版1.X中添加标头,但由于API在最新版本中发生了很大变化,我不知道如何在新版本中适应这些方法。此外,改装尚未更新其新文档。
例如,在以下代码中,我应该如何实现拦截器
类来添加额外的头?此外,未记录的链
对象究竟是什么?何时调用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 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);
}
}
公认答案的另一种选择
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 HeaderInterceptor implements Interceptor {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.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;
}
}
科特林
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()
)
}
}
问题内容: 我们的团队决定采用 Retrofit 2.0, 而我正在对此进行一些初步研究。我是这个图书馆的新手。 我想知道如何在Android应用中通过 Retrofits 2.0 添加自定义标题。在Retrofit 1.X中有许多关于使用添加标题的教程,但是由于API在最新版本中已经发生了很大变化,因此我不确定如何在新版本中适应这些方法。另外,Retrofit尚未更新其新文档。 例如,在以下代码
我以为这些最新版本应该是兼容的。有一条推文;https://twitter.com/JakeWharton/status/553066921675857922和Retrofit 1.9的更新日志也提到了它。 然而,当我尝试这个: 还是不行。setClient方法抱怨不兼容的客户端对象; 我错过了什么?我还看到OkHttpClient没有实现客户端接口。 我现在使用这种方法;https://medi
问题内容: 我将这个拦截器添加到我的OkHttp客户端中: 如何在拦截器中添加标题以进行请求? 我尝试了这个,但是我犯错了,创建新请求时我丢失了请求: 请注意,我知道我可以在创建请求时添加标头,如下所示: 但这不符合我的需求。我在拦截器中需要它。 问题答案: 最后,我以这种方式添加了标题:
我试图使用一个拦截器将一个Api键附加到我的请求体中。我已经试过各种方法,没有一种有效.. 网址:https://someapi.com/api/stories/ 方法:发布 标题:接受:应用程序/json 输入: {“键”: “”} @提供@Singleton公共拦截器拦截器(NetworkUtils和networkutil){返回链-
我创建了一个单独的服务生成器类,如下所示:https://futurestud.io/tutorials/retorfit-2-manage-request-headers-in-okhttp-interceptor apiserviceGenerator.java
在RestTemplate中,我有一个自定义拦截器,它将记录一些请求-响应详细信息并保存到数据库。 我的自定义拦截器: springboot中的RestTemboard bean配置: 将拦截器添加到restTemboard bean: 如何将此拦截器添加到佯装客户端? 正在应用中。yml: InterceptorOne为假装客户端中的每个请求添加标头: 但是我不能添加日志服务拦截器,因为它由于错