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

时间:2016-01-11 14:44:28

标签: android okhttp retrofit2

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

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

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

对于改造2,我似乎找不到使用okhttp执行此操作的正确方法。我现在看到这种可能性的唯一方法是从HttpUrl Chain.request().httpUrl();获取Interceptor并自己操纵该Interceptor,但我不知道这是否是最好的要走的路。

有没有人遇到过更好的方法来替换okhttp use Zend\InputFilter\InputFilterProviderInterface; class UserManagementForm extends AbstractSbmForm implements InputFilterProviderInterface { public function __construct() { ... without change } public function getInputFilterSpecification() { return array( 'DateOfBirth' => array( 'name' => 'DateOfBirth', 'required' => false, ); ); } } 中的路径参数?

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

2 个答案:

答案 0 :(得分:5)

  

对于改造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<String> 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);
        }
    }

答案 1 :(得分:-1)

嗨,您可以使用这种方式:

@GET("/api/{apiVersion}/{locale}/venues")
Call<FilterResponse> getLocaleVenues
          @Path("apiVersion") int apiVersion,
          @Path("locale") String locale
);

希望有帮助。