За последние 24 часа нас посетили 7914 программистов и 450 роботов. Сейчас ищут 263 программиста ...

Как рассчитать Content-Length для POST HTTP запроса?

Тема в разделе "Прочие вопросы по PHP", создана пользователем toorr2p, 17 июл 2020.

  1. toorr2p

    toorr2p Новичок

    С нами с:
    17 июл 2020
    Сообщения:
    2
    Симпатии:
    0
    Здравствуйте!
    Делаем интеграцию с SOAP сервисом "СкладОблако"
    Этот сервис принимает запросы HTTP 1.1 в теле которых есть XML с параметрами (о заказе), и есть обязательные HTTP заголовки которые нужно передавать в этом запросе. Так вот там есть заголовок 'Content-Length' который нужно рассчитать для тела в котором XML, пробовал и strlen и filesize ни что не рассчитывает верное значение! Данные все в UTF-8, сам файл и сайт тоже.

    Вот пример кода запроса
    http://cdekff.ddns.net:40100/OUTBOUND.asmx?op=ClientOrder_CreateUpdate

    Пробовал и CURL и HTTPGuzzle ничего не выходит! Только через PostMan запросы улетают на ура, но он там автоматически рассчитывает 'Content-Length' и подставляет этот заголовок в запрос.

    strlen - не правильно считает, всегда ниже верного значения которое можно отследить через Fiddler + PostMan.

    Вот кратко что пытаемся реализовать:

    $body = '<?xml version="1.0" encoding="utf-8"?><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/"><soap:Body><Client_CreateUpdate xmlns="http://cowms.ru/outbound"><User>Onwer54797</User><Pass>a7d4ea97a88d3a319975ff70fa2bb751</Pass><ClientCode>1</ClientCode><LastName>Павел</LastName><FirstName>Фоличев</FirstName><Email>folichev@gmail.com</Email><Phone>+79255563346</Phone><CountryCode>RU</CountryCode><AddressString>Тамбов, ул. Мичуринская, 185А, корп. 2 #STMB6</AddressString><CountryCode>RU</CountryCode><City>Красноярск</City><Street>Тамбов, ул. Мичуринская, 185А, корп. 2 #STMB6</Street><House>1</House><App>2</App><Comment></Comment></Client_CreateUpdate></soap:Body></soap:Envelope>';

    $content_length = strlen($body);
    $response = $client->request('POST', $host, [
    'headers' => [
    'Content-Type' => 'text/xml; charset=utf-8',
    'Host' => 'cdekff.ddns.net',
    'SOAPAction' => 'http://cowms.ru/outbound/Client_CreateUpdate';,
    'Content-Length' => $content_length,
    ],
    'timeout' => 180,
    'body' => $body,
    'verify' => false
    ]);

    $XMLData = $response->getBody();

    В итоге сервер вернет
    http_code HTTP/1.1 400 Bad Request
    из-за того что он не примет данные с не верным 'Content-Length'

    Как его вообще в принципе рассчитывать нужно в PHP ?
     

    Вложения:

  2. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    365
    Симпатии:
    67
    mb_strlen мб? т.к. русские символы.
     
  3. Sail

    Sail Активный пользователь

    С нами с:
    1 ноя 2016
    Сообщения:
    1.238
    Симпатии:
    275
    @toorr2p, content-length всего лишь размер в байтах тела запроса.
    Поэтому вполне уместно использование filesize() и strlen().
    Попробуйте для начала "ручками" подобрать константное значение и получить ответ от сервера и если оно будет отличаться от ожидаемого (количества байт, то есть, "десятичного количества октетов" в теле запроса) - задайте техподдержке сервиса вопрос о причинах этого недоразумения, приведя конкретный пример запроса (заголовков и тела).
     
    toorr2p нравится это.
  4. toorr2p

    toorr2p Новичок

    С нами с:
    17 июл 2020
    Сообщения:
    2
    Симпатии:
    0
    Спасибо за ответ! Выяснили причину, она была в значении
    PHP:
    1. php_value mbstring.func_overload 2
    которое использует Битрикс для установки в UTF-8