Ответ сервера 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С!