当前位置:  开发笔记 > 编程语言 > 正文

用okhttp替换改造2中的公共路径参数

如何解决《用okhttp替换改造2中的公共路径参数》经验,为你挑选了1个好方法。

我有一些具有相同baseUrl的服务URL.对于某些网址,会有一些常用的参数,例如apiVersionlocale.但它们不必存在于每个URL中,因此我无法将它们添加到baseUrl中.

.../api/{apiVersion}/{locale}/event/{eventId}
.../api/{apiVersion}/{locale}/venues
.../api/{apiVersion}/configuration

我不想在改装界面中添加这些参数.在改造1中,我制作了一个拦截器并用于RequestFacade.addPathParam(..., ...)填充每个URL的这些常用路径参数.

对于改造2,我似乎找不到用okhttp做这个的正确方法.我现在看到这种可能性的唯一方法是HttpUrlChain.request().httpUrl();一个okhttp中获取Interceptor并自己操纵那个,但我不知道这是否是最好的方法.

有没有人遇到过更好的方法来替换okhttp中的路径参数Interceptor

在撰写本文时,我正在使用改进:2.0.0-beta2和okhttp:2.7.2.



1> 小智..:

对于改造2,我似乎找不到用okhttp做这个的正确方法.我现在看到这种可能性的唯一方法是从Chain.request()获取HttpUrl.httpUrl(); 在一个okhttp拦截器中并自己操纵它,但我不知道这是否是最好的方法.

我的实现使用okhttp:3.2

    class PathParamInterceptor implements Interceptor {
        private final String mKey;
        private final String mValue;

        private PathParamInterceptor(String key, String value) {
            mKey = String.format("{%s}", key);
            mValue = value;
        }

        @Override
        public Response intercept(Chain chain) throws IOException {
            Request originalRequest = chain.request();

            HttpUrl.Builder urlBuilder = originalRequest.url().newBuilder();
            List segments = originalRequest.url().pathSegments();

            for (int i = 0; i < segments.size(); i++) {
                if (mKey.equalsIgnoreCase(segments.get(i))) {
                    urlBuilder.setPathSegment(i, mValue);
                }
            }

            Request request = originalRequest.newBuilder()
                    .url(urlBuilder.build())
                    .build();
            return chain.proceed(request);
        }
    }

推荐阅读
mobiledu2402851373
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有