それに数時間費やした後、実際に SOAP サービスに WSO を使い始めるところまで近づいてきましたが、1 つの気がかりな側面に遭遇しました。
まずはサービスコード
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 に向かい、 に任意の何かを渡し、 にitem_name
5 のような数値を渡すとamount
、値 25 が得られます。amount EG NOT NegativeInteger に無効なものを渡そうとすると、WSO は整数にキャストし、getPrice の呼び出しは amount の値として 0 を受け取ります。
私が間違っている場合は訂正してください。ただし、無効な値がサービス コードに入らないようにすることが XSD のポイントではありませんか? 関数内の値をテストすることはできますが、ここで XSD を使用する意味は何ですか? SimpleTypes が検証されない場合に、要求に対してエラー応答を送信するように WSO を構成する方法はありますか?