Здравствуйте!
Пишем модуль для интеграции с сервисом WSDL COWMS "Склад Облако", там в запросах передается XML в теле HTTP запроса,
а также заголовком Content-length обязательно нужно передать размер тела запроса (как раз этого XML) в байтах.
Стандартно для этого используется функция strlen() которая и считает в байтах, но сайт в UTF-8,
и требование вашего установщика наличие директивы mbstring.func_overload 2
Так вот с ней, strlen() замещается mb_strlen(), которая считает кол-во символов а не байт, из-за чего запросы не проходят, т.к передается не правильный Content-length и сервер рвет соединения по тайм-ауту.
Код для наглядности:
[CODE]$content = '<?xml version="1.0" encoding="utf-8"?>';
$content .= '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">';
$content .= '<soap:Body>';
$content .= '<User>'.$login.'</User>';
$content .= '<Pass>'.$pass.'</Pass>';
$content .= '<RPO>' . $arOrder['RPO'] . '</RPO>';
$content .= '</soap:Body>';
$content .= '</soap:Envelope>';
$content_length = intval(strlen($content));
$headers = array(
'Host' => 'cdekff.ddns.net',
'Content-Type' => 'text/xml; charset=utf-8',
'Content-Length' => $content_length,
'SOAPAction' => 'http://cowms.ru/outbound/ClientOrder_CreateUpdate',
);[/CODE]
Как быть в этом случае, если нельзя избавится от mbstring.func_overload 2 ? Какие есть варианты?
Пишем модуль для интеграции с сервисом WSDL COWMS "Склад Облако", там в запросах передается XML в теле HTTP запроса,
а также заголовком Content-length обязательно нужно передать размер тела запроса (как раз этого XML) в байтах.
Стандартно для этого используется функция strlen() которая и считает в байтах, но сайт в UTF-8,
и требование вашего установщика наличие директивы mbstring.func_overload 2
Так вот с ней, strlen() замещается mb_strlen(), которая считает кол-во символов а не байт, из-за чего запросы не проходят, т.к передается не правильный Content-length и сервер рвет соединения по тайм-ауту.
Код для наглядности:
[CODE]$content = '<?xml version="1.0" encoding="utf-8"?>';
$content .= '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">';
$content .= '<soap:Body>';
$content .= '<User>'.$login.'</User>';
$content .= '<Pass>'.$pass.'</Pass>';
$content .= '<RPO>' . $arOrder['RPO'] . '</RPO>';
$content .= '</soap:Body>';
$content .= '</soap:Envelope>';
$content_length = intval(strlen($content));
$headers = array(
'Host' => 'cdekff.ddns.net',
'Content-Type' => 'text/xml; charset=utf-8',
'Content-Length' => $content_length,
'SOAPAction' => 'http://cowms.ru/outbound/ClientOrder_CreateUpdate',
);[/CODE]
Как быть в этом случае, если нельзя избавится от mbstring.func_overload 2 ? Какие есть варианты?