首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >改进1.6:使用不同的(TCP)-Ports调用RestService

改进1.6:使用不同的(TCP)-Ports调用RestService
EN

Stack Overflow用户
提问于 2014-06-26 22:22:34
回答 1查看 3.7K关注 0票数 6

我必须与以下四个RESTServices进行交流。

代码语言:javascript
复制
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-Ports上调用相同的RESTService。当我创建Retrofit-RestAdapter时,我必须提供一个端点(base-url):

代码语言:javascript
复制
RestAdapter.Builder builder = new RestAdapter.Builder();
    ObjectMapper mapper = new ObjectMapper();
    builder.setEndpoint("http://url.com");

如果我想访问上面提到的四个RESTServices,我需要为它们创建一个RestAdapter吗?或者可以只使用一个RestAdapter实例?

我试图通过添加TCP-Port作为RestInterface-annotation的一部分来解决这个问题,但这不起作用:

代码语言:javascript
复制
public interface AutoSuggestRemote {
    @GET (":{port}/suggest")
    public Response getSuggestions(@Path ("port") Integer httpPort, @Query ("query") String query);
}

我在Logcat中得到以下异常:

代码语言:javascript
复制
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实例与所有四个服务通信。

EN

回答 1

Stack Overflow用户

发布于 2014-06-28 02:01:01

Retrofit在每次发出请求时都会咨询EndPoint类。正如@JakeWharton在问题Dynamic Paths in Retrofit中回答的那样,您可以使用自己的实现扩展EndPoint类,并根据需要动态设置适当的端口。

以下是@JakeWharton提供的代码,针对您的特定目的进行了修改。

代码语言:javascript
复制
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实例的引用来动态更改端口,或在初始化时更改一次。如果您选择在初始化时设置一次端口,则只需执行此操作。

代码语言:javascript
复制
FooEndPoint endPoint = new FooEndPoint();
endPoint.setPort(loadPortFromSomeWhere());

RestAdapter.Builder builder = new RestAdapter.Builder();
    builder.setEndpoint(endPoint);

这将允许您将单个RestAdapter与多个端口一起使用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24433059

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档