前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >okhttp拦截器的使用------修改baseurl

okhttp拦截器的使用------修改baseurl

作者头像
提莫队长
发布2019-02-21 15:15:27
2.3K0
发布2019-02-21 15:15:27
举报
文章被收录于专栏:刘晓杰刘晓杰

有的时候做项目的时候会遇到调用接口的url和之前接口定义的url不一样,很可能连retrofit已经设置好的baseurl都要换,但是retrofit并没有提供修改baseurl的方法。那我们只能通过别的方式,比如通过拦截器修改baseurl

代码语言:javascript
复制
public class MainActivity extends AppCompatActivity {

    private static String BASE_URL = "https://api.github.com/";
    private static String BASE_URL_SINGLE = "http://news-at.zhihu.com/";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(BASE_URL)

                .addConverterFactory(GsonConverterFactory.create())
                .build();

        final GitHubService repo = retrofit.create(GitHubService.class);


        ((TextView) findViewById(R.id.tv1)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Call<List<Contributor>> call = repo.contributorsByAddConverterGetCall("square", "retrofit");
                call.enqueue(new Callback<List<Contributor>>() {
                    @Override
                    public void onResponse(Call<List<Contributor>> call, retrofit2.Response<List<Contributor>> response) {
                        List<Contributor> contributorList = response.body();
                        if (contributorList != null) {
                            for (Contributor contributor : contributorList) {
                                Log.e("login", contributor.getLogin());
                                Log.e("contributions", contributor.getContributions() + "");
                            }
                        }
                    }

                    @Override
                    public void onFailure(Call<List<Contributor>> call, Throwable t) {

                    }
                });
            }
        });

        ((TextView) findViewById(R.id.tv2)).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Call<News> call = repo.getRequest();
                call.enqueue(new Callback<News>() {
                    @Override
                    public void onResponse(Call<News> call, retrofit2.Response<News> response) {
                        News news = response.body();
                        if (news != null) {
                            Log.e("date", news.getDate());
                            for (News.Story story : news.getStories()) {
                                Log.e("story", story.toString());
                            }
                        }
                    }

                    @Override
                    public void onFailure(Call<News> call, Throwable t) {
                        Log.e("onFailure", "onFailure");
                    }
                });
            }
        });
    }
}

service的代码

代码语言:javascript
复制
public interface GitHubService {
    @GET("repos/{owner}/{repo}/contributors")
    Call<List<Contributor>> contributorsByAddConverterGetCall(@Path("owner") String owner, @Path("repo") String repo);

    @GET("api/4/news/latest")
    Call<News> getRequest();//从服务器端过滤数据,获取传入变量对应的数据
}

这是两个联网请求。因为baseurl不一致导致第二个textview点击以后请求出错。我们的目的就是要修改bseurl来让请求成功

第一步

在请求url上添加请求头headers

代码语言:javascript
复制
    @Headers({"baseurl:user"})//其实这里添加什么都无所谓的,主要是为了在拦截器里面捕捉到添加的headers
    @GET("api/4/news/latest")
    Call<News> getRequest();//从服务器端过滤数据,获取传入变量对应的数据

第二步

添加拦截器,捕捉到配置过的headers,然后再修改baseurl

代码语言:javascript
复制
    class ChangeUrlIntercept implements Interceptor {
        @Override
        public okhttp3.Response intercept(Chain chain) throws IOException {
            //获取request
            Request request = chain.request();

            //获取request的创建者builder
            Request.Builder builder = request.newBuilder();

            //从request中获取headers,通过给定的键url_name
            List<String> headerValues = request.headers("baseurl");
            if (headerValues != null && headerValues.size() > 0) {
                //如果有这个header,先将配置的header删除,因此header仅用作app和okhttp之间使用
                builder.removeHeader("baseurl");

                //从request中获取原有的HttpUrl实例oldHttpUrl
                HttpUrl oldHttpUrl = request.url();

                //匹配获得新的BaseUrl
                String headerValue = headerValues.get(0);
                HttpUrl newBaseUrl = null;
                if ("user".equals(headerValue)) {
                    newBaseUrl = HttpUrl.parse(BASE_URL_SINGLE);
                } else {
                    newBaseUrl = oldHttpUrl;
                }

                //重建新的HttpUrl,修改需要修改的url部分
                HttpUrl newFullUrl = oldHttpUrl
                        .newBuilder()
                        .scheme(newBaseUrl.scheme())
                        .host(newBaseUrl.host())
                        .port(newBaseUrl.port())
                        .build();

                //重建这个request,通过builder.url(newFullUrl).build();
                //然后返回一个response至此结束修改
                return chain.proceed(builder.url(newFullUrl).build());
            } else {
                return chain.proceed(request);
            }
        }

好了,这样只要给retrofit重新配置上这个okhhtpclient就可以了

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018年07月21日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 第一步
  • 第二步
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档