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


猜你喜欢
- Android - 拆分 Drawable 2022-01-01
- 用 Swift 实现 UITextFieldDelegate 2022-01-01
- android 4中的android RadioButton问题 2022-01-01
- Android viewpager检测滑动超出范围 2022-01-01
- 使用自定义动画时在 iOS9 上忽略 edgesForExtendedLayout 2022-01-01
- 想使用ViewPager,无法识别android.support.*? 2022-01-01
- Android - 我如何找出用户有多少未读电子邮件? 2022-01-01
- MalformedJsonException:在第1行第1列路径中使用JsonReader.setLenient(True)接受格式错误的JSON 2022-01-01
- 如何检查发送到 Android 应用程序的 Firebase 消息的传递状态? 2022-01-01
- 在测试浓缩咖啡时,Android设备不会在屏幕上启动活动 2022-01-01