我有一些具有相同baseUrl的服务URL。对于某些网址,会有一些常用的参数,例如apiVersion
或locale
。但是它们不必存在于每个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。
答案 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
);
希望有帮助。