Ich versuche, SWA-Antworten von einem Java-SOAP-Dienst zu behandeln. Bei dieser SWA-Antwort handelt es sich um binäre Anhänge, die am Ende der XML-Datei zusammen mit einigen MIME-Headern angehängt werden. Ich kann WSO2 nicht für Abhängigkeitsbeschränkungen verwenden.PHP - erweitern SoapClient, um SWA (SOAP mit Anhang) zu behandeln
Jede Hilfe wäre sehr willkommen!
// 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
// Script, um die Antwort zu spalten + zurückkehren StdObj ist wie der übergeordneten Klasse Soapclient + tun etwas mit den Dateien
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());
}
}
}
}
Sie sollten mehr Informationen zur Verfügung stellen, ich kann nicht verstehen, wo das Problem liegt. Sind diese Teile vielleicht codiert? Ist es gültiges XML? Hast du es analysiert? Haben Sie eine Fehlerprotokollierung mit [libxml_get_errors()] (http://php.net/manual/function.libxml-get-errors.php) versucht? –
ist es ein interessanter Hack-Stil-Versuch, den binären Anhang aus dem Header zu greifen. Ich bin auch eine Weile in diese Richtung gegangen. –
Sie sollten versuchen, eine [MIME-Parser-Erweiterung] (https://code.google.com/p/php-mime-mail-parser/) zu verwenden, um die Payload zu analysieren und nicht selbst zu regexen. – quickshiftin