澳门新浦京手机版PHP5开发之WSDL,SOAP调用实现过程

豆蔻年华、底工概念

SOAP(Simple Object Access Protocol
)简单对象访谈左券是在疏散或分布式的遭逢中调换消息的简易的商业事务,是一个依照XML的协商,它总结两个部分:SOAP封装(envelop卡塔尔国,封装定义
了两个陈诉新闻中的内容是何等,是哪个人发送的,哪个人应该选用并管理它以至哪些管理它们的框架;SOAP编码准绳(encoding
rules),用于表示应用程序需求利用的数据类型的实例; SOAP RPC表示(RPC
representationState of Qatar,表示远程进度调用和应没有错签署;SOAP绑定(binding),使用底层左券交流新闻。

WSDL(Web Service Description Language)正是陈诉XML
Web服务的标准XML格式,WSDL由Ariba、英特尔、IBM和微软等开垦商提议。它用生龙活虎种和现实性语言毫无干系的虚幻方式定义了给定Web服务收发
的有关操作和消息。就其定义来讲,你还不可能把WSDL当做生龙活虎种对象接口定义语言,举例,CORBA或COM等应用程序类别结构就能够用到目的接口定义语言。
WSDL保持合同中立,但它实在内建了绑定SOAP的支撑,进而同SOAP创设了不可分割的关系。所以,当本身在此篇随笔中钻探WSDL的时候,我会假定你
把SOAP作为了你的报纸发表公约。

SOAP和WSDL即使是web
service的两大专门的职业,然而相互并未有必然的关联,都能够独自运用。它们之间的涉嫌就就像是HTTP和Html之间的涉及。后者是风流罗曼蒂克种合同,后者是对一个Web
Server的叙说。

Webservice

Webservice是使应用程序以与平台和编制程序语言非亲非故的主意举办相互通讯技术。

eg:站点提供访问的数量接口:和讯博客园、天猫商城。

合法表达:它是风姿洒脱种创设应用程序的附近模型,能够在此外扶助网络通讯的操作系统中实行运营;它是生龙活虎种新的web应用程序分支,是自包罗、自描述、模块化的利用,能够发表、定位、通过web调用。WebService是多少个运用组件,它逻辑性的为别的应用程序提供数据与服务.各应用程序通过网络契约和鲜明的一部分正规数量格式(Http,XML,SoapState of Qatar来做客WebService,通过WebService内部推行获得所需结果.Web
Service可以进行从轻易的乞请到复杂商务管理的其余功效。生龙活虎旦安排以往,其余WebService应用程序能够开采并调用它配备的劳动。

 澳门新浦京手机版 1

SOAP(Simple Object Access
Protocol):轻易对象访谈左券是在疏散或遍布式的情况中沟通音讯并推行长途进程调用的轻量级合同,是一个根据XML的契约。使用SOAP,不用思虑任何特定的传输协议(最常用的如故HTTP公约),能够允许任何项指标靶子或代码,在此外平台上,以其余大器晚成种语言相互通讯。

WSDL:Web 瑟维斯s Description
Language的缩写,是二个用来陈说Web服务和表明怎么样与Web服务通讯的XML语言。为顾客提供详细的接口表明书。

Axis:Axis本质上就是贰个SOAP引擎(Apache Axis is an implementation of
the
SAOP),提供创设服务名、客商端和网关SOAP操作的骨干框架。但是Axis并不完全部都以一个SOAP引擎,它还富含:

  • 是二个独立的SOAP服务器。
  • 是多少个放松权利Servlet引擎(eg:Tomcat)的服务器。
  • 支持WSDL。
  • 提供转账WSDL为Java类的工具。
  • 提供例子程序。
  • 提供TCP/IP数据包监视工具。

Axis有四种Service styles,分别是:

  • 澳门新浦京手机版,RPC(Remote Procedure Call
    Protocol远程访谈调用左券,铺排时归属私下认可选项)
  • Document
  • Wrapped
  • Message

WSDD(Web Service Deployment
Descriptor):Web服务分布描述,它定义了Web服务的接口,如服务名、提供的办法、方法的参数新闻。

UDDI(Universal Description,Discovery,and
Integration):统黄金时代描述、开掘和集成,用于集中存放和查找WSDL描述文件,起着目录服务器的效果与利益。

 澳门新浦京手机版 2

 

二、PHP5下的配置

在php的的安插文件php.ini中,找到

extension=php_soap.dll

然后将前方的;号去掉,然后重启web服务

WSDL元素

WSDL成分基于XML语法描述了与劳务举行互相的宗旨因素:

Type(新闻类型):数据类型定义的器皿,它利用某连串型系统(如XSD)。

Message(音讯):通讯数据的充饥画饼类型化定义,它由一个要么多少个part组成。

Part:新闻参数

Operation(操作卡塔尔:对服务所辅助的操作实行抽象描述,WSDL定义了三种操作:

  • 风流倜傥边(one-way):端点接受音信;
  • 须求-响应(request-response):端点选取新闻,然后发送有关音讯;
  • 供给-响应(solicit-response):端点发送新闻,然后选择有关音信;
  • 文告(notification):端点发送音信。

Port Type (端口类型):特定端口类型的具体磋商和数量格式标准。

Binding:特定端口类型的切实可行公约和多少格式标准

Port :定义为绑定和网络地址组合的单个端点。

Service:相关端口的集合,包涵其关系的接口、操作、新闻等。

 澳门新浦京手机版 3

如上类图表明了Service、Port、Binding、Operation、Message之间的依赖、关联、聚合、合成、泛化、实现,这里暂相当的少说,若感兴趣,请参见该小说

UML类图关系大全:

三、查询web service方法与参数、数据类型

某省邮电通讯公司的入单接口为

小编们运用SoapClient的__geunctions()和__getTypes(State of Qatar方法查看该接口的主意,参数和数据类型唯有__getFunctions中列出的接口才具被soap调用。

在根目录下开创代码soap.php

<?php
header("content-type:text/html;charset=utf-8");
try {
    $client = new SoapClient("http://***.******.com/services/AcceptedBusiness?wsdl");
    print_r($client->__getFunctions());
    print_r($client->__getTypes());  
} catch (SOAPFault $e) {
    print $e;
}
?>

在浏览器运营:

Array
(
    [0] => ArrayOf_xsd_anyType introduceAcceptedBusiness(string $c3, string $c4, string $linkman, string $linknum, string $num, string $idcard, string $remark, string $address)
    [1] => ArrayOf_xsd_anyType introduceAcceptedBusinessByAiZhuangWei(string $subname, string $linkphone, string $idcard, string $address, string $businesstype, string $marketcode, string $surveycode, string $commanager, string $commanagerphone, string $bendiwang, string $fenju, string $zhiju, string $remark)
    [2] => string introduceAcceptedBusinessByStandardInterface(string $xmlStr)
    [3] => string introduceAcceptedBusinessByCallOut(string $xmlStr)
    [4] => string introduceAcceptedBusinessByYddj(string $xmlParam)
    [5] => ArrayOf_xsd_anyType queryAcceptedBusinessByAiZhuangWei(string $surveycode, string $starttime, string $endtime)
    [6] => string queryCallOutOrderByConfig(string $xmlParam)
)
Array
(
    [0] => anyType ArrayOf_xsd_anyType[]
)

此中有个情势 introduceAcceptedBusinessByStandardInterface(string
$xmlStr卡塔尔,将是支付文书档案中涉及的要使用的接口,参数为xml字符串

其余一些接口中涉及有SoapHeader认证,那就须求参与__setSoapHeaders方法,具体可查看

WSDL伪代码

WSDL 文书档案是接收这一个根本的要向来说述有些 web service 的:

元素 定义

web service 实施的操作

<message> web service 使用的消息
<types> web service 使用的数据类型
<binding> web service 使用的通信协议
一个 WSDL 文档的主要结构是类似这样的:
<definitions>
<types>
definition of types........
</types>
<message>
definition of a message....
</message>
<portType>
definition of a port.......
</portType>
<binding>
definition of a binding....
</binding>
</definitions>

 

WSDL 文书档案可含蓄其余的要素,比如 extension 元素,以至叁个 service
成分,此成分可把多少个 web services 的定义组合在二个纯净的 WSDL 文书档案中

四、提交入单

这一步正是内需依照开荒文书档案拼接xml字符串,然后作为introduceAcceptedBusinessByStandardInterface的参数字传送入
始建acceptedbusiness.php,内容如下

<?php
header("content-type:text/html;charset=utf-8");
try {
    $client = new SoapClient('http://***.*******.com/services/AcceptedBusiness?wsdl');
    $xml = "
    <?xml version='1.0' encoding='UTF-8' ?>
    <PACKAGE>
      <C3>**电信</C3>
      <C4></C4>
      <LINKMAN>张三</LINKMAN>
      <LINKNUM>13412341234</LINKNUM>
      <LINKADDRESS>广东深圳</LINKADDRESS>
      <REMARK>iPhone 6</REMARK>
      <CHANNEL></CHANNEL>
      <GRIDCODE>1111111111111111111111111111111</GRIDCODE>
      <AGENTCODE>2111</AGENTCODE>
      <KEY>1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111</KEY>
    </PACKAGE>
  ";
    $return = $client->introduceAcceptedBusinessByStandardInterface($xml);
    print_r($return);
} catch (SOAPFault $e) {
    print_r('Exception:'.$e);
}
?>

在浏览器中试行后,重临

<?xml version="1.0" encoding="UTF-8"?>
<PACKAGE>
    <STATUS>0</STATUS>
    <REASON>入单成功!</REASON>
    <ORDERSEQ>2014100905523549742</ORDERSEQ>
</PACKAGE>

实践

为了产生明显的相比较,客商端用CS构造来创制顾客端。

实施之朝气蓬勃:创造服务端

创建ASP.NET Web服务

 澳门新浦京手机版 4

代码示例

using System;
using System.Linq;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Linq;

using DotNet.Model;
[WebService(Namespace = "http://tempuri.org/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
// 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。
// [System.Web.Script.Services.ScriptService]
public class Service : System.Web.Services.WebService
{
    public Service () {
        //如果使用设计的组件,请取消注释以下行
        //InitializeComponent();

    }
     [WebMethod(Description="获取字符串",MessageName="HelloWorld")]
    public string HelloWorld() {
        return "Hello World";
    }

    [WebMethod(Description="获取用户信息",MessageName="getCustomer")]
    public Customer getCustomer(Customer cus1)
    {
        return cus1;
    }

    [WebMethod(Description = "获取用户信息以参数形式", MessageName = "getCustomerFromParams")]
    public Customer getCustomerFromParams(int id, string name, string address)
    {
        Customer cus1 = new Customer();
        cus1.cus_id = id;
        cus1.cus_name = name;
        cus1.cus_address = address;
        return cus1;
    }

}

 

试行之二:创造顾客端

创建ASP.NET WEB客户端(以CS架构)

 澳门新浦京手机版 5

代码示例

 (当中风姿浪漫种方法经过创制“服务引用”的诀要,输入“

      private ServiceReference1.ServiceSoapClient myclient = new ServiceReference1.ServiceSoapClient();

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                /* 第一种方式可以传参、传实体,返回实体 */
                ServiceReference1.ServiceSoapClient myclient = new ServiceReference1.ServiceSoapClient();
                ServiceReference1.Customer tem = new ServiceReference1.Customer();
                tem.cus_id = int.Parse(textBox1.Text);
                tem.cus_name = textBox2.Text;
                tem.cus_address = textBox3.Text;
                string str = JsonHelper.Jso_ToJSON(myclient.getCustomer(tem));
                richTextBox1.Text = str;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            richTextBox1.Text = string.Empty;
            try
            {
                richTextBox1.Text = myclient.HelloWorld();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void button4_Click(object sender, EventArgs e)
        {
            try
            {
                /* 第二种方式可以传参,返回实体(不能传入一个对象实体,但是配置动态灵活) */
                string url = "http://localhost:3199/ServicePort/Service.asmx";
                string methodname = "getCustomerFromParams";

                object[] obj = new object[3];
                obj[0] = int.Parse(textBox1.Text);
                obj[1] = textBox2.Text;
                obj[2] = textBox3.Text;
                string str = JsonHelper.Jso_ToJSON(WebServiceHelper.InvokeWebService(url, methodname, obj));
                richTextBox1.Text = str;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void button5_Click(object sender, EventArgs e)
        {
            try
            {
                /* 第三种方式可以传参、传实体,返回XmlDom(配置动态灵活,响应处理麻烦了点而已) */
                string url = "http://localhost:3199/ServicePort/Service.asmx";
                string methodname = "getCustomer";
                Hashtable parm = new Hashtable();
                string objectName = "cus1";
                parm["cus_id"] = int.Parse(textBox1.Text);
                parm["cus_name"] = textBox2.Text;
                parm["cus_address"] = textBox3.Text;
                XmlDocument oo = WebServiceXmlHelper.QuerySoapWebServiceByObject(url, methodname, objectName, parm);
                richTextBox1.Text = oo.InnerXml;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

 

运作效果

服务端

 澳门新浦京手机版 6

 澳门新浦京手机版 7

WSDL

 澳门新浦京手机版 8

顾客端(扶助多平台,如服务器的Webservice用Java、.Net等)

第1种办法:传参、传实体,UEvoqueL配置远远不足灵活,数据管理灵活

 澳门新浦京手机版 9

第2种艺术:传参,不能够传实体,USportageL配置灵活, 数据管理要多少加工

 澳门新浦京手机版 10

第3种艺术:传参、传实体、UCR-VL配置灵活,数据管理要有个别加工

 澳门新浦京手机版 11

小结

  • 即使只传递参数,能够用HTTP来传递,Webservice提供的接口如下

HTTP POST

以下是 HTTP POST 央浼和响应示例。所显示的占位符需替换为实际值。

POST /ServicePort/Service.asmx/getCustomerFromParams HTTP/1.1
Host: localhost
Content-Type: application/x-www-form-urlencoded
Content-Length: length

id=string&name=string&address=string

 

回去采取串

HTTP/1.1 200 OK
Content-Type: text/xml; charset=utf-8
Content-Length: length
<?xml version="1.0" encoding="utf-8"?>
<Customer xmlns="http://tempuri.org/">
  <cus_id>int</cus_id>
  <cus_name>string</cus_name>
  <cus_address>string</cus_address>
</Customer>

 

 

  • 意气风发经是传递实体或传递参数,也得以运用SOAP来传递,Webservice提供的接口如下

    POST /ServicePort/Service.asmx HTTP/1.1
    Host: localhost
    Content-Type: application/soap+xml; charset=utf-8
    Content-Length: length


 

 

回到接收串:

HTTP/1.1 200 OK
Content-Type: application/soap+xml; charset=utf-8
Content-Length: length

<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
  <soap12:Body>
    <getCustomerFromParamsResponse xmlns="http://tempuri.org/">
      <getCustomerFromParamsResult>
        <cus_id>int</cus_id>
        <cus_name>string</cus_name>
        <cus_address>string</cus_address>
      </getCustomerFromParamsResult>
    </getCustomerFromParamsResponse>
  </soap12:Body>
</soap12:Envelope>

 

 WebService向外发表接口的效率,能够越来越好的为任何平台提供数据以至实际信息平台全体。

Word文书档案下载:浅淡Webservice、WSDL二种服务拜见的形式.doc

源代码下载:

参照他事他说加以考查网址:

 

 

发表评论

电子邮件地址不会被公开。 必填项已用*标注