WebService SOAP WSDL UDDI 使用php的curl、PHP5的SoapClient实现同步
一、基本名词
WebService:
WebService是一种跨编程语言和跨操作系统平台的远程调用技术。不同系统,不同语言的数据交换方法都是不同的,这就导致在不同系统,不同语言之间传递数据很麻烦,基于此,WebService出现了。SOAP、WSDL和UDDI构成WebService平台的基础。
SOAP(Simple Object Access Protocol):
要想传递数据,首先我们要统一数据的格式,这样大家按照同一个规范了才能保证数据格式统一,不会错乱。SOAP是基于xml定义的轻量级协议。
WSDL(Web Services Description Language):
WSDL文件用于告诉使用者数据的具体格式、数据参数、服务地址、可用函数等,解析wsdl文件就知道对方提供的服务内容。推荐软件soapui解析wsdl文件。
UDDI(Universal Description, Discovery and Integration):
统一描述、发现和集成,用于集中存放和查找WSDL描述文件,起着目录服务器,分享服务的作用。
虽然都是一些新的概念,但其实WebService都是基于一些旧有的技术,所以当了解原理后,就可以用原有的技术实现同样的功能。
二、php实现同步
由于这部分只涉及到同步,所有使用curl就能完成。以下就是代码:
只需要在http的头域中添加相应的方法,并用xml传递数据。依照同理,其他语言同样可以实现。关于方法和xml格式建议使用soapui解析wsdl文件获得。


private function http_request_xml($url,$data = null,$arr_header = null){
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
// curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE);
// curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE);
if (!empty($data)){
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
}
if(!empty($arr_header)){
curl_setopt($curl, CURLOPT_HTTPHEADER, $arr_header);
}
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
$output = curl_exec($curl);
curl_close($curl);
return $output;
}
$xml = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns:app=\"http://siebel.com/Voucher/Apply\">
<soapenv:Header/>
<soapenv:Body>
<app:VoucherApply_Input>
<app:count>1</app:count>
<app:memberNumber>".$mem."</app:memberNumber>
</app:VoucherApply_Input>
</soapenv:Body>
</soapenv:Envelope>";
$arr_header[] = "Content-type: text/xml"; //使用xml格式传递
$arr_header[] = "SOAPAction:\"document/http://siebel.com/Voucher/Apply:VoucherApply\""; //添加swdl的方法
$res = $this->http_request_xml($url, $xml, $arr_header);
if(strstr($res,"<ns:flag>S</ns:flag>")){
}
PHP5下方法
1、在php的的配置文件php.ini中,找到
extension=php_soap.dll
去掉;号,重启。
2、获取方法和参数:
<?php
header("content-type:text/html;charset=utf-8");
try {
$client = new SoapClient("http://***.******.com/services?wsdl");
print_r($client->__getFunctions());
print_r($client->__getTypes());
} catch (SOAPFault $e) {
print $e;
}
?>
3、带参数访问:
<?php
header("content-type:text/html;charset=utf-8");
try {
$client = new SoapClient('http://***.*******.com/services?wsdl');
$xml = "<?xml version='1.0' encoding='UTF-8' ?>";
$return = $client->function($xml);
print_r($res);
} catch (SOAPFault $e) {
print_r('Exception:'.$e);
}
?>
三、WSDL详解
直接打开wsdl文件如下:
<?xml version="1.0" encoding="utf-8"?> <definitions xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:xsdLocal1="http://www.siebel.com/xml/TESITOSynTxn" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:tns="http://siebel.com/Transaction" targetNamespace="http://siebel.com/Transaction"> // 所有的WSDL文档的根元素均是definitions元素。该元素封装了整个文档。
<types> // web service使用的数据类型,types元素用作一个容器,用于定义XML模式内置类型中没有描述的各种数据类型。
<xsd:schema elementFormDefault="qualified" attributeFormDefault="unqualified" targetNamespace="http://www.siebel.com/xml/TESITOSynTxn"> // xsd根元素
<xsd:annotation>
<xsd:documentation>Copyright (C) 2001-2004</xsd:documentation>
</xsd:annotation>
<xsd:element name="ListOfLoyTransaction" type="xsdLocal1:ListOfLoyTransaction"/> //定义一个数据类型 <xsd:complexType name="ListOfLoyTransactionTopElmt">
<xsd:sequence>
<xsd:element name="ListOfLoyTransaction" maxOccurs="1" minOccurs="1" type="xsdLocal1:ListOfLoyTransaction"/> //定义一个子数据类型
</xsd:sequence>
</xsd:complexType> <xsd:complexType name="ListOfLoyTransaction">
<xsd:sequence>
<xsd:element name="Transaction" maxOccurs="unbounded" minOccurs="0" type="xsdLocal1:LOYTransaction"/>
</xsd:sequence>
</xsd:complexType> <xsd:complexType name="Transaction"> // 父元素
<xsd:sequence> // 表示子元素依次出现顺序
<xsd:element name="RedMark" maxOccurs="1" minOccurs="0" type="xsd:string"/> // maxOccurs最多数量 minOccurs最少数量,实现参数的可选
<xsd:element name="ProdCode" maxOccurs="1" minOccurs="0" type="xsd:string"/>
<xsd:element name="OrderType" maxOccurs="1" minOccurs="0" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType> </xsd:schema> <xsd:schema elementFormDefault="qualified" attributeFormDefault="unqualified" targetNamespace="http://siebel.com/Transaction">
<xsd:import namespace="http://www.siebel.com/xml/SynTxn"/> // import元素使得可以在当前的WSDL文档中使用其他WSDL文档中指定的命名空间中的定义元素。 <xsd:element name="Txn_Input">
<xsd:complexType>
<xsd:sequence>
<xsd:element ref="xsdLocal1:ListOfLoyTransaction"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element> <xsd:element name="Txn_Output">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="ErrorFlag" type="xsd:string"/>
<xsd:element name="ErrorMessage" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element> </xsd:schema>
</types> <message name="Txn_Input"> //web service 使用的消息
<part name="Txn_Input" element="tns:Txn_Input"/>
</message>
<message name="Txn_Output"> //web service 使用的消息
<part name="Txn_Output" element="tns:Txn_Output"/>
</message> <portType name="spcSyn_spcTransaction_spcWorkflow"> // portType元素定义了Web服务的抽象接口。portType元素是由binding和service元素来实现的,
<operation name="Txn">
<input message="tns:Txn_Input"/>
<output message="tns:Txn_Output"/>
</operation>
</portType> <binding name="spcSyn_spcTransaction_spcWorkflow" type="tns:spcSyn_spcTransaction_spcWorkflow"> //web service 使用的通信协议,将一个抽象portType映射到一组具体协议(SOAO和HTTP)、消息传递样式、编码样式。
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="Txn">
<soap:operation soapAction="document/http://siebel.com/Transaction:Txn"/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding> <service name="SynTransaction"> // service元素包含一个或者多个port元素,其中每个port元素表示一个不同的Web服务。
<port binding="tns:spcSyn_spcTransaction_spcWorkflow" name="spcSyn_spcTransaction_spcWorkflow">
<soap:address location="http://172.19.100.88/aaaa/bbbb/cccc"/>
</port>
</service> </definitions>
(PHP)用cURL调用WebService获取天气信息
<?php
/**
* 用cURL调用WebService获取天气信息
* User: Ollydebug
* Date: 2015/11/11
* Time: 19:44
*/ //在WeatherWs的服务器上,默认大连城市的 theCityCode = 864 $data = 'theCityCode=864&theUserID=';
$curlobj = curl_init(); curl_setopt($curlobj,CURLOPT_URL,"http://www.webxml.com.cn/WebServices/WeatherWS.asmx/getWeather");
curl_setopt($curlobj,CURLOPT_HEADER,0);
curl_setopt($curlobj,CURLOPT_RETURNTRANSFER,1);
curl_setopt($curlobj,CURLOPT_POST,1);
curl_setopt($curlobj,CURLOPT_POSTFIELDS,$data);
curl_setopt($curlobj,CURLOPT_HTTPHEADER,array("application/x-www-form-urlencoded;charset=utf-8;","Content-length: ".strlen($data)));
curl_setopt($curlobj, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/42.0.2311.152 Safari/537.36'); $rtn = curl_exec($curlobj);
if(!curl_errno($curlobj)){
echo $rtn;
}else{
echo 'Curl error: '.curl_errno($curlobj);
}
curl_close($curlobj); ?>
WebService SOAP WSDL UDDI 使用php的curl、PHP5的SoapClient实现同步的更多相关文章
- webservice SOAP WSDL UDDI简介
WebServices简介 先给出一个概念 SOA ,即Service Oriented Architecture ,中文一般理解为面向服务的架构, 既然说是一种架构的话,所以一般认为 SOA 是包含 ...
- [Java] webservice soap,wsdl 例子
java 调用webservice的各种方法总结 现在webservice加xml技术已经逐渐成熟,但要真正要用起来还需时日!! 由于毕业设计缘故,我看了很多关于webservice方面的知识,今天和 ...
- 学习 WebService 第一步:体系结构、三元素SOAP/WSDL/UDDI
原文地址:爱军的博客——WebService简介 一.为什么需要Web Service 笔记: WebService 可以实现 跨(硬件.服务器.开发工具.平台.应用程序.程序语言……)共享数据和应用 ...
- WebService三大基本元素 SOAP WSDL UDDI
转自:https://blog.csdn.net/hhooong/article/details/51763128 1.SOAP 即 Simple Object AccessProtocol 也就是简 ...
- 彻底理解webservice SOAP WSDL
WebServices简介 先给出一个概念 SOA ,即Service Oriented Architecture ,中文一般理解为面向服务的架构, 既然说是一种架构的话,所以一般认为 SOA 是包含 ...
- 理解WebService SOAP WSDL
WebServices简介 先给出一个概念 SOA ,即Service Oriented Architecture ,中文一般理解为面向服务的架构, 既然说是一种架构的话,所以一般认为 SOA 是包含 ...
- 【🉐】 彻底理解webservice SOAP WSDL
原文: http://wenku.baidu.com/view/f87b55f19e31433239689314.html WebServices简介 先给出一个概念 SOA ,即Service Or ...
- webservice soap wsdl简介
先给出一个概念 SOA ,即Service Oriented Architecture ,中文一般理解为面向服务的架构, 既然说是一种架构的话,所以一般认为 SOA 是包含了运行环境,编程模型, 架构 ...
- (文摘)彻底理解webservice SOAP WSDL
WebServices特点介绍 WebServices 提供一个建立分布式应用的平台,使得运行在不同操作系统和不同设备上的软件,或者是用不同的程序语言和不同厂商的软件开发工具开发的软件,所有可能的已开 ...
随机推荐
- Jquery学习笔记(8)--京东导航菜单(2)增加弹框
京东导航,添加中间的弹框栏,使用position定位,放在左侧栏的li标签里面,成为一个整体,保证鼠标在弹框里的时候,弹框不消失: <!DOCTYPE html> <html lan ...
- Jenkins ssh 部署war到tomcat 虚拟目录
1>完成Jenkins服务环境的搭建,此处不再详述,不会的童鞋可参考下面的博客 http://www.cnblogs.com/zz0412/tag/jenkins/ 2>安装Publish ...
- Practial Vim 学习笔记一
. 号作用是重复上一个动作. >+G 缩进 j 光标下移 u 撤销操作 $ 光标移到行尾 x 删除光标下的字符 dd 删除整行 i 切换到Insert模式 Esc 返回 f 将光标移到下个字符 ...
- Linux高频指令总结
作为一个计算机专业的科班,不会玩Linux怎么能行呢?玩Linux用可视化界面显得太low了,为了效(zhuang)率(bi),当然要用什么都用指令啊,可是指令太多了啊,现在就把平时遇到的高频的指令做 ...
- usb 安装系统
写在前面 本文是先安装windows再安装linux,并通过windows引导linux的启动项.这样方便linux的反复重装.折腾等. 光盘安装和U盘安装基本差不多,只是U盘安装多了把镜像文件写到U ...
- Installing scipy on redhat with error “no lapack/blas resources found”
这是更新scipy出现的结果,需要新版本的scipy,而机器上只装了0.7的版本,更新的时候报错,找到了一个解决方法: wget http://mirror.centos.org/centos/6/o ...
- HTML基本元素的运用
段落相关标签<p><br><hr> 格式化相关标签<small><sub><sup><pre> 列表相关标签< ...
- GZipStream
命名空间: System.IO.Compression 说明: 此类表示 GZip 数据格式,它使用无损压缩和解压缩文件的行业标准算法.这种格式包括一个检测数据损坏的循环冗余校验值.GZip 数据格式 ...
- 【vijos】1768 顺序对的值(特殊的技巧)
https://vijos.org/p/1768 之前不知道为什么,我yy了一个n^2的做法,但是没能写出来..sad 然后看了题解才发现这题好神.. 为什么一定要照着题意找两个点然后算呢?这就是问题 ...
- 复合文档(Compound Document)读写栗子
复合文件是把磁盘文件系统的管理方式移植到文件中---复合文件. 复合文档是由 Windows 系统通过 COM 提供的, 它能完成像 Windows 目录结构一样复杂的文件结构的存取:提示一下 Win ...