Web Service

    Yii提供CWebService和简化了在Web应用程序实现Web service。这些API以类形式实现,被称为service providers. Yii将为每个类产生一个WSDL,描述什么API有效和客户端怎么援引。当客户端援引API,Yii将实例化相应的service provider和调用被请求的API来完成请求。

    正如我们上文所述,service provider是一个类定义能被远程援引的方法。Yii依靠 and classreflection识别哪些方法可以被远程调用和他们的参数还有返回值。

    让我们以一个简单的股票报价服务开始。这项服务允许客户端请求指定股票的报价。我们确定service provider如下。请注意,我们定义扩展的提供类。这是不是必需的。马上我们将解释为什么这样做。

    在上面的,我们通过在文档注释中的@soap标签声明getPrice方法为一个Web service API。依靠文档注释指定输入的参数数据类型和返回值。其他的API可使用类似方式声明。

    2. Declaring Web Service Action(定义Web Service动作)

    这就是我们需要建立的Web service!如果我们尝试访问动作网址http://hostname/path/to/index.php?r=stock/quote ,我们将看到很多XML内容,这实际上是我们定义的Web service的WSDL描述。

    要完成这个例子,让我们创建一个客户端来消费我们刚刚创建的Web service。例子中的客户端用php编写的,但可以用别的语言编写,例如Java, C#, Flex等等。

    在网页中或控制台模式运行以上脚本,我们将看到的价格350

    4. Data Types(数据类型)

    当定义的方法和属性被远程访问,我们需要指定输入和输出参数的数据类型。以下的原始数据类型可以使用:

    • str/string: 对应 xsd:string;
    • int/integer: 对应 xsd:int;
    • float/double: 对应 xsd:float;
    • date: 对应 xsd:date;
    • time: 对应 xsd:time;
    • datetime: 对应 xsd:dateTime;
    • array: 对应 xsd:string;
    • mixed: 对应 xsd:anyType.
      如果类型不属于上述任何原始类型,它被看作是复合型组成的属性。复合型类型被看做类,他的属性当做类的公有成员变量,在文档注释中被用@soap标记。

    下面就是一个例子定义getPosts网页API,返回一个对象的数组。

    为了从客户端得到复合型参数,应用程序需要定义从WSDL类型到相应PHP类的映射。这是通过配置的属性classMap

    6. Intercepting Remote Method Invocation(拦截远程方法调用)

    通过实现IWebServiceProvider接口,sevice provider可以拦截远程方法调用。在 ,sevice provider可以获得当前CWebService实例和通过请求的方法的名字 。它可以返回假如果远程方法出于某种原因不应被援引(例如:未经授权的访问) 。