Android的数据处理方案

在Retrofit+okHttp中设置修改http的访问头部Us

2017-06-24  本文已影响376人  minminaya

某些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())

附上常见浏览器User-Agent大全

给okHttp设置移除旧的Header并设置新的Header

Request request = new Request.Builder().url(url)
                             .removeHeader("User-Agent")
                             .addHeader("User-Agent", WebSettings.getDefaultUserAgent(App.getINSTANCE()))
                              .build();
            httpClient.newCall(request).enqueue(handler);

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


参考自

Retrofit2 + OkHttp3下统一设置Http请求的Headers

Okhttp设置User-Agent你可能没遇到的坑,源码解读

上一篇下一篇

猜你喜欢

热点阅读