在用了几个小时之后,我已经接近可以真正开始将 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 为请求发送错误响应?