如何使用PHP实现一个WebService

WSDL


WSDL(网络服务描述语言,Web
Services Description Language)是一门基于 XML 的语言,用于描述 Web Services
以及如何对它们进行访问。这种文档可描述某个 Web service。它可规定服务的位置,以及此服务提供的操作(或方法)。

一个
WSDL 文档的主要结构是类似这样的:

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

<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 文档中。

PHP生成WSDL

类代码(SoapDiscovery.class.php):


<?php
class SoapDiscovery {
private $class_name = ‘‘;
private $service_name = ‘‘;

/**
* SoapDiscovery::__construct() SoapDiscovery class Constructor.
*
* @param string $class_name
* @param string $service_name
**/
public function __construct($class_name = ‘‘, $service_name = ‘‘) {
$this->class_name = $class_name;
$this->service_name = $service_name;
}

/**
* SoapDiscovery::getWSDL() Returns the WSDL of a class if the class is instantiable.
*
* @return string
**/
public function getWSDL() {
if (empty($this->service_name)) {
throw new Exception(‘No service name.‘);
}
$headerWSDL = "<?xml version="1.0" ?>n";
$headerWSDL.= "<definitions name="$this->service_name" targetNamespace="urn:$this->service_name" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="urn:$this->service_name" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns="http://schemas.xmlsoap.org/wsdl/">n";
$headerWSDL.= "<types xmlns="http://schemas.xmlsoap.org/wsdl/" />n";

if (empty($this->class_name)) {
throw new Exception(‘No class name.‘);
}

$class = new ReflectionClass($this->class_name);

if (!$class->isInstantiable()) {
throw new Exception(‘Class is not instantiable.‘);
}

$methods = $class->getMethods();

$portTypeWSDL = ‘<portType name="‘.$this->service_name.‘Port">‘;
$bindingWSDL = ‘<binding name="‘.$this->service_name.‘Binding" type="tns:‘.$this->service_name."Port">n<soap:binding style="rpc" transport="http://schemas.xmlsoap.org/soap/http" />n";
$serviceWSDL = ‘<service name="‘.$this->service_name."">n<documentation />n<port name="".$this->service_name.‘Port" binding="tns:‘.$this->service_name."Binding"><soap:address location="http://".$_SERVER[‘SERVER_NAME‘].‘:‘.$_SERVER[‘SERVER_PORT‘].$_SERVER[‘PHP_SELF‘]."" />n</port>n</service>n";
$messageWSDL = ‘‘;
foreach ($methods as $method) {
if ($method->isPublic() && !$method->isConstructor()) {
$portTypeWSDL.= ‘<operation name="‘.$method->getName()."">n".‘<input message="tns:‘.$method->getName()."Request" />n<output message="tns:".$method->getName()."Response" />n</operation>n";
$bindingWSDL.= ‘<operation name="‘.$method->getName()."">n".‘<soap:operation soapAction="urn:‘.$this->service_name.‘#‘.$this->class_name.‘#‘.$method->getName()."" />n<input><soap:body use="encoded" namespace="urn:$this->service_name" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />n</input>n<output>n<soap:body use="encoded" namespace="urn:$this->service_name" encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" />n</output>n</operation>n";
$messageWSDL.= ‘<message name="‘.$method->getName()."Request">n";
$parameters = $method->getParameters();
foreach ($parameters as $parameter) {
$messageWSDL.= ‘<part name="‘.$parameter->getName()."" type="xsd:string" />n";
}
$messageWSDL.= "</message>n";
$messageWSDL.= ‘<message name="‘.$method->getName()."Response">n";
$messageWSDL.= ‘<part name="‘.$method->getName()."" type="xsd:string" />n";
$messageWSDL.= "</message>n";
}
}
$portTypeWSDL.= "</portType>n";
$bindingWSDL.= "</binding>n";
return sprintf(‘%s%s%s%s%s%s‘, $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, ‘</definitions>‘);
}

/**
* SoapDiscovery::getDiscovery() Returns discovery of WSDL.
*
* @return string
**/
public function getDiscovery() {
return "<?xml version="1.0" ?>n<disco:discovery xmlns:disco="http://schemas.xmlsoap.org/disco/" xmlns:scl="http://schemas.xmlsoap.org/disco/scl/">n<scl:contractRef ref="http://".$_SERVER[‘SERVER_NAME‘].‘:‘.$_SERVER[‘SERVER_PORT‘].$_SERVER[‘PHP_SELF‘]."?wsdl" />n</disco:discovery>";
}
}

?>

使用方法(服务端server.php):

?





1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

<?php

define(‘WSDL_URL‘,‘hello.wsdl‘);        //定义WSDL文件路径

ini_set(‘soap.wsdl_cache_enabled‘,‘0‘);    //关闭WSDL缓存

 

//WSDL文件不存在时自动创建

if(!file_exists(WSDL_URL))

{

    require_once
‘SoapDiscovery.class.php‘;

    $disco
= new SoapDiscovery(‘HelloWorld‘,‘IELIWB_HelloWorld‘);

    $str
= $disco->getWSDL();

    file_put_contents(WSDL_URL,$str);

}

 

//SOAP开启并接收Client传入的参数响应

$server
= new SoapServer(WSDL_URL);

$server->setClass(‘HelloWorld‘);

$server->handle();

 

 

//测试定义公开的类

class HelloWorld {

    private
$nombre = ‘‘;

    public
function __construct($name
= ‘World‘) {$this->name = $name;}

    public
function greet($name
= ‘‘) {$name
= $name?$name:$this->name;return
‘Hello ‘.$name.‘.‘;}

    public
function serverTimestamp() {return
time();}

}

?>

客户端client.php:

?





1

2

3

4

5

6

7

8

9

10

11

12

<?php

$client
= new SoapClient("http://127.0.0.1/createsoap/hello.wsdl");

 

try
{

        $result
= $client->greet(‘ieliwb‘);

        var_dump($result);

        echo
"The answer isresult";

}

catch (SoapFault $f){

        echo
"Error Message: {$f->getMessage()}";

}

?>

创建
Webservice


1.
创建wsdl

  • 非标准的webservice,可能只能PHP才能访问

  • 标准的webservice,就必须要使用wsdl(webservice
    description language,就是用XML语法标准来描述你的服务内容,我是这么理解的)

在这里我只介绍标准的webservice。那么如何创建wsdl呢?对于PHP来说这确实是件很不容易的事情,有人说用zend
studio创建很方便,这是一种方法。但对于那些不喜欢用zend studio的人来说,会觉得创建一个webservice还要安装zend
studio,太强人所难了,我就是,嘿嘿。

在这里我介绍一个简单的方法,到网上下载SoapDiscovery.class.php类,里面有个公用方法:getWSDL,这个方法末尾是用的return,那么,你修改一下这个方法,我是这么做的:

?





1

2

3

4

//return sprintf(‘%s%s%s%s%s%s‘, $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, ‘</definitions>‘);

//生成wsdl文件,将上面的return注释

$fso = fopen($this->class_name . ".wsdl"
, "w");

fwrite($fso, sprintf(‘%s%s%s%s%s%s‘, $headerWSDL, $portTypeWSDL, $bindingWSDL, $serviceWSDL, $messageWSDL, ‘</definitions>‘));

现在生成wsdl的类有了,SoapDiscovery.class.php。

我只要再准备一个提供服务的类或者函数就可以创建wsdl了。比如我有个类:person,文件名为:person.class.php★,里面有两个方法,一个是say,一个是run。很简单。

?





1

2

3

4

5

6

7

8

9

10

11

12

13

<?php

    class
person

    {

        public
function say()

        {

            return("i‘m speaking.");

        }

        public
function run()

        {

            return("i‘m running,don‘t disturb me please.");

        }

    }

?>

到这里有两个类了:SoapDiscovery.class.php和person.class.php。

开始正式生成wsdl:创建文件server.php。将以下内容拷贝进去,运行即可生成一个person.wsdl文件


<?php
include("person.class.php");
include("SoapDiscovery.class.php");

//第一个参数是类名(生成的wsdl文件就是以它来命名的),即person类,第二个参数是服务的名字(这个可以随便写)。
$disco = new SoapDiscovery(‘person‘,‘Person‘);
$disco->getWSDL();
?>

2.
创建webservice服务端程序

将server.php文件的内容清空,复制以下代码进去:


<?php
include("person.class.php");
$objSoapServer = new SoapServer("person.wsdl");//person.wsdl是刚创建的wsdl文件
//$objSoapServer = new SoapServer("server.php?wsdl");//这样也行
$objSoapServer->setClass("person");//注册person类的所有方法
$objSoapServer->handle();//处理请求
?>

3.
创建webservice客户端程序,测试webservice是否有效,文件名是:client.php


<?php
$client = new SoapClient("person.wsdl");
//$client = new SoapClient("server.php?wsdl");//这样也行
echo($client->say());
echo "<br />";
echo($client->run());
echo "<br />";
?>

OK,结束。.NET如果要使用的话,你只要提供一个url给他就行了。

获得url的方法:你可以先到person.wsdl文件里面查找<soap:address
location="http://xxxxxxxxxxxxxxxxxxxx/server.php"
/>,这里的url(具体url是根据你的目录确定的)就是你要提供给.NET开发人员使用的。不过别高兴太早,后面要加:“?wsdl”,http://xxxxxxxxxxxxxxxxxxxx/server.php?wsdl这样才是对的,不信你可以将url拷贝到浏览器的地址栏里看下就知道了。

.NET开发人员获得你给他的url之后,就可以在自己的项目里面添加一个服务引用或者web引用了,然后就可以根据提示完成相关操作,对于使用.NET的开发人员来说很简单的。

如何使用PHP实现一个WebService,码迷,mamicode.com

时间: 2024-10-13 10:37:41

如何使用PHP实现一个WebService的相关文章

自定义及发布一个webservice服务

自定义及发布一个webservice服务    - 声明 某个业务服务为webservice服务       通过@webservice 注解来声明    - 发布webservice服务       Endpoint.publish()发布 (默认对public修饰的方法进行发布)    - 通过wsimport生成本地代理来访问自己发布的webservice       wsimport 1.发布自定义webservice phone.java package ws.myWebService

WCF学习笔记 -- 如何用C#开发一个WebService

假设所有工程的命名空间是demo. 新建一个C#的ClassLibrary(类库)工程. 在工程引用中加入System.ServiceModel引用. 定义接口,你可以删除自动生成的代码,或者直接修改代码来添加接口. [ServiceContract] Interface IMath { [Operationcontract] Int add (int a, int b); } 实现接口 添加一个新类,如Math实现该接口. Public class Math : IMath{ Int add(

【Web学习日记】——在IIS上发布一个WebService

没有开发过程,只是发布过程 一.前提 开发使用的是VS2013 从来没有做过Web的发布,在网上找例子,看到的总是与自己的情况不相符,而且也有人提出了VS2013发布网站的问题,但解决方案却很少,好不容易找到一个,一定要记下来,方便以后查阅. 要把一个WebService发布到IIS,首先要安装IIS,网络上有很多安装IIS的教程,不再重复:第二步就是使用VS发布WebService:第三步就是在IIS上创建网站. 二.用VS2013发布WebService 用VS2013开发完成之后,在Web

java中发布一个webService服务到服务器

Java在编码完成webService服务端后,可以通过运行一个main方法来发布webService服务,但是实际将服务部署到服务器上后,肯定不能还运行main方法,所以我们需要在启动服务器的时候就发布服务.并且在服务器的生命周期内一直运行. main方法发布服务(可用于测试类) public static void main(String[] args) { Endpoint.publish("http://172.18.100.52:9090/medical", new Medi

(转)一个webservice的小demo

.net平台内建了对Web Service的支持,包括Web Service的构建和使用.与其它开发平台不同,使用.net平台,你不需要其他的工具或者SDK就可以完成Web Service的开发了..net Framework本身就全面支持Web Service,包括服务器端的请求处理器和对客户端发送和接受SOAP消息的支持.下来我们就一步一步的用Microsoft Visual Studio .net 2005(后面简称VS.Net 2005)创建和使用一个简单的Web Service. we

利用MyEclipse开发一个webservice接口

一直以来对于接口这个东西都很好奇,各种客户也一直在说那个什么什么数据我们提供给你们一个接口就好了,结果还是不是很明白.于是乎就有了下面的小故事,接下来我们就进入正文吧 ---大概可以分为这样的步骤 1:新建webservice project,Framework版本选择JAX-WS 2:编写测试类,写一个简单的AddUser方法 3:在webservice project 上面 new webservice 确定后,在project和接口主类同一目录会生成一个Delegate.Java 4:加入

如何写一个webService接口

第一次写接口的时候,感觉太过笼统,压根不知道接口是个什么东东,,后来自己也查了好多资料,才发现其实接口可以就认为是一个方法,自己多写几种以后就会发现挺简单的,自己整理了一下资料,纯属增强自己的记忆,也方便更多像我这样的菜鸟们参考... 下面是我自己写的一个案例,用来同步文件用的这里我用的流,也可以用mutipartfile: 1.调用接口方法: package com.weichai.test; import org.apache.cxf.endpoint.Client;import org.a

根据wsdl生成一个webservice 的.cs文件

webservice的调用方式有两种: 1. 直接在vs ide中通过web引用的方式,将发布于某个位置的web服务引进到工程里面.这种方式基本上会用vs.net的人都会.  2. 通过vs 命令提示窗口,命令编译的方式,实现服务代理类(*.cs)及动态库(*.dll)文件的生成,然后在vs中通过引用的方式将生成的文件包括到工程中. 具体方法:  打开Microsoft Visual Studio 2005->Visual Studio Tools->Visual Studio 2005 命令

如何用nodejs创建一个webservice

Posted on March 25th, 2012 under Express.js, Node.jsTags: Express.js, git, GitHub, node.js Looking for a good tutorial on Express.js to help you get quickly productive in it? You have come to the right place. This tutorial is for Express 3, the curre