我需要对外部编辑器提供的xmlrpc服务进行java调用。
这是一个古老的协议,但由于它是外部的,我没有选择。
我有一个网址,一个登录名和一个验证密码。
我有一个工作原型,使用Java11和ApacheXMLRPC库。
这是我的工作代码:
XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
config.setBasicUserName("some-usr");
config.setBasicPassword("some-pwd");
config.setServerURL(URL url = new URL("https://my-editor/my-service/rpc/"));
XmlRpcClient client = new XmlRpcClient();
client.setConfig(config);
Map<String, Object> requestMap = ...;
Map<String, Object> responseMap = (Map<String, Object>) client.execute("my-rpc-method", new Object[]{requestMap});
注意,我没有端口。
这可以使用java.util.map作为输入/输出,我使用jackson将普通模型对象转换为map或从map转换。
这一切都很好,但是我对apache xml rpc有两个主要的不满:
它不再维护-最新版本已经超过10年了
它没有对交换的请求和响应进行日志记录的功能(除非通过黑客攻击)
所以我寻找了替代的实现,实际上是在研究grpc。我必须定义一些契约定义文件(.protobuff),我用它来生成客户机代码;没问题。
但是,我不能让电话工作有两个原因:
我不确定要使用的url语法,所以我甚至无法访问服务器
我不知道如何做auth部分-我想我必须扩展callcredentials类,但是由于第一个原因,我甚至没有到达重写的方法
这是我的第一次尝试(MOT类是由一些.protobuff工具生成的):
public class MyCred extends CallCredentials {
@Override
public void applyRequestMetadata(RequestInfo requestInfo, Executor appExecutor, MetadataApplier applier) {
System.out.println("should see this");
}
@Override
public void thisUsesUnstableApi() {}
}
ManagedChannelBuilder<?> forTarget = ManagedChannelBuilder.forAddress("https://my-editor/my-service/rpc/", 443);
MyServiceBlockingStub blockingStub = MyServiceGrpc
.newBlockingStub(forTarget.build())
.withCallCredentials(new MyCred());
MyRpcRequest request = MyRpcRequest.newBuilder()
.setFirstname("dummy-firstname")
.setLastname("dummy-lastname").build();
MyRpcResponse response = blockingStub.myRpcMethod(request);
它需要一个端口,因为我不知道它是什么,所以我尝试了似乎是默认的端口(但这可能是错误的)。
这使我在channelbuilder初始化时出现以下错误:
java.lang.IllegalArgumentException: Invalid host or port: https://my-editor/my-service/rpc/ 443
at io.grpc.internal.GrpcUtil.authorityFromHostAndPort(GrpcUtil.java:520)
at io.grpc.netty.shaded.io.grpc.netty.NettyChannelBuilder.forAddress(NettyChannelBuilder.java:135)
at io.grpc.netty.shaded.io.grpc.netty.NettyChannelProvider.builderForAddress(NettyChannelProvider.java:38)
at io.grpc.netty.shaded.io.grpc.netty.NettyChannelProvider.builderForAddress(NettyChannelProvider.java:24)
at io.grpc.ManagedChannelBuilder.forAddress(ManagedChannelBuilder.java:39)
...
Caused by: java.net.URISyntaxException: Expected closing bracket for IPv6 address at index 9: //[https://my-editor/my-service/rpc/]:443
at java.base/java.net.URI$Parser.fail(URI.java:2915)
at java.base/java.net.URI$Parser.failExpecting(URI.java:2921)
at java.base/java.net.URI$Parser.parseServer(URI.java:3294)
at java.base/java.net.URI$Parser.parseAuthority(URI.java:3218)
at java.base/java.net.URI$Parser.parseHierarchical(URI.java:3160)
at java.base/java.net.URI$Parser.parse(URI.java:3127)
at java.base/java.net.URI.<init>(URI.java:685)
at io.grpc.internal.GrpcUtil.authorityFromHostAndPort(GrpcUtil.java:518)
我试着将第一行替换为:
ManagedChannelBuilder<?> forTarget = ManagedChannelBuilder.forTarget("https://my-editor/my-service/rpc/");
在建立频道时,我也遇到了一个错误:
java.lang.IllegalArgumentException: cannot find a NameResolver for https://my-editor/my-service/rpc/
at io.grpc.internal.ManagedChannelImpl.getNameResolver(ManagedChannelImpl.java:763)
at io.grpc.internal.ManagedChannelImpl.getNameResolver(ManagedChannelImpl.java:772)
at io.grpc.internal.ManagedChannelImpl.<init>(ManagedChannelImpl.java:652)
at io.grpc.internal.ManagedChannelImplBuilder.build(ManagedChannelImplBuilder.java:615)
at io.grpc.internal.AbstractManagedChannelImplBuilder.build(AbstractManagedChannelImplBuilder.java:261)
我做错什么了?甚至可以将我的旧代码迁移到grpc吗?
我又发现了两个最近的图书馆,并使它们发挥了作用,但它们也有类似的缺陷:
似乎没有维持
请求/响应日志记录不多(如果有)
这些是:
http://xmlrpc.sourceforge.net/
https://github.com/gturri/axmlrpc
最后一点,我还对任何使用替代库的代码示例感兴趣,前提是这些库是维护的,并且具有良好的日志记录。也许是cxf或者jakarte ee?我看了一眼,但是API很混乱;而且似乎需要一个wsdl(这意味着只有soap)。
或者在spring中使用一些工具(我的应用程序将基于spring)?
有什么想法吗?
暂无答案!
目前还没有任何答案,快来回答吧!