Здравствуйте!
Пишем модуль для интеграции с сервисом WSDL COWMS "Склад Облако", там в запросах передается XML в теле HTTP запроса,
а также заголовком Content-length обязательно нужно передать размер тела запроса (как раз этого XML) в байтах.
Стандартно для этого используется функция strlen() которая и считает в байтах, но сайт в UTF-8,
и требование вашего установщика наличие директивы mbstring.func_overload 2
Так вот с ней, strlen() замещается mb_strlen(), которая считает кол-во символов а не байт, из-за чего запросы не проходят, т.к передается не правильный Content-length и сервер рвет соединения по тайм-ауту.
Код для наглядности:
Как быть в этом случае, если нельзя избавится от mbstring.func_overload 2 ? Какие есть варианты?
Пишем модуль для интеграции с сервисом WSDL COWMS "Склад Облако", там в запросах передается XML в теле HTTP запроса,
а также заголовком Content-length обязательно нужно передать размер тела запроса (как раз этого XML) в байтах.
Стандартно для этого используется функция strlen() которая и считает в байтах, но сайт в UTF-8,
и требование вашего установщика наличие директивы mbstring.func_overload 2
Так вот с ней, strlen() замещается mb_strlen(), которая считает кол-во символов а не байт, из-за чего запросы не проходят, т.к передается не правильный Content-length и сервер рвет соединения по тайм-ауту.
Код для наглядности:
Код |
---|
$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', ); |
Как быть в этом случае, если нельзя избавится от mbstring.func_overload 2 ? Какие есть варианты?
С ув. Вячеслав Докукин