Подключение > API 2.1 > Декомпрессия ответа

Декомпрессия ответа

Запрос
Ответ
Реализация

Декомпрессия ответа

Ответ сервера Postcalc.RU всегда архивируется в gzip (за исключением экспериментального формата plain). Для декомпрессии добавьте строчку:
$Request = 'http://api.postcalc.ru/?'.$QueryString;
$Response = file_get_contents($Request) or die('Can not connect!');
// Добавляем распаковку:
if ( substr($Response,0,3) == "\x1f\x8b\x08" ) $Response=gzinflate(substr($Response,10,-8));
Внимание! На платформе Битрикс наблюдается следующее нестандартное поведение: функция gzinflate не блокируется, однако после распаковки поток усекается на несколько байт.
Это связано с установкой PHP mbstring.func_overload. Поэтому проводите распаковку так:
if (substr($Response, 0, 3) ==  "\x1f\x8b\x08") {
  $funcOverload = ini_get("mbstring.func_overload");
  if (in_array($funcOverload, array(2, 3, 6, 7,))) {
    $Response = gzinflate( substr($Response, 10, -1) );
  } else {
    $Response = gzinflate( substr($Response, 10, -8) );
  }    
}
Если это не поможет, замените полностью вызов file_get_contents() с последующей декомпрессией функцией gzinflate() на аналогичный вызов fopen() с применением обработчиков компрессии:
$Request = 'http://api.postcalc.ru/?'.$QueryString;
$fp = fopen("compress.zlib://$Request", "rb");
$Response = stream_get_contents($fp);
fclose($fp);

Внимание! Для разархивации на платформе 1C можно применить вызов из командной строки внешней программы:
ПараметрыGET = "?f=101000&t=190000&w=1000&c=RU&o=wddx&key=test" + 
    "&w=" + Формат(Вес,"ЧГ=0") + 
    "&v=" + Формат(Окр(Ценность),"ЧГ=0") +
    "&t=" + Индекс;
 

    ИмяФайлаАрхива = КаталогВременныхФайлов() + "postcalc_new.zip";
    ХТМЛ = Новый HTTPСоединение("api.postcalc.ru");  
    ХТМЛ.Получить(ПараметрыGET,ИмяФайлаАрхива);
	СтрокаКоманды = """C:\Program Files\WinRar\winrar.exe"" e -y """ +  ИмяФайлаАрхива + """ """ +  КаталогВременныхФайлов() + """";
	Шелл=Новый COMОбъект("Wscript.Shell");
	Шелл.run(СтрокаКоманды,1,True);
	ИмяФайлаОтвета =  КаталогВременныхФайлов() + "postcalc_new";
А это полное решение другого программиста: 1c_postcalc_request.txt
Очень признателен авторам, которые поделились своими решениями для платформы 1С!