Retrofit 1.6: Call RestService with different (TCP)-Ports(改进1.6:使用不同的(TCP)端口调用RestService)
本文介绍了改进1.6:使用不同的(TCP)端口调用RestService的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我必须与以下四个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-port添加为RestInterface-Annotation的一部分来解决该问题,但这不起作用:
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-Instance,或者是否有办法使用相同的RestAdapter-Instance与所有四个服务通信。
推荐答案
Retrofit每次执行请求时都会咨询端点类。正如@JakeWharton在问题Dynamic Paths in Retrofit中所回答的,您可以使用自己的实现扩展端点类,并根据需要动态设置适当的端口。
以下是@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与多个端口一起使用。
这篇关于改进1.6:使用不同的(TCP)端口调用RestService的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:改进1.6:使用不同的(TCP)端口调用RestService
基础教程推荐
猜你喜欢
- Kivy Buildozer 无法构建 apk,命令失败:./distribute.sh -m “kivy"d 2022-01-01
- 如何在没有IB的情况下将2个按钮添加到右侧的UINavigationbar? 2022-01-01
- 如何让对象对 Cocos2D 中的触摸做出反应? 2022-01-01
- 如何在 UIImageView 中异步加载图像? 2022-01-01
- 当从同一个组件调用时,两个 IBAction 触发的顺序是什么? 2022-01-01
- 在 gmail 中为 ios 应用程序检索朋友的朋友 2022-01-01
- android 应用程序已发布,但在 google play 中找不到 2022-01-01
- Android:对话框关闭而不调用关闭 2022-01-01
- UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效? 2022-01-01
- 如何在 iPhone 上显示来自 API 的 HTML 文本? 2022-01-01