Рецепт разбора SOAP ответа

Проблема: бывает так, что при вызове soap, ответ на стороне клиента не собирается в объект, это может быть и из-за wsdl или из-за неверного ответа от сервер.

Решение: распарсить ответ от сервере как XML

// выполняем функцию SOAP
$response = $this->client->__soapCall("getParam", $param);

// костыль, так как первый response ничего не вернул, будем тупо парсить  XML ответ
$response = $this->client->__getLastResponse();

// xml парсеру не нравится тег с неймспейсами, вырезаем их
$response = str_ireplace(array('soapenv:', 'tem:', 'SOAP-ENV:', 'rpc:'), '', $response);
$xml = simplexml_load_string($response, "SimpleXMLElement", LIBXML_NOCDATA);

$json = json_encode($xml);
$arrayResponse = json_decode($json,TRUE);

Если есть ошибка при разборе, можно поиграть с параметрами

$xml = simplexml_load_string($response, «SimpleXMLElement», LIBXML_COMPACT | LIBXML_PARSEHUGE);

SOAP and BASE64

Потратил около часа, чтобы понять, почему при кодировании в base64 и передачи это через SOAP, получатель не может прочитать файл.

Оказалось все просто. SOAP сам упаковывает данные в BASE64 и конструкция

$imgbinary = fread(fopen($data['FormFileBuffer'], "r"), filesize($data['FormFileBuffer']));
 $base64File = base64_encode($imgbinary);

 

оказалась не нужна, достаточно сразу было отдать $imgbinary