Java SOAPサービスからSWA応答を処理しようとしています。そのSWA応答では、XMLの末尾にいくつかのMIMEヘッダーと共に付加されたバイナリの添付ファイルがあります。 WSO2を依存要件の制限に使用することはできません。PHP - SWA(添付ファイル付きSOAP)を処理するSoapClientを拡張する
ご協力いただければ幸いです。
// Input
------=_Part_42_539586119.1332526191981
Content-Type: text/xml; charset=UTF-8
Content-Transfer-Encoding: binary
Content-Id: <03B4708A9544C182C43E51D9ADA1E456>
<?xml version="1.0" encoding="utf-8"?><soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><soapenv:Body> ... TRUNCATED XML SOAP RESPONSE ... </soapenv:Body></soapenv:Envelope>
------=_Part_42_539586119.1332526191981
Content-Type: image/png
Content-Transfer-Encoding: binary
Content-Id: <D637B1257E3E5EEA06AF0E45494F8448>
BINARY DATA GOES HERE
// End of input
//スクリプトファイル
namespace Project;
class SoapClient extends \SoapClient
{
public function __call ($function_name, $arguments)
{
// have the parent do a soap call, catch the lastResponse() if an error
// occurred (eg has an attachment) and parse it out.
try {
$r = parent::__call($function_name, $arguments);
return $r;
} catch (\Exception $e) {
// Assumption: When this is sent, it means that a file is being sent
// because SimpleXML can't process it.
if ($e->getMessage() == "looks like we got no XML document") {
$response = parent::__getLastResponse();
$partString = "/(------=_[a-zA-Z0-9_\\.]+)/";
$outputArr = preg_split($partString, $response);
// $outputAtt[0] -- empty and is the first MIME Part Header
// $outputArr[1] -- Mime Header + XML (The SOAP Response)
// $outputArr[n+1] -- additional files w/ MIME headers
if (array_key_exists(1, $outputArr)) {
// remove the first 5 lines (4 MIME Header lines) + 1 Blank
// line
$data = implode("\n",
array_slice(explode("\n", $outputArr[1]), 5));
/// Simple XML Object ... appears to be an empty SimpleXMLElement though ... >:-(
$xml = simplexml_load_string($data, null, null, "http://schemas.xmlsoap.org/soap/envelope/");
} else {
// OK Maybe this doesn't actually contain the XML... throw
// the original exception.
throw new \SoapFault($e->getMessage(), $e->getCode(),
$e->getPrevious());
}
} else {
throw new \SoapFault($e->getMessage(), $e->getCode(),
$e->getPrevious());
}
}
}
}
詳細情報を提供する必要がありますが、どこに問題があるのかわかりません。これらの部分はエンコードされていますか?それは有効なXMLですか?あなたはそれを解析しましたか? [libxml_get_errors()](http://php.net/manual/function.libxml-get-errors.php)で何らかのエラー記録を試みましたか? –
ヘッダーからバイナリの添付ファイルを取得するのは興味深いハックスタイルの試みです。私はこの方向にしばらく進みました。 –
独自の正規表現ではなく、[MIMEパーサー拡張](https://code.google.com/p/php-mime-mail-parser/)を使用してペイロードを解析するようにしてください。 – quickshiftin