webservice调用工具,webservices调用
forest调用webservice
用java实现web services必须遵循两个规范,他们分别是:
? JSR 101:用于基于XML的RPC ,Remote Procedure Call、 的Java API 、Java
API for XML based RPC, JAX-RPC,
? JSR 109:实现企业Web服务。Implementing Enterprise Web services。两个规范提供了厂商的实现的一致性和互操作性需求。
JAX-RPC——Java到XML和XML到Java映射API
JAX-RPC为基于XML的远程过程调用。Remote Procedure Call、 RPC,和Java应用程序编程接口 、Java Application Programming Interface。 API, 、
? WSDL到Java和Java到WSDL映射,例如、将WSDL端口类型映射到Java服
务端点接口 ,Java Service Endpoint Interface、 SEI。 。
? XML数据类型到Java数据类型和Java数据类型到XML数据类型映射。包括简
单类型、复杂类型和数组。
除了XML映射之外, JAX-RPC还定义了服务器端编程模型和API。 AX-RPC 1. 1根据Web 服务互操作性组织、Web Services Interoperability organization、 WS-I。基本概要版本1.0 、Basic Profile version 1.0,添加了互操作性需求。
JSR 109——J2EE环境的API
JSR 109指定了Java 2 Enterprise Edition ,J2EE、环境的Web服务编程模型和体系结构。 JSR 109构建在SOAP 1. 1和WSDL 1. 1的基础上、它涵盖了J2EE环境中JAX-RPC 的使用, 图2, 。它还定义了J2EE应用程序服务器中的部署模型。 JSR 109的客户端编程模型符合JAX-RPC。
JAX-RPC 1. 1和JSR 109是J2EE 1.4的组成部分。
1/7页
在这里我不准备描述用java如何实现服务端,仅描述如何用java作为客户端如何调用web services。
获取客户端服务
Java客户端有两种获取方式、一种是基于容器管理的、一种不是基于容器管理的。基于容器管理的、可以是不同类型的J2EE容器管理的客户机,
? 应用程序客户机容器客户机
? Web容器客户机。 JavaBean或Servlet
? EJB容器客户机、 EJB
他们通过jndi查找服务。一般是两个步骤:
1,实例化本地JND I上下文。
2、在此上下文中对Web服务进行JND I查找。
Context ic = new InitialContext() ;
Service service = (Service) ctx. lookup("java:comp/env/service/HelloService") ;然后可以使用获得的服务接口 。Service Interface,来获取静态存根、动态代理或DII Call对象,来实现我下面描述的三种调用方式。
不是基于容器管理的、就是在本地通过java程序直接调用服务的,服务查找是通过JAX-RPC ServiceFactory进行的、 JAX-RPC ServiceFactory是创建服务访问点的工厂,可以如下进行使用获取服务。javax.xml.rpc.Service service =
ServiceFactory.newInstance() .createService(. . . ) ;
我在下面描述的客户端获取方式都是基于不是容器管理的。java调用webservices
用java作为客户端调用webservices主要有三种方式,下面描述三种调用方式。
1.DLL 、Dynamic Invocation Interface,调用
复杂度最高。灵活性最强的调用方式
通过自己创建Call对象完成调用,此方法的步骤如下,
2/7页
1. 获取一个JAX-RPC Service 。
2. 使用JAX-RPC Service的createCall ()方法实例化JAX-RPC Call 。
3. 使用它的setter方法来配置您的Call实例。
4. 使用JAX-RPC Call的调用方法来调用Web服务的操作。
String namespace = "";
String portName = "Hello";
QName portQN = new QName"(namespace, "portName) ;
String operationName = getGreeting ;
Call call = service.createCall () ;call. setPortTypeName(portQN) ;call. setOperationName(new QName(namespace, operatio"n"Name) ) ;call. setProperty(Call.ENCODINGSTYLE_URI_PROPERTY, ) ;call. setProperty(Ca"ll.OPER"ATION_STYLE_PROPERTY, "wrapped") ;call.addParameter( param1 , xsd:string,ParameterMode. IN) ;call. setReturnType(xsd:string) ;
Object[] inParams = new Object[] {"Jane"} ;
String ret = (String) call. invoke(inParams) ;
使用DII Call接口的优势在于,客户机可以调用远程过程而无需知道开发时的WSDL URI或Web服务操作的签名。这样当Web服务的细节改变时、很容易对代码进行修改。使用DII客户机,不需要像动态代理或静态存根的情形那样由从WSDL到Java的映射工具。Emitter,生成运行时类。然而,如果您知道您想要调用的 Web服务不可能更改,就应该使用动态代理。 因为配置Call实例可能很复杂。
我以调用一个axis的webservices为例说明DLL如何调用。
编写服务端程序Hello package com. lion. service public class Hello {public String sayHello(String name)
{return "hello "+name;
}
}
将上面的程序发布成一个web服务。在web-info\server-config.wsdd文件添加下列描述,service name="Hel"lo" provide"r="java":RPC"
parameter name= className value= com. lion. service .Hello"/
parameter name="allowedMethods" value=" sayHello "/
/service
客户端调用程序如下TestHelloClient. java,import org.apache.axis.client.Call ;
3/7页
import org.apache.axis.client.Service;import javax.xml.namespace.QName;import javax.xml.rpc.ServiceException;import java.net.MalformedURLException;import java.rmi.RemoteException;public class TestHelloClient{public static void main(String[] args) {try {
String endpoint = " ";
Service service = new Service() ;
Call call = null;call = (Call) service.createCall () ;call. setTargetEndpointAddress(new java.net.URL(endpoint) ) ;
//为Call设置服务的位置call. setOperationName( “sayHello” ) ;
String res = (String)" call. invoke(new"Object[] {"lion"} ) ;
System.out.println( return value is + res) ;
} catch (Exception ex) {ex.printStackTrace() ;
}
}
}
2.使用动态代理,Dynamic Proxy、调用
复杂度中等、灵活性中等的调用方式
您可以使用代理从JAX-RPC Service中调用Web服务的操作。代理是实现SEI (服务端点接口 Service Endpoint Interface)的Java类。获得代理使用的是JAX-RPC Service 的getPort()方法,它接受您想要调用的Web服务的端口的名称,存在于WSDL文档中。以及代理实现的SEI。它之所以称为动态是因为该代理是在运行时创建的。动态代理客户机的步骤如下、
1. 获取一个JAX-RPC Service 。
2. 使用JAX-RPC Service的getPort()方法来获得一个代理以调用Web服务的操
作。
String namespace = "";
String portName = "Hello";
QName portQN = new QName(namespace, portName) ;
4/7页
Hello myProxy = service.getPort(portQN, Hello.class) ;
System.out.println(myProxy.getGreeting("Jane") ) ;
这是所有您为了使用动态代理方法调用Web服务而需要编写的代码。使用这种方法的优势在于您可以编写可移植的、厂商无关的代码。然而、您需要知道开发时的WSDL URL、并且需要在运行之前根据WSDL文档运行您的从WSDL到Java的映射工具。如果您没有这方面的信息,或者WSDL URL很可能改变、那么您应该改为使用DII方法。
仍以上面发布的hello服务为例子。下面是动态代理的调用代码。
编写客户端代理接口
//这里声明的方法一定要和服务端程序的方法名称和参数相同。最好类名也一样//而且必须继承java.rmi.Remote接口public interface HelloClientInterface extends java.rmi.Remote {public String sayHello (String name) throws java.rmi.RemoteException;}
编写并执行客户端程序TestHelloClient. java import javax.xml.rpc.Service;import javax.xml.rpc.ServiceFactory;import java.net.URL;import javax.xml.namespace.QName;public class TestHelloClient {public static void main(String[] args) {try
{
String wsdlUrl = " ";//wsdl描述
String nameSpaceUri = " ";//wsdl描述里面的服务命名空间
String serviceName = "HelloService";// wsdl描述里面发布的服务名称
String portName = "Hello";//wsdl描述里面面发布的服务里面的port名称
ServiceFactory serviceFactory = ServiceFactory.newInstance() ;
Service afService = serviceFactory.createService(new URL(wsdlUrl) ,new QName(nameSpaceUri, serviceName) ) ;
HelloClientInterface proxy = (HelloClientInterface)afService.getPort(new QName(nameSpaceUr"i, portName) , Hel"loClientInterface."clas"s) ;
System.out.println( return value is +proxy. sayHello( lion ) ) ;
}catch(Exception ex)
{ex.printStackTrace() ;
}
如何调用别人提供的webservice接口
在项目中选择【控制台应用程序】,点击项目右键,选择添加-服务引用。在地址栏中输入WebServie链接地址后回车,点击确定后在代码中就可以看到添加的服务应用了,详细步骤:
1、首先打开VS2013,选择文件-新建-项目。
2、在项目中选择【控制台应用程序】,将项目名称重新命名为【WebServiceTest】。
3、点击项目右键,选择添加-服务引用。
4、在地址栏中输入WebServie链接地址后回车,然后重新命名服务名称为【ServiceGetWeather】,点击确定后在代码中就可以看到添加的服务应用了。
5、然后在代码中添加如下代码,调用webservice,获取接口返回的数据,呈现出来。
6、这是运行的结果,可以看出接口返回了一个xml格式的数据。
webservice测试工具怎么用
一、通过WSCaller.jar工具进行测试:
前提:知道wsdl的url。
wsCaller可执行程序的发布方式为一个wsCaller.jar包,不包含Java运行环境。你可以把wsCaller.jar复制到任何安装了Java运行环境(要求安装JRE/JDK 1.3.1或更高版本)的计算机中,用以下命令运行wsCaller:
java -jar wsCaller.jar
使用wsCaller软件的方法非常简单,下面是wsCaller的主界面:
首先在WSDL Location输入框中输入你想调用或想测试的Web
Service的WSDL位置,,然后点“Find”按钮。wsCaller就会检查你输入的URL地址,并获取Web
Service的WSDL信息。如果信息获取成功,wsCaller会在Service和Operation下拉列表框中列出该位置提供的Web
Service服务和服务中的所有可调用的方法。你可以在列表框中选择你要调用或测试的方法名称,选定后,wsCaller窗口中间的参数列表框就会列出
该方法的所有参数,包括每个参数的名称、类型和参数值的输入框(只对[IN]或[IN,
OUT]型的参数提供输入框)。你可以输入每个参数的取值。如下图:
这时,如果你想调用该方法并查看其结果的话,只要点下面的“Invoke”按钮就可以了。如果你想测试该方法的执行时间,则可以在“Invoke
Times”框中指定重复调用的次数,然后再按“Invoke”按钮。wsCaller会自动调用你指定的方法,如果调用成功,wsCaller会显示结
果对话框,其中包括调用该方法所花的总时间,每次调用的平均时间和该方法的返回值(包括返回值和所有输出型的参数)。如下图:
wsCaller软件是基于Axis库(Apache eXtensible Interaction System)开发的,Axis库的介绍及其版权信息请参见Apache Software Foundation的网站。
二、编写java的Main()函数,创建XFireProxyFactory调用声明的Interface接口函数。
前提:知道wsdl的url、知道webservice程序的接口(方法)声明。
举例:
public static void main(String[] args) {
Service srvcModel = new ObjectServiceFactory()
.create(IHelloWorldService.class);
XFireProxyFactory factory = new XFireProxyFactory(XFireFactory
.newInstance().getXFire());
String helloWorldURL = "";
try {
IHelloWorldService srvc = (IHelloWorldService) factory.create(
srvcModel, helloWorldURL);
System.out.print(srvc.example("dennis"));
} catch (MalformedURLException e) {
e.printStackTrace();
}
}
三、利用Eclipse向导生成webservice的客户端调用程序。
前提:知道wsdl的url、知道webservice程序的接口(方法)声明。
步骤:
1)在Eclipse中加入Xfire插件:
在Eclipse的安装目录的plugins下包含:
org.codehaus.xfire.eclipse.ui_1.0.2.xfire126.jar、
org.codehaus.xfire.eclipse.ui.wizards_1.0.2.xfire126.jar、
org.codehaus.xfire.eclipse.core_1.0.2.xfire126.jar
在Eclipse的安装目录的features下包含:
org.codehaus.xfire.eclipse_1.0.2.xfire126
2) 在Eclipse中创建一个Web Project项目,设为WSClient项目名。
同时点击项目右键,添加Xfire nature。
3)在WSClient项目下创建一个Web Service Client文件组【或者是Code Generation from WSDL document的文件组!】。
即点击项目右键,new--》other--》...
输入webservice的url,比如:
再选好生成文件放置目录。完成生成!
4)修改所生成文件组中的文件:****client.java 中的main函数.
比如:生成的文件为BizRemoteServiceClient.java,在main函数中找到:
BizRemoteServiceSoap bizRemoteServiceSoap = client.getBizRemoteServiceSoapLocalEndpoint();
该语句用BizRemoteServiceSoap bizRemoteServiceSoap = client.getBizRemoteServiceSoap();代替即可!
public static void main(String[] args) {
BizRemoteServiceClient client = new BizRemoteServiceClient();
//create a default service endpoint
//BizRemoteServiceSoap bizRemoteServiceSoap = client.getBizRemoteServiceSoapLocalEndpoint();
BizRemoteServiceSoap bizRemoteServiceSoap = client.getBizRemoteServiceSoap();
//TODO: Add custom client code here
//
//bizRemoteServiceSoap.yourServiceOperationHere();
MyResponse MyResponse=bizRemoteServiceSoap.login("ivy1", "111");
System.out.println(MyResponse.getFlag());
System.out.println(MyResponse.getDetail());
System.out.println("test client completed");
System.exit(0);
}
绿色代码部分是根据测试业务逻辑加入的测试代码!试具体测试任务而定!
直接运行该main函数,看结果即可!