当前最新的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的例子。关于异步的将在下一张中讲解。
分享到:
相关推荐
Variants Intermediate This example shows how the RemObjects SDK can transfer variants and array of variants from the client and server using the TROBinMessage and TROSOAPMessage message types.
PEP 3333: Python Web Server Gateway Interface v1.0.1 Other Language Changes New, Improved, and Deprecated Modules email elementtree functools itertools collections threading datetime and time ...
基于openocd开源工具实现的C#桌面应用工具
精品-2025人工智能神经网络基本原理解析.pdf
施耐德ATV312变频器通过MCGS RTU通讯实现双机监控与控制的触摸屏集成解决方案,无PLC的施耐德ATV312变频器通讯示例:触摸屏控制监控两台变频器,功能多且省成本,改进型可调整步长 P&O MPPT(二区MPPT复现),光储系统MPPT 直流负载供电的单级离网光伏系统中,降压转器将太阳能光伏阵列和直流负载连接起来,同时确保最大功率点跟踪(MPPT) 和电池充电控制的良好运行。 在MPPT方面,提出了一种改进的自适应步长扰动观测(P&O)方法,以达到不同天气条件下太阳能光伏阵列的实际最大功率点(MPP),同时减少稳态振荡和功率损耗。 此外,电池充电控制侧使用三级充电控制器 (TSCC) 为铅酸电池站充电。 ,改进型P&O; 复现二区MPPT; 光储系统MPPT; 最大功率点跟踪(MPPT); 步长扰动观测; 降压转换器; 太阳能光伏阵列; 电池充电控制; 三级充电控制器(TSCC); 铅酸电池站。,改进型P&O MPPT技术,光储系统高效能量管理
redis学习脑图笔记
大学生创业项目源码
Spring Boot企业员工管理系统(包含万字论文+MYSQL)
对应博客地址:https://blog.csdn.net/u011561335/article/details/146312389
相关文章:https://blog.csdn.net/liu_23yanfeng/article/details/146319189
从春晚看科技技术-陈雄 - 公开版本.pptx
在计算机上安装制造装备物联及生产管理ERP系统软件来发挥其高效地信息处理的作用,可以规范信息管理流程,让管理工作可以系统化和程序化,同时,制造装备物联及生产管理ERP系统的有效运用可以帮助管理人员准确快速地处理信息。 制造装备物联及生产管理ERP系统在对开发工具的选择上也很慎重,为了便于开发实现,选择的开发工具为Eclipse,选择的数据库工具为Mysql。以此搭建开发环境实现制造装备物联及生产管理ERP系统的功能。其中管理员管理用户,新闻公告。 制造装备物联及生产管理ERP系统是一款运用软件开发技术设计实现的应用系统,在信息处理上可以达到快速的目的,不管是针对数据添加,数据维护和统计,以及数据查询等处理要求,制造装备物联及生产管理ERP系统都可以轻松应对。 关键词:制造装备物联及生产管理ERP系统;SpringBoot框架,系统分析,数据库设计
传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,问卷信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广大用户的需求,因此就应运而生出相应的问卷调查系统。 本问卷调查系统分为管理员还有用户两个权限,管理员可以管理用户的基本信息内容,可以管理新闻资讯信息以及新闻资讯的租赁信息,能够与用户进行相互交流等操作,用户可以查看问卷信息,可以查看新闻资讯以及查看管理员回复信息等操作。 该问卷调查系统采用的是WEB应用程序开发中最受欢迎的B/S三层结构模式,使用占用空间小但功能齐全的MySQL数据库进行数据的存储操作,系统开发技术使用到了JSP技术。该问卷调查系统能够解决许多传统手工操作的难题,比如数据查询耽误时间长,数据管理步骤繁琐等问题。总的来说,问卷调查系统性能稳定,功能较全,投入运行使用性价比很高。 关键词:问卷调查系统;MySQL数据库;SSM技术
VID20250317191237.mp4
西门子S7-1511 PLC PID控制阀门开度与模拟量转换——博途WinCC监控画面程序实践,西门子S7-1511 PLC PID控制阀门开度与模拟量转换——博途WinCC监控画面程序实践,matlab验证码识别系统,基于数字图像处理实现。 经过对图像的预处理、二值化、区域剪裁、数字定位、模板匹配法识别数字。 有gui界面和测试图像数据集。 ,核心关键词:Matlab验证码识别系统; 数字图像处理; 图像预处理; 二值化; 区域剪裁; 数字定位; 模板匹配法识别; GUI界面; 测试图像数据集。,基于Matlab的数字图像处理验证码识别系统
内容概要:本文提供了详细的 VMware 虚拟机安装指南,涵盖软件选择(Pro 和 Player 版区别)、安装步骤(适用于 Windows 和 Linux 主机系统)、虚拟机创建以及操作系统安装指导。详细介绍了配置虚拟机的各项关键设置,如资源分配、硬件参数定制、安装 VMware Tools 提升虚拟机性能和稳定性。并且列出了快照、克隆等高级功能的具体应用,还包括共享文件夹配置和几种常见错误的排除解决方案。 适合人群:初次接触虚拟化的用户和对虚拟环境搭建有一定兴趣的技术爱好者。 使用场景及目标:帮助用户快速部署自己的虚拟机,并掌握虚拟环境中常见的配置技巧,能够针对具体应用场景灵活地调整虚拟机的相关参数,提高工作效率,满足测试、学习、开发的需求。 其他说明:提供了一些安装过程可能遇到的问题及对应解决方案,在创建和维护过程中给予指导性的意见来确保用户的使用体验尽可能顺畅无阻,并给出了部分性能优化建议。
Matlab开发初学者视频教程,零基础入门,非常适合初学者。
质子交换膜燃料电池(PEMFC)Simulink模型:静态与动态模型分析及参数计算,基于Simulink的质子交换膜燃料电池模型:静态和动态模拟,计算输出和效率,cst仿真超表面 极化复用 ,核心关键词: 1. CST仿真 2. 超表面 3. 极化复用 以上信息以分号隔开,即为“CST仿真;超表面;极化复用”。,CST仿真超表面极化复用技术
PEMFC的Simulink静态与动态模型:输出电压、功率、效率等多维度性能计算指南,质子交换膜燃料电池Simulink模型:涵盖静态与动态特性,全面计算输出性能与效率,附参考公式与文献指南,C#运动控制系统源码。 雷赛运动控制卡控制系统。 像高川控制卡、高川控制器、或者固高运动控制卡以及正运动控制器、正运动控制卡可以用这个框架,自己替一下库文件等代码就可以。 功能丰富,注释多,非常适合新手学习,也可以做框架。 ,核心关键词:C#运动控制系统源码; 雷赛运动控制卡控制系统; 高川控制卡/高川控制器/固高运动控制卡; 正运动控制器/正运动控制卡; 功能丰富; 注释多; 新手学习; 框架。,C#雷赛运动控制系统源码框架:通用控制卡编程指南