9.BDF2-WEBSERVICE-CLIENT

2023-07-03 17:28 更新
为了帮助我们的程序能快速调用目标Webservice服务,BDF2-WEBSERVICE-CLIENT模块提供了一个调用Webservice服务的客户端,利用这个客户端,通过几行简单的代码,就可以实现对目标Webservice服务的调用。在使用空上客户端时,它既可以调用那些不需要任何安全性验证的Webservice,也可以调用那些使用WS-Security进行认证的Webservice,同时对于一些采用HttpBasic进行认证的Webservice,我们的Webservice调用客户端也提供了支持。

为了演示这个客户端的具体用法,接下来我们用这个客户端来尝试调用在BDF2-WEBSERVICE模块当中介绍的示例Webservice,看看它能不能调用成功并为我们返回正确的结果。具体调用代码如下:

WebserviceClient类调用Webservice测试
package ws;
import com.bstek.bdf2.webservice.client.WebServiceClient;
public class WebserviceInvokeTest {
 public static void main(String[] args) throws Exception{
 String uri="http://localhost:8080/bdf2-test/dorado/webservice/requestUserWebService";
 
 //设置Webservice客户端要调用的目标Webservice的地址
 WebServiceClient client=new WebServiceClient(uri);
 
//设置要调用的目标Webservice的WS-Security认证所需要的username及password,以及是否对用户名及密码进
行加密传输
 client.setUsernameToken("admin", "81c1206f28f2738cdf714b4e10428c66f58eee10", true);
 
 /**
 * 设置要调用的目标Webservice的Http Basic认证所需要的username及password,
 * Http Basic认证当中所使用的密码为加密之前的密码,而非被加密之后的密码
 * */
 //client.setHttpAuthenticationCredentials("admin", "admin");
 
 UserRequest request= new UserRequest();
 request.setTargetCompany("bstek");
 request.setUserCount(2);
 
 //设置在调用目标Webservice过程当中,需要将Javabean与XML进行相互序列化的Javabean类的class
 client.setMarshallerClasses(new Class[]{UserRequest.class,UserResponse.class});
 
 //发送调用请求并返回调用结果
 UserResponse response=(UserResponse)client.sendAndReceive(request);
 
 //输出返回结果
 for(User user:response.getUsers()){
 System.out.println("username:"+user.getUsername() +" company:"+user.getCompanyId());
 }
 }
}
在这个测试代码当中,我们来看看其中要调用的目标Webserivce的uri,这个uri的值为“http://localhost:8080/bdf2-test/dorado/webservice/requestUserWebService”,实际上这个值是从我们之前生成的WSDL中获取的,再来看看我们的UserService.wsdl中最后那个service部分,如下图所示:


可以看到,这个uri的值源自我们的wsdl,实际上在编写Webservice调用客户端时,我们需要好好研究目标Webservice产生的WSDL文件,要通过这个文件知道目标Webservice的调用地址是什么(uri),需要传递的入参是什么,出参又是什么等,只有了解这些信息之后,才能确定该如何编写我们的Webservice调用客户端,所以,对于使用Webservice的广大程序员来说,了解并能读懂WSDL是何其重要。

因为Webservice是标准的,所以除了可以采用BDF2提供的WebserviceClient实现调用外,还可以采用其它工具实现,比如之前介绍的SoapUI就是一例。下面我们就以XFire的Dynamic Client为例,演示下如何使用XFire的Dynamic Client来调用我们的这个UserService,其代码如下:
基于XFire的Dynamic Client实现Webservice调用
package test;
import java.net.URL;
import org.apache.xerces.dom.DocumentImpl;
import org.codehaus.xfire.client.Client;
import org.jdom.Element;
import org.jdom.Text;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
public class SimpleTest {
 public static void main(String[] args) throws Exception{
 URL url=new URL("http://localhost:8080/bdf2-test/dorado/webservice/UserService.wsdl");
 Client client=new Client(url);
 Element root=new Element("UserRequest");
 Element company=new Element("targetCompany");
 company.setContent(new Text("bstek"));
 root.addContent(company);
 
 Element userCount=new Element("userCount");
 userCount.setContent(new Text("2"));
 root.addContent(userCount);
 
 Object[] obj=client.invoke("User",new Object[]{root});
 DocumentImpl doc=(DocumentImpl)obj[0];
 Node node=doc.getFirstChild().getFirstChild();
 NodeList list=node.getChildNodes();
 for(int i=0;i<list.getLength();i++){
 Node userNode=list.item(i);
 System.out.println("username:"+userNode.getFirstChild().getTextContent());
 
 }
 }
}

关于XFire的DynamicClient大家可以到其官网了解,这里需要指出的是在调用client的invoke时,它的第二个参数可以接受一个jdom的DOM对象,利用这个特性我们创建一个基于JDOM的UserRequest的DOM对象,并将需要的信息填充到这个XML的DOM当中,最后作为参数提交给XFire的DynamicClient去处理,XFire的Dynamic Client将给出的参数构建为SOAP消息传递给服务器处理。

以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号