某些API應該是服務器設置了限制,使得手機端okhttp作為 http客戶端時,獲取數據,服務器返回HTTP 403禁止訪問。
本篇文章用修改okhttp的頭部Header字段模擬手機瀏覽器訪問服務器,從而可以通過被限制的服務器。
如果是未修改前,也就是默認時會出現
W/System.err: retrofit2.adapter.rxjava2.HttpException: HTTP 403 Forbidden
服務器禁止訪問了,因為okhttp并不是真正的原生的http請求,它在header中并沒有真正的User-Agent,而是“okhttp/版本號”。
開工。。。。。
獲取User-Agent
在API17后可用下面這個來獲取
WebSettings.getDefaultUserAgent(App.getINSTANCE())
給okHttp設置移除舊的Header并設置新的Header
- 如果是單純的okHttp請求,不加Retrofit的,
Request request = new Request.Builder().url(url)
.removeHeader("User-Agent")
.addHeader("User-Agent", WebSettings.getDefaultUserAgent(App.getINSTANCE()))
.build();
httpClient.newCall(request).enqueue(handler);
- 如果是okHttp+Retrofit,就要用構造器添加Interceptor
import android.webkit.WebSettings;
import com.minminaya.myapplication.App;
import com.minminaya.myapplication.api.MusicApi;
import java.io.IOException;
import okhttp3.Interceptor;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import retrofit2.CallAdapter;
import retrofit2.Converter;
import retrofit2.Retrofit;
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory;
import retrofit2.converter.gson.GsonConverterFactory;
/**
* 初始化網絡Retrofit等服務
* Created by Niwa on 2017/6/24.
*/
public class NetWork {
private static MusicApi musicApi;
private static Converter.Factory gsonConverterFactory = GsonConverterFactory.create();
private static CallAdapter.Factory rxJavaCallAdapterFactory = RxJava2CallAdapterFactory.create();
public static MusicApi getMusicApi() {
if (musicApi == null) {
Retrofit retrofit = new Retrofit.Builder()
.client(getOkHttpClient())//獲取后的okhttp頭部
.baseUrl("http://tingapi.ting.baidu.com/v1/restserver/")
.addConverterFactory(gsonConverterFactory)
.addCallAdapterFactory(rxJavaCallAdapterFactory)
.build();
musicApi = retrofit.create(MusicApi.class);
}
return musicApi;
}
/**
* 構造okhttp頭部
*
* */
private static OkHttpClient getOkHttpClient() {
OkHttpClient httpClient = new OkHttpClient.Builder()
.addInterceptor(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Request request = chain.request()
.newBuilder()
.removeHeader("User-Agent")//移除舊的
.addHeader("User-Agent", WebSettings.getDefaultUserAgent(App.getINSTANCE()))//添加真正的頭部
.build();
return chain.proceed(request);
}
}).build();
return httpClient;
}
}
end
參考自