требуется ли декодировать результат завитка в моем случае?

Я создал php curl для отправки XML-запроса, как показано ниже, где кажется, что вход в систему работает. потому что, если что-то не так в деталях входа в систему, это показывает ошибку. но если все в порядке, то он дает ответ в каком-то мусорном значении:

Исходный основной код:

$contentlength=strlen($postdata);

$curl = curl_init();
curl_setopt_array($curl, array(
    CURLOPT_URL =>$this->url ,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_TIMEOUT => 30,
    CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_0,
    CURLOPT_CUSTOMREQUEST => "POST",
    CURLOPT_POSTFIELDS => "$postdata",
    CURLOPT_HTTPHEADER => array(
        "Content-Type: text/xml;charset=utf-8",        
        "Content-Length: 839",
        "Accept: text/xml",
        "Accept-Encoding: gzip",
        "Authorization : $Authorization",
        "User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.11) Gecko/20071204 Ubuntu/7.10 (gutsy) Firefox/2.0.0.11",
        "Host: $host",
        "Connection: close" 

    ),
));

Вывод выглядит так:

‹d1oÂ0…÷üŠS–,Û)J›ÈuèÔ"$–²šäH£Æv°MUþ}MÒ€J·»{ŸŸï_}«¾ÐºÖèeÂæ4Ô•©[Ý,““?¤OÉJDÜ¢ëv¸ïLõyåã‡yþ‹ Ç:oñ€6 x

что случилось ? мне что-нибудь расшифровать? если да, то в каком из них мне нужно отлаживать. Я использую сайт securetrading.com для отправки XML-запроса.


person user3264863    schedule 21.09.2016    source источник
comment
установить другой вариант скручивания для CURLOPT_ENCODING   -  person Renjith V R    schedule 21.09.2016


Ответы (2)


Просто вам нужно удалить "Accept-Encoding: gzip" из массива CURLOPT_HTTPHEADER.

Если все еще не работает, используйте для распаковки вывода с помощью функции gzdecode()

$original_output= gzdecode($curl_output);

Для решения проблемы длины контента вам необходимо подсчитать длину строки данных поста, которую вы уже вычислили и сохранили в переменной $contentlength.

"Content-Length:".$contentlength
person Haresh Vidja    schedule 21.09.2016
comment
Теперь это разрешилось. Но в данных документах это написано так: Такая ошибка может возникнуть, когда заголовок Content-Length вычисляется перед кодированием XML. Заголовок Content-Length должен содержать количество байтов в фактической полезной нагрузке запроса и, следовательно, должен вычисляться после выполнения любой кодировки символов. - person user3264863; 21.09.2016
comment
я этого не понял. Можете ли вы дать мне пример, как указано выше в моем основном коде? - person user3264863; 21.09.2016
comment
использовать первый вариант, удалив параметр заголовка? или второй вариант с помощью функции php? - person Haresh Vidja; 21.09.2016
comment
также удалите Content-Length: 839 из CURLOPT_HTTPHEADER, это устранит вашу ошибку - person Haresh Vidja; 21.09.2016
comment
нам нужно передать заголовок, чтобы мы не могли удалить его из завитка. - person user3264863; 21.09.2016
comment
Content-Length требуется для отправки . но в настоящее время я отображаю его статично, потому что я не знаю, как его рассчитать. - person user3264863; 21.09.2016
comment
на самом деле я должен следовать этим документам securetrading.com/files /documentation/, где на странице 14 упоминалось, что я говорю. - person user3264863; 21.09.2016
comment
Я хочу знать, что $postdata - это строка или массив? - person Haresh Vidja; 21.09.2016
comment
я сопоставляю строку, подобную этой $postdata='‹?xml version=1.0 encoding=utf-8?›'; $postdata.=‹версия блока ответа=\3.67\›; $postdata.=‹requestreference›X3148177‹/requestreference›; - person user3264863; 21.09.2016
comment
Я изменил свой ответ, пожалуйста, проверьте длину контента - person Haresh Vidja; 21.09.2016
comment
да, я уже делаю это как Content-Length: $contentlength, но я не знаю. он показывает ошибку типа ‹?xml version='1.0' encoding='utf-8'?› ‹responseblock version=3.67› ‹requestreference›W5-gqu1vva6‹/requestreference› ‹тип ответа=ERROR› ‹timestamp›2016-09- 21 10:05:20‹/timestamp› ‹error› ‹message›Malformed XML‹/message› ‹code›10200‹/code› ‹data›Несоответствие открывающего и конечного тегов: responseblock, строка 1 и ответ, строка 1, столбец 716 ‹/data› ‹/error› ‹/response› ‹secrand›wkUFPkQ‹/secrand› ‹/responseblock› - person user3264863; 21.09.2016
comment
согласно данным документам, это может произойти, если есть ошибка в длине контента. Если я изменю длину содержимого вручную, ошибка изменится на другое имя TAG. - person user3264863; 21.09.2016
comment
перейдите по этой ссылке stackoverflow .com/questions/9152165/, это может быть вам полезно, если вам нравится мой ответ и он полезен, как вы просили, отметьте как правильный :) - person Haresh Vidja; 21.09.2016

curl_setopt($curl, CURLOPT_ENCODING , "gzip");

правильно покажет результат

person CatalinB    schedule 21.09.2016