1

tl; dr:SOAPリクエストへの応答として複数の文字列を送信します。

私はSOAPを初めて使用します。私はSOAPを介してリクエストを処理する簡単なWebサービスを作成しました。これをPHPで実装したかったので、NuSOAPライブラリを使用しました。SOAPAPI設計の仕様は次のとおりです。

リクエストフォーマット:

<?xml version="1.0" encoding="utf-8"?> 
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:q0="http://www.sandeepraju.in/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
<soapenv:Body> 
<q0:getData> 
<token>String</token> 
</q0:getData> 
</soapenv:Body> 
</soapenv:Envelope>

例/サンプルの回答:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns2:getDataResponse xmlns:ns2="http://www.sandeepraju.in/">
<return>
<Data>
   <animal>cat</animal>
   <phone>225</phone>
   <code>FYI</code>
</Data>

上記の仕様のために私が書いたPHPコードは次のとおりです。

require_once("../nusoap_old/lib/nusoap.php");

// Definition of getData operation
function getData($token) {
    if($token == "somestring") {
        return array("animal" => "cat", "phone" => "225", "code" => "FYI");
    }
    else {
        return array("animal" => "null", "phone" => "null", "code" => "null");
    }  
}

// Creating SOAP server Object
$server = new soap_server();

// Setup WSDL
$server->configureWSDL('catnews', 'urn:catinfo');

$server->wsdl->addComplexType('return_array_php',
    'complexType',
    'struct',
    'all',
    '',
    array(
    'animal' => array('animal' => 'animal', 'type' => 'xsd:string'),
    'phone' => array('phone' => 'phone', 'type' => 'xsd:string'),
    'code' => array('code' => 'code', 'type' => 'xsd:string')
   )
);

// Register the getData operation
$server->register("getData",
    array('token' => 'xsd:string'),
    array('return' => 'tns:return_array_php'),
    'urn:catinfo',
    'urn:catinfo#getData');

// Checking POST request headers
$HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA)? $HTTP_RAW_POST_DATA : "";
$server->service($HTTP_RAW_POST_DATA);

ここでは、PHP配列を返すべきではないと思います。しかし、仕様に従って何を返すべきかわかりません。誰かがこれで私を助けることができますか?または、配列を返すのは正しいですか?

4

1 に答える 1

3

データで構成される配列に別の複合型を追加する必要があります。このような:

$server->wsdl->addComplexType(
    'dataArray',    // MySoapObjectArray
    'complexType', 'array', '', 'SOAP-ENC:Array',
    array(),
    array(array('ref'=>'SOAP-ENC:arrayType','wsdl:arrayType'=>'tns:return_array_php[]')), 'tns:return_array_php'
);

関数の戻り値となる新しいデータ型を登録します。

$server->register(
    'getData',     
    array('Datum'=>'xsd:token'), 
    array('return'=>'tns:dataArray'),
    $namespace,
    false,
    'rpc',
    'encoded',
    'description'
);

次に、関数は配列の単一部分を設定する必要があります。

function GetData($token)
{
    if($token == "somestring") {
        $result[0] = array(
            "animal"  => "cat",
            "phone"   => "225",
            "code"    => "FYI"
        );

        $result[1] = array(
            "animal"  => "dog",
            "phone"   => "552",
            "code"    => "IFY"
        );
    } else {
        $result = null;
    }
    return $result;
}

文字列「somestring」で呼び出されたこのサービスの応答は次のようになります。

<ns1:getDataResponse xmlns:ns1="http://localhost/status/status.php">
    <return xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="tns:return_array_php[2]">
        <item xsi:type="tns:return_array_php">
           <animal xsi:type="xsd:string">cat</animal>
           <phone xsi:type="xsd:string">225</phone>
           <code xsi:type="xsd:string">FYI</code>
        </item>
        <item xsi:type="tns:return_array_php">
           <animal xsi:type="xsd:string">dog</animal>
           <phone xsi:type="xsd:string">552</phone>
           <code xsi:type="xsd:string">IFY</code>
        </item>
    </return>
</ns1:getDataResponse>

それはあなたの仕様に一致します。

于 2013-01-07T09:53:09.507 に答える