2

我正在尝试创建一个简单的 php Soap 服务器。

问题是虽然我在 wsdl 文件中设置了特定的参数类型,但在我的情况下我设置了整数,我可以从 php 使用另一种参数类型(字符串、数组、关联数组)进行方法调用。

理论上,如果php参数类型和wsdl参数类型不一样应该不会报错吧?就我而言,如果我在服务器上用数组调用函数,我得到数组,我在服务器上用字符串调用相同的函数,我得到字符串等。

我如何编辑下面的代码,使我的方法“doMyBookSearch”只接受在 wsdl 上声明的整数。

客户代码:

    try{
  $sClient = new SoapClient('sample.wsdl',array('trace'=>true));
    print_r($sClient->doMyBookSearch('test'));  //I call the function with a string, and not integer as WSDL
} catch(SoapFault $e){
var_dump($e);
}

服务器代码:

$server = new SoapServer("sample.wsdl");

function doMyBookSearch($yourName){
  return 'Works'; //return string
}

WSDL:

    <types>
    <xsd:schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="urn:MyBookSearch">
        <xsd:element  name="bookTitle">
            <xsd:simpleType>
                <xsd:restriction base="xsd:integer">
                    <xsd:minInclusive value="0"/>
                    <xsd:maxInclusive value="120"/>
                </xsd:restriction>
            </xsd:simpleType>
        </xsd:element>
    </xsd:schema>   
</types>

<message name="doMyBookSearch">
    <part name="bookTitle" type="tns:bookTitle" />
</message>

<message name="doMyBookSearchResponse">
    <part name="return" type="xsd:string" />
</message>  

<portType name="MyBookSearchPort">
    <operation name="doMyBookSearch">
        <input message="tns:doMyBookSearch" />
        <output message="tns:doMyBookSearchResponse" />
    </operation>
</portType>
4

1 回答 1

1

在这种情况下,PHP 并不真正关心类型。根据我对 SOAP 和 PHP 的经验,所有变量都作为字符串发送/接收,并且不遵守 WSDL 文件的限制。

一种解决方法是自己在 doMyBookSearch() 函数中进行检查,并在需要时抛出错误。

于 2013-04-01T13:27:35.863 回答