Скрыть меню * Версия для печати

API - устарелая версия 0.9


До 01 июля 2014 года сервер поддерживает обе версии, затем она будет доступна некоторое время по api09.postcalc.ru, затем ее поддержка будет окончательно прекращена.
Внимание!
URL бесплатного сервиса изменился на api.postcalc.ru!
С 15 августа 2013 года нынешний URL www.postcalc.ru/get.php перестанет функционировать!
Срочно замените URL в ваших скриптах!
Остальное API остается без изменений!

Внимание!
Для тестов ваших скриптов создан отдельный сервис test.postcalc.ru!
Если вам нужно просто протестировать скрипт, используйте "http://test.postcalc.ru?<Переменные>".
В этом случае применять переменные Site, Email, Person обязательно только в том случае, если вы планируете обращаться ко мне за технической поддержкой.

Внимание!
С 1 августа 2013 года для обращения к api.postcalc.ru вводятся следующие обязательные поля запроса:

Site или st - домен сайта, на котором работает скрипт (обратите внимание - только домен, без http://, слешей и www),
Email или ml - почтовый адрес человека,
ответственного за работу скрипта (программист или системный администратор),
Person или pn - имя_фамилия латиницей ответственного,

например:

Site=shop.mysite.ru&Email=programmer@test.ru&Person=Ivan_Petrov
st=shop.mysite.ru&ml=programmer@test.ru&pn=Ivan_Petrov

Без этих переменных любой скрипт, обращающийся к api.postcalc.ru, может быть заблокирован в любой момент!

Я гарантирую доверительное обращение с информацией, содержащейся в данных переменных. Она будет использоваться исключительно для извещения лиц, ответственных за скрипт, о проблемах с их скриптом.
2a. Дополнительные необязательные поля запроса:

Software или sw - произвольная строка латиницей, которая идентифицирует ваш плагин (например, my_best_plugin);
Version или ver - номер версии, разделитель - точка (например, 1.2 или 1.2.3.4).

В ближайшее время я планирую создать "кабинет разработчика" - если вы зарегистрируетесь в нем, то получите доступ к логам сервера Postcalc.RU и статистику обращений для вашей разработки.
Внимание!
На сайте, который использует обращение к API Postcalc.RU, должна быть размещена ссылка на проект в произвольной форме, например:

Сайт использует в расчетах www.postcalc.ru

или:
Наш магазин использует технологию http://www.postcalc.ru

Подробнее здесь.

1. Запрос

Имеет 2 формы - краткую и полную. Вы можете щелкнуть по ссылкам и посмотреть ответ сервера в читабельном виде.

Пример полной формы запроса:
http://api.postcalc.ru/?From=101000&Country=RU&To=190000&Weight=1000&Valuation=1000&Step=0&Date=10.02.2011

Тот же запрос в краткой форме:
http://api.postcalc.ru/?f=101000&c=RU&t=190000&w=1000&v=1000&s=0&d=10.02.2011

Запрос в краткой форме с опущенными параметрами по умолчанию (вес - 1000 г, оценка - 0 рублей, расчет на настоящий момент):
http://api.postcalc.ru/?f=101000&t=190000

Это то же самое, что и следующий запрос (отделение 101000 является ОПС по умолчанию для Москвы, а 190000 - для Санкт-Петербурга):
http://api.postcalc.ru/?f=Москва&t=Санкт-Петербург

Уважаемыe коллеги! Обратите внимание, что в строке запроса можно использовать кириллицу, однако пробелы в запросе недопустимы - для сервера такой запрос является ошибочным и вы получите ответ 400 Bad Request .
Используйте функции rawurlencode или (PHP 5+) http_build_query.

Неправильный запрос:
$Request='http://test.postcalc.ru/?f=Москва&t=Ленинградская область&w=1000&v=1000&o=php';

Правильный запрос:
$Request='http://test.postcalc.ru/?f=Москва&t='.rawurlencode('Ленинградская область').'&w=1000&v=1000&o=php';

Правильный запрос 2 (предпочтительный вариант в PHP 5+):
$Request=http_build_query(array(
"f"=>"Москва",
"t"=>"Ленинградская область",
"w"=>"1000",
"v"=>"1000",
"o"=>"php"
));
$Request="http://test.postcalc.ru/?$Request";


Описание полей запроса
Полная форма Краткая форма По умолчанию Описание
Site st нет
Домен сайта, на котором работает ваш скрипт.
Обязательное поле для api.postcalc.ru и коммерческих версий API.
Email ml нет
Контактная электронная почта лица, ответственного за работу скрипта (программист или системный администратор).
Обязательное поле для api.postcalc.ru и коммерческих версий API.
Person pn нет
Имя_Фамилия латиницей лица, ответственного за работу скрипта (программист или системный администратор).
Обязательное поле для api.postcalc.ru и коммерческих версий API.
From f Москва
=или=
101000

2 варианта (распознаются автоматически).

1. Название пункта отправления, как это определено в списке местоположений EMS. Это может быть город ('Москва', 'Орел', 'Владивосток' и т.п.) или регион ('Московская область', 'Северная Осетия-Алания республика' и т.п.) . Кодировка - cp1251 или utf8, разпознается автоматически, регистр букв значения не имеет, однако должны присутствовать все пробелы и дефисы. Индекс предприятия связи берется по умолчанию - это первое по номеру отделение связи, принимающее почту для населения. 

2. 6-значный индекс отправителя.

To t Санкт-Петербург
=или=
190000

2 варианта (распознаются автоматически).

1. Название пункта назначения, как это определено в списке местоположений EMS. Это может быть город ('Москва', 'Орел', 'Владивосток' и т.п.) или регион ('Московская область', 'Северная Осетия-Алания республика' и т.п.) . Кодировка - cp1251 или utf8, разпознается автоматически, регистр букв значения не имеет, однако должны присутствовать все пробелы и дефисы. Индекс предприятия связи берется по умолчанию - это первое по номеру отделение связи, принимающее почту для населения. 

2. 6-значный индекс адресата.

Weight w 1000 Вес отправления в граммах. Не более 100 кг.
Valuation v 0 Оценка товарного вложения в рублях. Не более 100 тыс. рублей. 
Date d now Дата, на которую нужно рассчитать отправку, в любом формате, который распознается функцией PHP strtotime(). В частности, распознаются такие варианты: 30.01.2011, 30-01-2011, 2011-01-30, now, +10days. По умолчанию - текущий момент времени (now).
Step s 0 Если 0, выводится подробный расчет для данного отправления, с учетом веса и оценки. Если равно 100, 500 или 1000, выдается таблица тарифов для отправлений разного веса с шагом 100, 500 или 1000 граммов соответственно. Таблица содержит 20 строк.
Country c RU Двузначный код страны (для международных доставок) из списка. Можно также использовать трехбуквенный код или название страны по-русски либо по-английски.
Output o html

Формат выдачи данных. Поддерживаются следующие форматы: php, json, xml, html, arr. Регистр букв значения не имеет.
1. HTML. Страница html в читабельном виде, кодировка windows-1251, удобно для просмотра ответа сервера прямо из браузера.
2. PHP. Массив PHP, обработанный функцией serialize(). Удобно для использования напрямую в скриптах PHP, для чего на стороне клиента следует использовать функцию unserialize() - см. пример в конце страницы. Кодировка windows-1251.
3. ARR. Массив PHP, выведенный функцией print_r(). Кодировка windows-1251, удобно для контроля ответов сервера из браузера.
4. XML или WDDX - массив PHP, обработанный функцией wddx_serialize_value(). Кодировка UTF-8.
5. JSON - массив PHP, обработанный функцией json_encode(). Кодировка UTF-8 + JavaScript Object Notation (JSON). Удобно для использования в JavaScript.

Extended e 0 Детализация ответа. При e=0 выдаются основные данные (тариф, страховка, оценка, наложенный платеж, сроки доставки, адреса и телефоны отделений связи), при других значениях могут выдаваться некоторые недокументированные сведения. При разработке собственных модулей, обращающихся к API PostCalc.RU, настоятельно рекомендуется ограничиваться только основными данными, так как расширенные данные могут меняться без уведомления.
IBase ib f База для расчета страховки (только при оценке товарного вложения больше 0!).

Если IBase=p или Partial, то страхуется только товарное вложение. Например, посылка с оценкой 1000 рублей будет застрахована на 1000 * 4% = 40 рублей независимо от стоимости доставки.
В случае пропажи отправления почта возместит только стоимость товара, а расходы на доставку и страховку придется списать в убыток.
Кроме того, при отправке наложенным платежом возникает проблема расчета суммы, которую адресат должен выплатить при получении отправления: ведь эта сумма больше оценки товара и должна покрывать расходы интернет-магазина на доставку и страховку

Если IBase=f или Full, базой страховки будет Оценка Товара + Тариф + Страховка, и в случае пропажи отправления почта полностью возместит ущерб. Это самый оптимальный вариант для отправки наложенным платежом, а конечная сумма, которую должен заплатить адресат - это столбец "Оценка" на веб-странице или поле ОценкаПолная в ответе по API.
ProcessingFee pr 0 Пользовательская наценка за обработку заказа в рублях. Сюда можно также включить уведомление о вручении.
PackingFee pk 0 Пользовательская наценка за упаковку одного отправления в рублях.
Round r 0.01 Округление итоговых чисел в верхнюю сторону до [Round] рублей. Рекомендуется задать Round=1 или 10, чтобы не путаться с копейками.
VAT vt 1 Если 1, НДС включен, если 0 - НДС вычитается.
НДС вычитается только в том случае, если для данного вида отправлений на сайте russianpost.ru имеются опубликованные тарифы без НДС. Ценные отправления (посылки, ценные бандероли, авиабандероли) и EMS всегда рассчитываются с НДС.
Charset cs Windows-1251 Кодировка для выходных форматов php, arr, html. Соответствует списку, который выводит функция php mb_list_encodings(). В частности, для русского языка доступны UTF-8, Windows-1251, KOI8-R, CP866, ISO-8859-5.
Внимание! Не рекомендуется использовать иные кодировки, кроме UTF-8 и Windows-1251.
Внимание! Для форматов json и wddx кодировка - всегда UTF-8! (ограничение функций php)

 

2. Ответ

Ответ - иерархический массив в одном из 5 форматов (см. описание ключа Output в запросе). Обратите внимание, что большинство ключей написано кириллицей - это, на мой взгляд, значительно упрощает работу русскоязычных программистов. 

А. Общие ключи - для всех видов отправлений.

Ключ Значение
Status Если ошибки нет, возвращает OK, иначе - код ошибки
API Версия сервера. "Старая" версия 2010-начала 2014 года обозначается как 0.9, поддерживает как "старое", так и "новое" API. Версия 2014 года обозначается как 1.0, поддерживает только новое АPI.
Message Сообщение об ошибке. Ключ устанавливается, только если возникла ошибка (Status!='OK').
_request

Эхо-массив переменных запроса, полученных сервером от клиента. Может быть полезно при отладке.

_server

Массив следующих переменных сервера: SERVER_ADDR, REMOTE_ADDR, HTTP_HOST, HTTP_USER_AGENT, HTTP_ACCEPT_ENCODING. Может быть полезно при отладке.

Дата Дата расчета тарифа в формате ДД.ММ.ГГГГ
ДатаСверкиТарифов Дата сверки тарифов с сайтами Почты России и EMS
Вес Вес отправления в граммах, использовавшийся при расчетах.
Оценка Оценка вложения в рублях, использовавшаяся при расчетах.
СрокДоставки Нормативный срок доставки в сутках. Для международных отправлений устанавливается только для EMS.
Международное Пункт международного обмена почтой - МОСКВА или САНКТ-ПЕТЕРБУРГ. Ключ устанавливается только для доставки за рубеж.

Ключи Откуда и Куда - устанавливаются для всех отправлений; для международных отправлений значения Куда следует игнорировать. 

Ключ1 Ключ2 Значение
Откуда
=или=
Куда
Индекс 6-значный индекс предприятия связи.
Название Название отделения связи, например, МОСКВА-523.
Адрес  Адрес отделения связи.
Телефон Телефоны отделения связи.
МестоположениеEMS Название центра региона или субъекта федерации (см. список Местоположений EMS).
ЦентрРегиона Название центра региона.

Ключ Ограничения устанавливается только для внутренних отправлений и только если для данного почтового индекса имеются ограничения по доставке. 

Ключ1 Ключ2 Ключ3 Значение
Ограничения Откуда
=или=
Куда
Тип Буквенное обозначение типа ограничения, используется во внутренних процедурах PostCalc.RU. Варианты: 
1. Запрет - установлен только период(ы) полного запрета доставки, в остальное время доставка наземная.
2. АвиаВесьГод-Авиа - авиадоставка от центра региона круглый год, установлен период(ы), когда возможна только авиадоставка.
3. АвиаВесьГод-Наземный - комбинированная доставка от центра региона круглый год; установлен период(ы), когда возможна только комбинированная доставка. 
4. АвиаСезонно - установлен период, когда возможна только авиадоставка, в остальное время доставки нет вообще.
5. Запрет* - особая ситуация, связанная с ошибкой в Эталонном справочнике ограничений: установлены периоды запрета доставки, однако имеется сноска, что доставка авиа разрешена. Для этих ОПС точный расчет тарифа в периоды закрытия для наземной доставки невозможен (в основном Якутия).
Действует Действует ли ограничение на момент расчета. Если действует, принимает значение 'ЗАПРЕТ' или 'АВИА'.
Авиадоставка Период доставки только авиатранспортом в формате ДД.ММ-ДД.ММ;ДД.ММ-ДД.ММ...
ЗапретДоставки Период полного запрета доставки в формате ДД.ММ-ДД.ММ;ДД.ММ-ДД.ММ...

Ключ Магистраль - устанавливается только для внутренних отправлений, и только если имеется доставка по магистрали (между центрами регионов). 

Ключ1 Ключ2 Значение
Магистраль Описание Описание маршрута, например, МОСКВА=>САНКТ-ПЕТЕРБУРГ
Расстояние  Тарифицируемое расстояние между городами магистрали в км по железной дороге. Для регионов, куда железнодорожной доставки нет - примерное расстояние.
ДоставкаСтандарт  Нормативный срок доставки посылки наземным (водным) транспортом в сутках, не считая дня подачи отправления.
ДоставкаАвиа Нормативный срок доставки письменной корреспонденции, он же установлен и для доставки посылок авиатранспортом. 
ДоставкаКласс1 Нормативный срок доставки 1-м классом.

 

Б. Ключи и значения для внутренних отправлений (Country=RU или параметр в запросе опущен):

Ключ Описание
ПростаяБандероль Простая бандероль
ЗаказнаяБандероль

Заказная бандероль

ЗаказнаяБандероль1Класс Заказная бандероль 1 класс
ЦеннаяБандероль Ценная бандероль
ЦеннаяПосылка Ценная посылка
ЦеннаяАвиаБандероль Ценная авиабандероль
ЦеннаяАвиаПосылка Ценная авиапосылка
ЦеннаяБандероль1Класс Ценная бандероль 1 класс
EMS Курьерская доставка EMS

Ключи и значения для внутренних отправлений на примере ценной бандероли:

Ключ1 Ключ2 Значение
ЦеннаяБандероль
 
Название Название почтового отправления
Количество Число почтовых отправлений с учетом максимального разрешенного веса.
Тариф Почтовый тариф в рублях (без учета страховки).
Страховка Только для ценных отправлений с оценкой больше 0: страховка в рублях.
Доставка Для ценных отправлений с оценкой больше 0: тариф+страховка в рублях. Для остальных отправлений - то же самое, что тариф.
Проверено Если 1, расчет полностью основан на документально подтвержденных тарифах. Если 0, возможны неточности. В частности, при расчете ценных отправлений для большинства городов используются магистральные пояса не из официальных документов Почты России, а вычисленные на основе расстояний по железной дороге, то же относится к авиатарифам и т.п. Обычно неточность невелика и находится в пределах нескольких рублей на килограмм веса.
Простые и заказные бандероли, а также EMS, всегда имеют в этом поле 1.
ОценкаПолная Только для ценных отправлений: сумма оценки в рублях, которую необходимо дать почтовому отправлению, чтобы получить на расчетный счет сумму, равную оценке товарного вложения. Равна: Оценка товарного вложения + Тариф + Страховка.
НаложенныйПлатеж Только для ценных отправлений: сумма в рублях, которую платит адресат на почте при наложенном платеже.
НаложенныйПлатеж2 Только для ценных отправлений в Томской и Иркутской областях, Красноярском крае, Якутии: наложенный платеж в районах, приравненных к Крайнему Северу. В остальных регионах равно 0.
НаложенныйПлатеж3 Только для ценных отправлений в Красноярском крае: наложенный платеж в районах Крайнего Севера. В остальных регионах равно 0.
НетРасчета

Ключ устанавливается, если тариф для данного отправления не может быть достоверно рассчитан. Содержит описание причины. Следующие варианты:
1. Авиабандероль и авиапосылка, если в базе данных нет магистрального авиатарифа (тарифа на перелет между центрами регионов).
2. Простая и заказная бандероль по маршруту, который включает отрезки с авиадоставкой (возможен только расчет ценных отправлений).
3. Отделение отправителя или получателя временно закрыто.
4. Ошибка в Эталонном справочнике ограничений по доставке.

ВычетНДС

Флаг. Если 1, вычет НДС возможен. Если 0 - НДС вычитаться не будет, даже если в запросе vt=0.

Ценное

Флаг. Если 1 - допускает оценку и, соответственно, расчет страховки и наложенного платежа. Если 0 - оценка отправления невозможна.

Товарное

Флаг. Если 0 - таким отправлением можно посылать только книжно-журнальную продукцию и документы. Если 1 - возможно товарное вложение.

КлассДоставки

Класс доставки. Если 0 - наземная доставка, если 1 - премиум (авиа и 1-й класс), если 2 - курьерская.

 

В. Ключи и значения для международных отправлений:

Ключ Описание
МждМешокМ Международный мешок М
МждМешокМАвиа

Международный мешок М авиа

МждМешокМЗаказной Международный мешок М заказной
МждМешокМАвиаЗаказной Международный мешок М авиа заказной
МждБандероль Международная бандероль
МждБандерольАвиа Международная авиабандероль
МждБандерольЗаказная Международная бандероль заказная
МждБандерольАвиаЗаказная Международная авиабандероль заказная
МждМелкийПакет Международный мелкий пакет
МждМелкийПакетАвиа Международный мелкий пакет авиа
МждМелкийПакетЗаказной Международный мелкий пакет заказной
МждМелкийПакетАвиаЗаказной Международный мелкий пакет авиа заказной
EMS_МждДокументы ЕMS международное - документы
EMS_МждТовары ЕMS международное - товары

Ключи и значения для международных отправлений на примере международного отправления EMS с товарным вложением:

Ключ1 Ключ2 Значение
ЕMS международное - товары
 
Название Название почтового отправления
Количество Число почтовых отправлений с учетом максимального разрешенного веса.
Тариф Почтовый тариф в рублях (без учета страховки).
Страховка Только для ценных отправлений с оценкой больше 0: страховка в рублях.
Доставка Для ценных отправлений с оценкой больше 0: тариф+страховка в рублях. Для остальных отправлений - то же самое, что тариф.
ОценкаПолная Только для ценных отправлений: сумма оценки в рублях, которую необходимо дать почтовому отправлению, чтобы получить на расчетный счет сумму, равную оценке товарного вложения. Равна: Оценка товарного вложения + Тариф + Страховка.
ВычетНДС

Флаг. Если 1, вычет НДС возможен. Если 0 - НДС вычитаться не будет, даже если в запросе vt=0.

Ценное

Флаг. Если 1 - допускает оценку и, соответственно, расчет страховки. Если 0 - оценка отправления невозможна.

Товарное

Флаг. Если 0 - таким отправлением можно посылать только книжно-журнальную продукцию и документы. Если 1 - возможно товарное вложение.

КлассДоставки

Класс доставки. Если 0 - наземная доставка, если 1 - премиум (авиа), если 2 - курьерская.

 

3. Пример запроса на PHP к Postcalc.RU:

Внимание! В версии 2014 г. (1.0) кодировка по умолчанию UTF-8 и будет включено принудительное сжатие по gzip!

А. Полный пример для "старой" версии 0.9.
<?php
// Заголовок с указанием набора символов.
// Для форматов php, arr, html кодировка определяется переменной cs и по умолчанию это Windows-1251.
// Для форматов json, wddx кодировка всегда UTF-8
header('Content-Type: text/html; charset=windows-1251');

// Формируем запрос со всеми необходимыми переменными
$Request=http_build_query(array(
'st'='shop.mysite.ru','ml'='programmer@test.ru',pn='Ivan_Petrov',
'f'=>'Москва','t'=>'Ленинградская область',
'w'=>'1000','v'=>'1000',
'o'=>'php'
));
$Request="http://api.postcalc.ru/?$Request";

$Response=file_get_contents($Request) or die('Could not connect!');

$arrResponse=unserialize($Response);

// Обработка ошибки
if ( $arrResponse['Status'] != 'OK'; ) die("Сервер вернул ошибку: $arrResponse[Status]!");

// Выводим значение тарифа для бандероли
echo $arrResponse['ПростаяБандероль']['Тариф'];
?>
B. Полный пример для "новой" версии 1.0, включая кэширование.
Рабочие файлы можно скачать здесь.
<?php
// Заголовок с указанием набора символов.
// Для форматов php, arr, html кодировка определяется переменной cs и по умолчанию в версии 1.0 это UTF-8.
// Для форматов json, wddx кодировка всегда UTF-8
header('Content-Type: text/html; charset=UTF-8');
// Красивости - таблица стилей
echo '
<style>
BODY {font-family: sans-serif;}
TABLE {font-family: sans-serif;background-color:#EEE}
TR:nth-child(2n+1){background-color:#DDF}
TD {padding:0.2em}
.error {background-color:#FDD; color:red}
</style>
';
// === Исходные данные
$From='101000';
$To='190000';
$Weight=1000;
$Valuation=500;
$Country='RU';
// ==========

// Обращаемся к функции getPostcalc
$arr=getPostcalc($From,$To,$Weight,$Valuation,$Country);

// Если вернулась строка - это сообщение об ошибке.
if ( !is_array($arr) ) {
echo "<span class='error'>Произошла ошибка:</span><br> $arr";
} else {
// Вернулся массив, Status=='OK'. Выводим таблицу отправлений
echo "<table>\n<tr><th>Название</th><th>Доставка</th><th>Сроки</th></tr>\n";
// Выводим список тарифов
foreach ( $arr['Отправления'] as $parcel )
echo "<tr><td>$parcel[Название] </td><td>$parcel[Доставка] руб.</td><td>$parcel[СрокДоставки]</td></tr>\n";
echo "</table>\n";
}

// ===== Основная функция опроса сервера Postcalc.RU =====
function getPostcalc($From,$To,$Weight,$Valuation=0,$Country='RU'){
// Обязательно! Проверяем данные - больше всего ошибочных запросов из-за неверных значений веса и оценки,
// из-за пропущенного поля "Куда".
if ( !($Weight>0 && $Weight<=100000) ) return "Bec - от 1 г до 100000 г!";
if ( !($Valuation>=0 && $Valuation<=100000) ) return "Оценка - от 0 руб. до 100000 руб.!";
if ( !preg_match('/[1-9][0-9]{5}/',$From) ) return "Поле 'Откуда' - может быть только 6-значным индексом!";
if ( !preg_match('/[1-9][0-9]{5}/',$To) ) return "Поле 'Куда' - может быть только 6-значным индексом!";
if ( !preg_match('/\w{2}/',$Country) ) return "Поле 'Страна' - 2 буквы латиницей!";

// Формируем запрос со всеми необходимыми переменными. Не забудьте поменять переменные st, ml, pn!
$QueryString = "st=shop.mysite.ru&ml=programmer@test.ru&pn=Ivan_Petrov";
$QueryString.= "&f=$From&t=$To&w=$Weight&v=$Valuation&c=$Country";
$QueryString.= "&o=php&cs=UTF-8";

// Кэширование. Каталог - любой, в который веб-сервер имеет право записи.
$CacheDir=sys_get_temp_dir();
// Название файла - префикс postcalc_ плюс хэш строки запроса
$CacheFile="$CacheDir/postcalc_".md5($QueryString).'.txt';
// Сборка мусора. Удаляем все файлы, которые подходят под маску, старше 600 секунд
$arrCacheFiles=glob("$CacheDir/postcalc_*.txt");
$Now=time();
foreach ($arrCacheFiles as $fileObj) {
if ( $Now-filemtime($fileObj) > 600 ) unlink($fileObj);
}
// Если существует файл кэша для данной строки запроса, просто зачитываем его
if ( file_exists($CacheFile) ) {
echo "Запрос из кэша!<br>\n";
return  unserialize(file_get_contents($CacheFile));
} else {
// Формируем URL запроса.
$Request="http://api.postcalc.ru/?$QueryString";

// Формируем опции запроса. Это _необязательно_, однако упрощает контроль и отладку
$arrOptions = array('http' =>
array( 'header'  => 'Accept-Encoding: gzip','timeout' => 5, 'user_agent' => phpversion() )
);

// Запрос к серверу. Сохраняем ответ в переменной $Response
if ( !$Response=file_get_contents($Request, false , stream_context_create($arrOptions)) )
return 'Не удалось соединиться с сервером postcalc.ru!';

// Если поток сжат, разархивируем его
if ( substr($Response,0,3) == "\x1f\x8b\x08" ) $Response=gzinflate(substr($Response,10,-8));

// Переводим ответ сервера в массив PHP
if (!$arrResponse=unserialize($Response)) return "Получены странные данные. Ответ сервера:\n$Response";

// Обработка возможной ошибки
if ( $arrResponse['Status'] != 'OK' ) return "Сервер вернул ошибку: $arrResponse[Status]!";

// Успешный ответ пишем в кэш
file_put_contents($CacheFile,$Response);

return $arrResponse;
}

}

 


(c) PostCalc.RU 2010-16



Яндекс.Метрика

Time elapsed: 0.00241