Can*_*ins 7 interceptor http-headers retrofit2
private void setUpRestClient() {
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Request request = original.newBuilder()
.header("Accept", "application/pyur.v1")
.header("Authorization", new SharedPreferencesUtil(getBaseContext()).getToken())
.header("Content-Type", "application/json")
.method(original.method(),original.body())
.build();
return chain.proceed(request);
}
});
RestClient.getInstance().configureRestAdapter(this, getResources().getString(R.string.base_url),client);
}
public void configureRestAdapter(final Context context, String baseUrl, OkHttpClient client) {
Gson gson = new GsonBuilder()
.setFieldNamingPolicy(FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES)
.setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'")
.excludeFieldsWithModifiers(Modifier.FINAL, Modifier.TRANSIENT, Modifier.STATIC)
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create(gson))
.client(client)
.build();
service = retrofit.create(NetworkServiceInterface.class);
}
Run Code Online (Sandbox Code Playgroud)
这现在让我在Retrofit 2.0中失败了,最初我没有"授权"标题,并且它给了我未经授权的,这是可以理解的.但是现在我用我的身份验证令授权它并且它失败了.Retrofit 2.0的新功能,谢谢 -
Vis*_*Raj 15
您可以将授权标头传递为:
@GET("/v1/OrderReport.json")
Call<POJO_Class> getExampleMethod(@Header("Authorization") String token, @Query("id") String id);
Run Code Online (Sandbox Code Playgroud)
然后打电话给:
getExampleMethod("Basic " + token, id);
Run Code Online (Sandbox Code Playgroud)
您可以使用OkHttpClient.Builder类在Retrofit 2中使用Interceptor为每个调用添加Authorization Header.像这样.
import okhttp3.OkHttpClient;
import okhttp3.Interceptor;
OkHttpClient defaultHttpClient = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {
//getAccessToken is your own accessToken(retrieve it by saving in shared preference or any other option )
if(getAccessToken().isEmpty()){
PrintLog.error("retrofit 2","Authorization header is already present or token is empty....");
return chain.proceed(chain.request());
}
Request authorisedRequest = chain.request().newBuilder()
.addHeader("Authorization", getAccessToken()).build();
PrintLog.error("retrofit 2","Authorization header is added to the url....");
return chain.proceed(authorisedRequest);
}}).build();
Run Code Online (Sandbox Code Playgroud)
并将此客户端对象添加到改造对象.
retrofit = new Retrofit.Builder()
.baseUrl(BASE_URL) //BaseURL always ends with "/"
.addConverterFactory(GsonConverterFactory.create())
.client(defaultHttpClient)
.build();
Run Code Online (Sandbox Code Playgroud)
现在,对于您使用改装对象进行的每次调用,都会添加"Authorization"标题以及url.并且我们还处理这样的条件:如果授权值为空,那么我们只是省略请求调用的Authorization头部分.
从翻新版:2.0
您必须使用OkHttpClient.Builder()类添加Interceptors。
因此,您必须像这样更改代码。
OkHttpClient client = new OkHttpClient.Builder();
client.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request original = chain.request();
Request request = original.newBuilder()
.header("Accept", "application/pyur.v1")
.header("Authorization", new SharedPreferencesUtil(getBaseContext()).getToken())
.header("Content-Type", "application/json")
.method(original.method(),original.body())
.build();
return chain.proceed(request);
}
}).build();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
15424 次 |
| 最近记录: |