Я занят составлением сценария SOAP, который по большей части работает исправно, однако есть один запрос, который не работал должным образом, и его попросили изменить формат XML-запроса от принимающей компании, и я застрял …
В настоящее время мой запрос XML выглядит так …
<?xml version="1.0"?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" xmlns:ns1="http://www.???.com/???/"> <env:Body> <ns1:GetTransactions> <ns1:Filter> <ns1:CardId>1234</ns1:CardId> </ns1:Filter> <ns1:Range> <ns1:FirstRow/> <ns1:LastRow/> </ns1:Range> </ns1:GetTransactions> </env:Body> </env:Envelope>
Но компания-хозяин попросила, чтобы она выглядела так …
<?xml version="1.0"?> <env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope"> <env:Body> <GetTransactions xmlns="http://www.???.com/???/"> <Filter> <CardId>1234</CardId> </Filter> <Range> <FirstRow/> <LastRow/> </Range> </GetTransactions> </env:Body> </env:Envelope>
Мой PHP, который формирует запрос, следующий:
$wsdl = 'http://???.com/???/???.asmx?WSDL'; $endpoint = 'http://???.com/???/???.asp'; $soap_client = new SoapClient( $wsdl, array( 'soap_version' => SOAP_1_2, 'trace' => 1, 'exceptions' => 0, 'features' => SOAP_SINGLE_ELEMENT_ARRAYS, 'location' => $endpoint ) ); $get_transactions = $soap_client->GetTransactions( array( 'Filter' => array( 'CardId' => '1234' ), 'Range' => array( 'FirstRow' => NULL, 'LastRow' => NULL ) ) );
Может ли кто-нибудь указать мне в правильном направлении относительно того, что требуется для изменения формата выходного XML?
Существует проблема с веб-службой хост-компании. Веб-служба должна принимать отправленный формат, поскольку он правильно отформатирован XML.
С благодарностью Wrikken за его предложения, я придумал хакерское решение. Реальный ответ будет заключаться в том, чтобы принимающая компания исправила свой веб-сервис, чтобы принять правильно отформатированные XML-запросы.
Я расширил класс SoapClient, чтобы я мог редактировать XML до его отправки на сервер …
$namespace = 'http://www.???.com/???/'; class HackySoapClient extends SoapClient { function __doRequest( $request, $location, $action, $version, $one_way = 0 ) { global $namespace; // Here we remove the ns1: prefix and remove the xmlns attribute from the XML envelope. $request = str_replace( '<ns1:', '<', $request ); $request = str_replace( '</ns1:', '</', $request ); $request = str_replace( ' xmlns:ns1="' . $namespace . '"', '', $request ); // The xmlns attribute must then be added to EVERY function called by this script. $request = str_replace( '<Login', '<Login xmlns="' . $namespace . '"', $request ); $request = str_replace( '<GetTransactions', '<GetTransactions xmlns="' . $namespace . '"', $request ); return parent::__doRequest( $request, $location, $action, $version, $one_way = 0 ); } } $soap_client = new HackySoapClient( $wsdl, array(...