很长时间不调用webservice
接口了,记得当初调webservice
的时候,还要结合Cxf
、XFire
等框架。但是今天忽然给我一个这样的第三方wsdl
地址,需要推送数据。
难道还要配置webservice
框架吗?费那么大劲,最后就调一个接口。
然后,我本着执着的思想,坚决不配置webservice
的东西,就要调通这个接口。最后真的发现了。真的太方便了。。。
具体步骤
1、第三方提供的接口文档
调过webservice
接口的同学们,肯定知道,接口提供方会给出一个类似http://123.21.11.223:19080/project-uniform-code-service?wsdl
这样的地址。然后再配一个接口文档,比如下边:
对,没毛病,这就是正常的提供,因为webservice
的调用时,需要根据给的wsdl
地址,自己来生成里边的接口等调用接口所需要的类。
我们根据wsdl
地址生成所需接口的代码,方式很多。可以用jdk
自带的wsimport
,我是用的idea开发工具生成的。主要介绍它的办法。
2、idea根据wsdl生成接口代码
首先你要确定你要确定将代码生成在哪里。比如我打算在我新建的webservice
文件夹里生成代码,那右击webservice
文件夹,如下:
如上图,点击Genarate Java Code From Wsdl...
,弹出如下页面,进行如下填写:
填写完成后,点击ok
,即可在文件夹里生成很多类,其中包含一些class
文件,删掉class
文件,具体如下:
到这里,生成代码的步骤就完成了。
3、客户端调用接口
首先我要按照上边,第三方提供的文档,找到要求我调用的那个方法,它就在生成的第一个接口里:
@WebService(name = "IProjectUniformCodeService", targetNamespace = "http://service.exchange.gfm.glodon") @XmlSeeAlso({ ObjectFactory.class }) public interface IProjectUniformCodeService {
/** * * @param uniformCodeJournalReceiveBean * @return * returns cloud.user.service.webservice.UniformCodeResponse */ @WebMethod @WebResult(targetNamespace = "") @RequestWrapper(localName = "projectUniformMethodService", targetNamespace = "http://service.exchange.gfm.glodon", className = "cloud.user.service.webservice.ProjectUniformMethodService") @ResponseWrapper(localName = "projectUniformMethodServiceResponse", targetNamespace = "http://service.exchange.gfm.glodon", className = "cloud.user.service.webservice.ProjectUniformMethodServiceResponse") public UniformCodeResponse projectUniformMethodService( @WebParam(name = "uniformCodeJournalReceiveBean", targetNamespace = "") UniformCodeJournalReceiveBean uniformCodeJournalReceiveBean);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
但它是一个接口,我也没法获取到它的实体,怎么点到这个方法呢?反正我决定,不会去合webservice
框架的,再看看其他的文件吧。
生成的时候,觉得生成的内容里,有很多感觉不知道是些什么东西的文件,后来我就点开了看了下。这一看我恍然大悟。。。
比如生成的文件中的第二个文件,为什么名字叫的那么奇怪,**ServiceService
,点开后,我发现了如下的代码:
static {
URL url = null;
WebServiceException e = null;
try {
url = new URL("http://123.21.11.223:19080/project-uniform-code-service?wsdl");
} catch (MalformedURLException ex) {
e = new WebServiceException(ex);
}
IPROJECTUNIFORMCODESERVICESERVICE_WSDL_LOCATION = url;
IPROJECTUNIFORMCODESERVICESERVICE_EXCEPTION = e;
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
更重要的是它继承了javax.xml.ws.Service
类
@WebServiceClient(name = "IProjectUniformCodeServiceService", targetNamespace = "http://service.exchange.gfm.glodon",
wsdlLocation = "http://123.21.11.223:19080/project-uniform-code-service?wsdl")
public class IProjectUniformCodeServiceService
extends Service
{
- 1
- 2
- 3
- 4
- 5
此处的代码有情况啊。。哈哈。无缘无故new URL
,还是我要调的接口地址,这明显是在调用接口嘛。这很明显了。肯定会有后续步骤。
在本类里我又继续往下找,看到了如下代码:
@WebEndpoint(name = "IProjectUniformCodeServicePort")
public IProjectUniformCodeService getIProjectUniformCodeServicePort() {
return super.getPort(new QName("http://service.exchange.gfm.glodon",
"IProjectUniformCodeServicePort"), IProjectUniformCodeService.class);
}
- 1
- 2
- 3
- 4
- 5
为什么我注意到这个接口呢?因为在上边已经贴出来了,就是该接口里,有我要调用的方法,我前边因为它是接口没法new
出来,这里却返回了这个。
缺啥给啥,“对象“”有了。。。哈哈
最后我赶紧写了一个main
方法,内容如下:
IProjectUniformCodeServiceService serviceService = new IProjectUniformCodeServiceService();
IProjectUniformCodeService codeService = serviceService.getIProjectUniformCodeServicePort();
UniformCodeResponse uniformCodeResponse = codeService.projectUniformMethodService(receiveBean);
if(uniformCodeResponse != null){
if("200".equals(uniformCodeResponse.getCode())){
return uniformCodeResponse.getUniformCodeJournalReturn().getUnifiedDealCode();
}
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
上边的receiveBean
是个实体类,即要求我给他把参数封装成的对象,这个好理解,我把它省略没贴出来,我就这么写完,接口一调,果然通了。
原来wsdl
生成的类里,已经有了客户端直接调用接口的方法。
其实上边可以写的再好点,生成类里还有个ObjectFactory
类,该类是所需类的一个工厂类,可以拿到具体的要用的类。我后来也改成了用它调用。