応答を解析/デコードするために、SoapClient の doRequest 関数をオーバーライドしています。リクエストは正常に送信され、応答の内容は正常です。私が得ている問題は、2 番目の関数 (__myDoRequest) がオブジェクトではなく文字列を返すことです。
myDoRequest は __call をバイパスするため、__call は何らかの方法で応答をフォーマットしているに違いないと思います。myDoRequest の場合はわかりません (ヘッダーを再生成し、xml を本体にコピーするだけです)。関数/引数を取得するためにxmlドキュメントを解析する必要のない解決策はありますか?
注意事項:
$this->parse_response($response)
: 文字列を返す
要するに:
$this->soapclient->__doRequest(...);
: 文字列を返す
$this->soapclient->name_of_search($request)
: オブジェクト (stdClass) を返します
$this->soapclient->name_of_search($request)
文字列ではなく、オブジェクトを返したい。
__電話
public function __call($function_name, $arguments)
{
$this->__setSoapHeaders($this->generateWSSecurityHeader());
return parent::__call($function_name, $arguments);
}
__doRequest
public function __doRequest($request, $location, $action, $version, $one_way = 0)
{
$response = parent::__doRequest($request, $location, $action, $version, $one_way);
return $this->parse_response($response);
}
__myDoRequest
function __myDoRequest($request, $location, $action, $version, $one_way = 0)
{
//Set up the new headers
$xml = '<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="..." xmlns:ns2="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<SOAP-ENV:Header>';
$xml .= $this->generateWSSecurityHeader("xml");
$xml .= "</SOAP-ENV:Header><SOAP-ENV:Body>";
$xml .= $request;
$xml .= "</SOAP-ENV:Body></SOAP-ENV:Envelope>";
$response = parent::__doRequest($xml, $location, $action, $version, $one_way);
if((isset($this->__soap_fault)) && ($this->__soap_fault != null))
{
$exception = $this->__soap_fault;
if($exception != null)
{
throw $exception;
}
}
return $this->parse_response($response);
}
彼らがどのように呼ばれているか:
<snip>
if($raw_xml)
{
$response = $this->soapclient->__doRequest($raw_xml, '...', "", 1, 0);
}
else
{
$response = $this->soapclient->name_of_search($request);
}
<snip>