私はこのWSDLを持っています: https://secure.softwarekey.com/solo/webservices/XmlCustomerService.asmx?WSDL
SoapClientを使用して CustomerSearch メソッドにリクエストを送信しようとしています。
私が使用しているコードは次のとおりです。
$url = 'https://secure.softwarekey.com/solo/webservices/XmlCustomerService.asmx?WSDL';
$client = new SoapClient($url);
$CustomerSearch = array(
'AuthorID' => $authorID,
'UserID' => $userID,
'UserPassword' => $userPassword,
'Email' => $customerEmail
);
$xml = array('CustomerSearch' => $CustomerSearch);
$result = $client->CustomerSearch(array('xml' => $xml));
コードを実行すると、次のPHP例外が発生します:
Fatal error: Uncaught SoapFault exception: [Client] SOAP-ERROR: Encoding: object has no 'any' property
XMLでもこれを試しました。
$xml = "
<?xml version=\"1.0\" encoding=\"utf-8\"?>
<CustomerSearch>
<AuthorID>$authorID</AuthorID>
<UserID>$userID</UserID>
<UserPassword>$userPassword</UserPassword>
<Email>$customerEmail</Email>
</CustomerSearch>
";
これにより、(print_rから)次の結果が得られます。
object(stdClass)#4 (1) { ["CustomerSearchResult"]=> object(stdClass)#5 (1) { ["any"]=> string(108) "-2Invalid Xml Document" } }
documentation は、入力XMLが次のようになることを示しています。
<CustomerSearch>
<AuthorID></AuthorID>
<UserID></UserID>
<UserPassword></UserPassword>
<SearchField></SearchField>
<SearchField></SearchField>
<!-- ...additional SearchField elements -->
</CustomerSearch>
私はSoapにかなり慣れていないので、いじり回してみました(rawを渡してXMLを入力しました)が、これを機能させることができないようです。私が間違っているかもしれないことについての洞察は大いにありがたいです。
(any
パラメータに関して)ドキュメントをもっと調べる必要があると思います。ただし、リクエストは次のようになります。
$url = 'https://secure.softwarekey.com/solo/webservices/XmlCustomerService.asmx?WSDL';
$client = new SoapClient($url);
$xmlr = new SimpleXMLElement("<CustomerSearch></CustomerSearch>");
$xmlr->addChild('AuthorID', $authorID);
$xmlr->addChild('UserID', $userID);
$xmlr->addChild('UserPassword', $userPassword);
$xmlr->addChild('Email', $customerEmail);
$params = new stdClass();
$params->xml = $xmlr->asXML();
$result = $client->CustomerSearchS($params);
[〜#〜]編集[〜#〜]:これは私が同様のプロジェクトでそれを行った方法です。ベストプラクティスではない場合があります。 SoapVar それを行うためのより良い方法かもしれません( SoapVoarANY_XML
)の例。
$client->CustomerSearch($CustomerSearch);
を渡すか、文字列を渡してみてください