0

在用了几个小时之后,我已经接近可以真正开始将 WSO 用于 SOAP 服务的地步了,但是我遇到了一个令人不安的方面。

首先关闭服务代码

class Order
{
    /** 
     * @var string
     */
    public $item_name;

    /** 
     * @var nonNegativeInteger
     */
    public $amount;

    public function calcPrice()
    {   
        return (float)($this->amount * 5); 
    }   
}

/**
 * Service function getPrice
 *
 * @param object Order $Order
 * @return double $price
 */
function getPrice(Order $Order)
{
    return $Order->calcPrice();
}

// create service in WSDL mode
$service = new WSService(
        array(
            'bindingStyle' => 'rpc',
            'opParams' => array('getPrice' => 'MIXED'),

            // define the actions => operations map
            "actions" => array(
                "http://wsf.local/wsdl_generation/hacked_service.php/getPrice"
                    => "getPrice"),

            // define the class map
            "classmap" => array("Order" => "Order"),

            // define the operations map
            "operations" => array("getPrice" => "getPrice")));

// process client requests and reply 
$service->reply();

太好了,我可以输入提示 Order 类!让我们来看看 WSDL;WSDL 是使用该service_name.php?wsdl方法生成的,因此 WSO 是从上面的服务代码中生成的。

<xsd:complexType name="Order">
<xsd:sequence>
<xsd:element name="item_name" type="xsd:string"/>
<xsd:element name="amount" type="xsd:nonNegativeInteger"/>
</xsd:sequence>
</xsd:complexType>

现在看,还有更多好消息;我们对通过服务允许 Order 对象的值有一些严格的要求。

所以当我最终拿到这个并前往 SoapUI 进行测试时,通过任意的 foritem_name和一个像 5 for 的数字amount,输出值 25,太棒了。当我尝试传递对金额无效的 EG 而不是 nonNegativeInteger 时,WSO 强制转换为整数,并且对 getPrice 的调用接收到金额值为 0!

如果我错了,请纠正我,但这不是 XSD 的重点,以防止无效值进入服务代码吗?我可以测试函数内部的值,但是在这里使用 XSD 有什么意义呢?当 SimpleTypes 不验证时,有没有办法配置 WSO 为请求发送错误响应?

4

0 回答 0