前些天和我们的一个邮件服务商对接,双方需要进行一些通讯,对方是 java 团队,而作为. net 团队的我们,只能公布出去的是一个 wcf 的 basicbinding,想不
到问题来了,对方不知道怎么去调用这个 basic,可能他们水平有点菜,有点尴尬,不得已我来研究研究,其实只要知道公布的 wsdl,对什么语言都是很简单的。
一:案例
为了方便,我也不特意写什么代码了,就用 vs 里面的 wcf 服务模板创建一下,详细内容如下:
- // 注意: 使用"重构"菜单上的"重命名"命令,可以同时更改代码、svc 和配置文件中的类名"Service1"。
- // 注意: 为了启动 WCF 测试客户端以测试此服务,请在解决方案资源管理器中选择 Service1.svc 或 Service1.svc.cs,然后开始调试。
- public class Service1 : IService1
- {
- public string GetData(int value)
- {
- return string.Format("You entered: {0}", value);
- }
- public CompositeType GetDataUsingDataContract(CompositeType composite)
- {
- if (composite == null)
- {
- throw new ArgumentNullException("composite");
- }
- if (composite.BoolValue)
- {
- composite.StringValue += "Suffix";
- }
- return composite;
- }
- }
然后 F5 运行一下,就可以看到这样的一个 wcf 测试客户端,有服务地址,有提供的两个方法契约。
二:java 调用
1. 使用 web service client
其实在 eclipse 的新建项目中有一个 Web Service Client 模板,这个里面就可以将 wsdl 转换为 proxy 的 java 代码,有一点像 C# 中的服务引用,是不是,
下面就一步一步操作下:
《1》 新建一个 java project,或者 dynamic web project 都是可以的,本次测试只新建一个 MyJavaTest 的 project。
《2》 然后使用 WebService Client 的模板 File => Other =>Web Services => Web Service Client 即可。
《3》在 Service definition 选项中输入我们的 wcf 服务地址:http://localhost:54248/Service1.svc?wsdl,一定要注意
在 svc 后面加上一个 wsdl,这样就方便 java proxy 找到哈,然后左下角有一个 "温度计",调到 start client 模式就
好,然后继续点击下一步,详细如下图:
《4》 下图就表示生成好的代码将放入到哪一个目录下,这个没什么好说的。
《5》然后点击 finish,现在你会发现,你多了几个自动化的 java 类,便捷性和 visual studio 有的一拼。
好了,自动化的类都出来了,接下来我只需要新建了一个入口的 Program 类,是不是就可以敲定了。。。
- package com.datamip;
- import java.rmi.RemoteException;
- import org.tempuri.IService1Proxy;
- public class Program {
- public static void main(String[] args) throws RemoteException {
- IService1Proxy proxy = new IService1Proxy();
- String result = proxy.getData(12345);
- System.out.println(result);
- }
- }
不过要吐槽的是,IService1Proxy 居然是一个类,我还以为是接口呢,思维定势吧~~~
2. 使用 wsimport 小工具
其实 java 的 jdk 里面有很多的实用小工具,其中就有一款 wsimport.exe,它就可以用来根据 wsdl 生成自动化的 proxy 类,和. net 的 svcutil 的功能
是一样的。
由于 jdk 路径都配置到了环境变量中,就可以在 cmd 中看一下 wsimport 需要的参数。
- C:\Users\hxc>wsimport
- 缺少 WSDL_URI
- 用法: wsimport [options] <WSDL_URI>
- \其中 [options] 包括:
- -b <path> 指定 jaxws/jaxb 绑定文件或附加模式
- (每个 <path> 都必须具有自己的 -b)
- -B<jaxbOption> 将此选项传递给 JAXB 模式编译器
- -catalog <file> 指定用于解析外部实体引用的目录文件
- 支持 TR9401, XCatalog 和 OASIS XML 目录格式。
- -d <directory> 指定放置生成的输出文件的位置
- -encoding <encoding> 指定源文件所使用的字符编码
- -extension 允许供应商扩展 - 不按规范
- 指定功能。使用扩展可能会
- 导致应用程序不可移植或
- 无法与其他实现进行互操作
- -help 显示帮助
- -httpproxy:<host>:<port> 指定 HTTP 代理服务器 (端口默认为 8080)
- -keep 保留生成的文件
- -p <pkg> 指定目标程序包
- -quiet 隐藏 wsimport 输出
- -s <directory> 指定放置生成的源文件的位置
- -target <version> 按给定的 JAXWS 规范版本生成代码
- 默认为 2.2, 接受的值为 2.0, 2.1 和 2.2
- 例如, 2.0 将为 JAXWS 2.0 规范生成兼容的代码
- -verbose 有关编译器在执行什么操作的输出消息
- -version 输出版本信息
- -wsdllocation <location> @WebServiceClient.wsdlLocation 值
- -clientjar <jarfile> 创建生成的 Artifact 的 jar 文件以及
- 调用 Web 服务所需的 WSDL 元数据。
- -generateJWS 生成存根 JWS 实现文件
- -implDestDir <directory> 指定生成 JWS 实现文件的位置
- -implServiceName <name> 生成的 JWS 实现的服务名的本地部分
- -implPortName <name> 生成的 JWS 实现的端口名的本地部分
- \扩展:
- -XadditionalHeaders 映射标头不绑定到请求或响应消息不绑定到
- Java 方法参数
- -Xauthfile 用于传送以下格式的授权信息的文件:
- http://username:password@example.org/stock?wsdl
- -Xdebug 输出调试信息
- -Xno-addressing-databinding 允许 W3C EndpointReferenceType 到 Java 的绑定
- -Xnocompile 不编译生成的 Java 文件
- -XdisableAuthenticator 禁用由 JAX-WS RI 使用的验证程序,
- 将忽略 -Xauthfile 选项 (如果设置)
- -XdisableSSLHostnameVerification 在提取 wsdl 时禁用 SSL 主机名
- 验证
- \示例:
- wsimport stock.wsdl -b stock.xml -b stock.xjb
- wsimport -d generated http://example.org/stock?wsdl
- C:\Users\hxc>
这其中,大概知道下面 4 个参数就好说了。
《1》 url: 你需要生成代理类的数据源,也就是 wsdl 文件
《2》 -d: 生成的 proxy 文件需要存放的路径
《3》-p: 生成 proxy 类的包名。
《4》-keep:保存生成的文件名
接下来我们就 cmd 试一下:
- C:\Users\hxc>wsimport http://localhost:54248/Service1.svc?wsdl -d c:\\2\\ -p com.datamip.proxy -keep
- 正在解析 WSDL...
- 正在生成代码...
- 正在编译代码...
- C:\Users\hxc>
好了,接下来就可以将 "文件夹 2" 中的 proxy 类 copy 到 project 中,如下图:
看起来是不是很完美,那接下来要做的事情就是 coding 验证啦~~~
最后还有一种笨的方法,那就是通过 fiddler 抓取 webservice 通讯的参数,然后通过 httppost 模拟提交,也是可以的。。。好了,本篇就和大家说到
这里,希望对你有帮助。
来源: http://www.cnblogs.com/huangxincheng/p/7335312.html