我必须与以下四个 RESTServices 进行通信。
Germany (Default): http://url.com/suggest?query=
Austria http://url.com:82/suggest?query=
Swiss: http://url.com:83/suggest?query=
Spain: http://url.com:84/suggest?query=
基本上我必须在每个国家/地区的不同 TCP 端口上调用相同的 RESTService。当我创建一个 Retrofit-RestAdapter 时,我必须提供一个端点(base-url):
RestAdapter.Builder builder = new RestAdapter.Builder();
ObjectMapper mapper = new ObjectMapper();
builder.setEndpoint("http://url.com");
如果我想访问上面提到的这四个 RESTServices,我是否必须为它们每个创建一个 RestAdapter?或者是否可以只使用一个 RestAdapter 实例?
我试图通过将 TCP 端口添加为 RestInterface 注释的一部分来解决问题,但这不起作用:
public interface AutoSuggestRemote {
@GET (":{port}/suggest")
public Response getSuggestions(@Path ("port") Integer httpPort, @Query ("query") String query);
}
我在 Logcat 中得到以下异常:
java.lang.IllegalArgumentException: AutoSuggestRemote.getSuggestions: URL path ":{port}/suggest" must start with '/'.
at retrofit.RestMethodInfo.methodError(RestMethodInfo.java:123)
at retrofit.RestMethodInfo.parsePath(RestMethodInfo.java:212)
at retrofit.RestMethodInfo.parseMethodAnnotations(RestMethodInfo.java:165)
at retrofit.RestMethodInfo.init(RestMethodInfo.java:133)
at retrofit.RestAdapter$RestHandler.invokeRequest(RestAdapter.java:294)
at retrofit.RestAdapter$RestHandler.invoke(RestAdapter.java:240)
at $Proxy3.getSuggestions(Native Method)
因此我的问题是,如果我必须为每个 RESTService 创建一个 RestAdapter 实例,或者有没有办法通过使用相同的 RestAdapter 实例与所有四个服务进行通信。
最佳答案
Retrofit 每次发出请求时都会查询 EndPoint 类。正如@JakeWharton 先前在问题 Dynamic Paths in Retrofit 中所回答的那样您可以使用自己的实现扩展 EndPoint 类,并根据需要动态设置适当的端口。
这是@JakeWharton 为您的特定目的修改后的代码。
public final class FooEndpoint implements Endpoint {
private static final String BASE = "http://192.168.1.64:";
private String url;
public void setPort(String port) {
url = BASE + port;
}
@Override public String getName() {
return "default";
}
@Override public String getUrl() {
if (url == null) throw new IllegalStateException("port not set.");
return url;
}
}
然后您可以使用对此 FooEndPoint 实例的引用来动态更改端口或在初始化时更改一次。 如果您选择在初始化时设置一次端口,那么您只需执行此操作即可。
FooEndPoint endPoint = new FooEndPoint();
endPoint.setPort(loadPortFromSomeWhere());
RestAdapter.Builder builder = new RestAdapter.Builder();
builder.setEndpoint(endPoint);
这将允许您使用具有多个端口的单个 RestAdapter。
关于android - 改造 1.6 : Call RestService with different (TCP)-Ports,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24433059/