当前最新的webservice 开发模型是 JAX-WS, 它support 两种webservice的client 类型。
A. Proxy Clients
B.Dispatch Clients
下面就对这两种client 类型做一个讲解。
1.概念
基于代理的客户端工作在webService 暴露的实现了SEI(Service Endpoint Interface)的本地代理对象上。
基于dispatch-client的model,是一个低level的model,它要求你自己提供必要的xml Request,这种model主要使用在一下两种情形:1.当你想自己动态组建你的SOAP request 时。2.当你使用一个不是基于SOAP的 webservice endpoint时。
Example:
当使用proxy-clients,你必须用相应的工具来根据WSDL生成client端的stub.
下面是一个WSDL
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/"
xmlns:tns="http://hello.itso/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.xmlsoap.org/wsdl/"
targetNamespace="http://hello.itso/"
name="HelloMessengerService">
<types>
<xsd:schema>
<xsd:import namespace="http://hello.itso/"
schemaLocation="http://localhost:9999/Hello?xsd=1"></xsd:import>
</xsd:schema>
</types>
<message name="sayHello">
<part name="parameters" element="tns:sayHello"></part>
</message>
<message name="sayHelloResponse">
<part name="parameters" element="tns:sayHelloResponse"></part>
</message>
<portType name="HelloMessenger">
<operation name="sayHello">
<input message="tns:sayHello"></input>
<output message="tns:sayHelloResponse"></output>
</operation>
</portType>
<binding name="HelloMessengerPortBinding" type="tns:HelloMessenger">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http"
style="document"></soap:binding>
<operation name="sayHello">
<soap:operation soapAction=""></soap:operation>
<input>
<soap:body use="literal"></soap:body>
</input>
<output>
<soap:body use="literal"></soap:body>
</output>
</operation>
</binding>
<service name="HelloMessengerService">
<port name="HelloMessengerPort"
binding="tns:HelloMessengerPortBinding">
<soap:address
location="http://localhost:9999/Hello"></soap:address>
</port>
</service>
</definitions>
生成的 客户端service class
import java.net.MalformedURLException;
import java.net.URL;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.WebEndpoint;
import javax.xml.ws.WebServiceClient;
import javax.xml.ws.WebServiceFeature;
@WebServiceClient(
name = "HelloMessengerService",
targetNamespace = "http://hello.itso/",
wsdlLocation = "http://localhost:9999/Hello?wsdl")
public class HelloMessengerService extends Service {
private final static URL HELLOMESSENGERSERVICE_WSDL_LOCATION;
static {
URL url = null;
try {
Chapter 2. Web services programming model 91
url = new URL("http://localhost:9999/Hello?wsdl");
} catch (MalformedURLException e) {
e.printStackTrace();
}
HELLOMESSENGERSERVICE_WSDL_LOCATION = url;
}
public HelloMessengerService(URL wsdlLocation, QName serviceName) {
super(wsdlLocation, serviceName);
}
public HelloMessengerService() {
super(HELLOMESSENGERSERVICE_WSDL_LOCATION, new QName(
"http://hello.itso/", "HelloMessengerService"));
}
@WebEndpoint(name = "HelloMessengerPort")
public HelloMessenger getHelloMessengerPort() {
return (HelloMessenger) super.getPort(new
QName("http://hello.itso/",
"HelloMessengerPort"), HelloMessenger.class);
}
@WebEndpoint(name = "HelloMessengerPort")
public HelloMessenger getHelloMessengerPort(WebServiceFeature...
features) {
return (HelloMessenger) super.getPort(new
QName("http://hello.itso/",
"HelloMessengerPort"), HelloMessenger.class, features);
}
}
生成的client端Interface
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.ws.RequestWrapper;
import javax.xml.ws.ResponseWrapper;
@WebService(name = "HelloMessenger", targetNamespace =
"http://hello.itso/")
@XmlSeeAlso({
ObjectFactory.class
})
public interface HelloMessenger {
@WebMethod
@WebResult(targetNamespace = "")
@RequestWrapper(localName = "sayHello", targetNamespace =
"http://hello.itso/", className = "itso.hello.SayHello")
@ResponseWrapper(localName = "sayHelloResponse", targetNamespace =
"http://hello.itso/", className = "itso.hello.SayHelloResponse")
public String sayHello(
@WebParam(name = "arg0", targetNamespace = "")
String arg0);
}
客户端调用代码
import itso.hello.HelloMessenger;
import itso.hello.HelloMessengerService;
import javax.xml.ws.BindingProvider;
public class HelloClientCustomEndpoint {
public static void main(String... args) throws Exception {
HelloMessengerService service = new HelloMessengerService();
HelloMessenger port = service.getHelloMessengerPort();
//You can also change the endpoint dynamically
((BindingProvider)port).getRequestContext().put(BindingProvider.ENDPOIN
T_ADDRESS_PROPERTY, "http://itso.ibm.com:69693/Hello");
String message = port.sayHello("Thilde");
System.out.println(message);
当使用Dispatch-clients
示例代码如下:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import javax.xml.namespace.QName;
import javax.xml.transform.Source;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;
import javax.xml.ws.Dispatch;
import javax.xml.ws.Service;
import javax.xml.ws.http.HTTPBinding;
public class HelloDispatchClient {
private static final String TNS = "http://hello.itso/";
public static void main(String... args) throws Exception {
// Define the service name, port name, and endpoint address
QName serviceName = new QName(TNS, "HelloMessengerService");
QName portName = new QName(TNS, "HelloMessenger");
String endpointAddress = "http://localhost:9999/Hello";
// Create a service that can bind to the HelloMessenger port
Service service = Service.create(serviceName);
service.addPort(portName, HTTPBinding.HTTP_BINDING,
endpointAddress);
// Create a Dynamic Dispatch client
//这里Service.Mode.MESSAGE意思是我们自己提供全部的 SOAPMessage,还有一个参数是Service.Mode.PAYLOAD意思是我们只提供SoapBody的部分。
Dispatch<Source> dispatch = service.createDispatch(portName,
Source.class, Service.Mode.MESSAGE);
// Create a SOAP request String
String request =
"<?xml version='1.0' encoding='UTF-8'?>"
+ "<soap:Envelope "
+
"xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/'"
+ "xmlns:q0='http://hello.itso/'>"
+ "<soap:Body>"
+ "<q0:sayHello>"
+ "<arg0>Milo</arg0>"
+ "</q0:sayHello>"
+ "</soap:Body>"
+ "</soap:Envelope>";
// Invoke the HelloMessenger web service
Source soapRequest = new StreamSource(new
ByteArrayInputStream(request.getBytes()));
Source soapResponse = dispatch.invoke( soapRequest );
// Convert the response to a String
ByteArrayOutputStream baos = new ByteArrayOutputStream();
Transformer transformer =
TransformerFactory.newInstance().newTransformer();
transformer.transform(soapResponse, new StreamResult(baos));
String response = baos.toString();
// Print the SOAP response String
System.out.println(response);
}
}
当然了,proxy-client有两种类型 同步跟异步,我刚用的是一个同步的proxy-client的例子。关于异步的将在下一张中讲解。
分享到:
相关推荐
Web Service Proxy Wizard 是一个工具,它为Visual Studio 6.0的开发者提供了一种方法,可以将Web服务封装成一个代理组件(.dll),这个组件可以在设计时通过早期绑定(Early Binding)像其他COM组件一样使用。...
WinHTTP Web Proxy Auto-Discovery Service 服务处于 停止 状态还有,我的服务器没有使用WEB代理和防火墙客户端。
- **服务代理**:CXF提供了服务代理(Service Proxy)模式,通过代理对象调用服务接口就像调用本地方法一样。你可以使用`JaxWsProxyFactoryBean`来创建代理对象。 - **WS-Discovery**:CXF支持WS-Discovery协议,...
Top10 ProxyClient 使您可以: 1、通过代理服务器运行任何网络应用程序。对于软件不需要有什么特殊配置;整个过程是完全透明的。 2、可选择指定的进程进行上网,不影响未选择的进程,也可以强制所有网络连接,都通过...
Web,ftp,proxy服务集成软件,做网站,FTP上传和SOCK5代理首选的小软件!
ICS lab10 WebProxy 包含 proxy.c
Web Service通常由三部分组成:服务提供者(Service Provider)、服务代理(Service Proxy)和服务消费者(Service Consumer)。服务提供者实现服务并将其暴露给网络;服务代理作为客户端与服务提供者之间的中介,...
4. **在程序中建立soapconnection与Proxy并使用webservice methods**:最后一步是在实际代码中实现对Web Service的调用,通过soapconnection和Proxy对象与Web Service进行交互。 ### 结论 pb11在Web Service开发和...
Zap(Zed Attack Proxy)是一款开源的Web应用程序安全扫描工具,主要用于Web渗透测试。它由OWASP(开放网络应用安全项目)维护,是全球安全社区广泛认可的工具之一。Zap可以帮助开发者、安全测试人员以及对Web应用...
本文将详细介绍如何使用Apache Axis创建Web Service,并将重点介绍三种不同的方法:动态调用接口(Dynamic Invocation Interface,DII)、Stubs方式和动态代理(Dynamic Proxy)方式。 #### 二、环境搭建与配置 在...
赠送jar包:hadoop-yarn-server-web-proxy-2.6.0.jar; 赠送原API文档:hadoop-yarn-server-web-proxy-2.6.0-javadoc.jar; 赠送源代码:hadoop-yarn-server-web-proxy-2.6.0-sources.jar; 赠送Maven依赖信息文件:...
1. WSDL导入:PB11允许用户导入WSDL文件,自动生成相应的Proxy类,简化了Web Service的引用过程。 2. SOAP Wizard:PB11的SOAP向导可以帮助开发人员快速设置Web Service请求和响应,减少了手动编码的工作量。 3. Web...
- **OLE对象方式**:通过创建并使用MSSOAPLib库中的`SoapClient`对象,可以实现对Web Service的调用。这种方法适用于PB6.5及其他版本,且无需额外的库文件。 #### 3. 实例演示:使用MSSOAPLib库中的`SoapClient`...
web debug proxy portable 免安装
在本文中,我们将深入探讨如何使用 AXIS 在 Tomcat 6.0.26 上进行配置,并详细介绍三种部署和调用 Web Service 的方法:Dynamic Invocation Interface (DII)、Stubs 方式以及 Dynamic Proxy 方式。 首先,配置 AXIS...
IntroductionIn this article I will talk about connecting FTP clients through Proxy Server. So, reader of this article should have a background about the following topics:TCP/IP protocol and Socket ...
在Windows 8操作系统中,开发人员可以利用Web Service来实现应用程序与远程服务器之间的数据交互,增强应用的功能和用户体验。Web Service是一种基于XML的通信协议,它允许不同平台的应用程序通过互联网交换数据。在...
WebProxyServer.java SSD8 EX1