Есть некий сайт, у него есть API, они возвращают JSON
В браузере можно написать https://сайт/api/?запрос - и он записывает файлик json.
Теперь я хочу из 1с прочитать то, что сайт возвращает.
код неправильный, т.к. в ОткрытьПоток() в параметр нужно передать поток, а где его взять, я не могу понять. Подскажите плз...
Есть, конечно, вариант 2 - записать файлик куда-нибудь и читать уже из файла, может это так надо делать? Во всех примерах, какие нашел в Инете, читается файл, с потоками как-то не складывается, может это вообще что-то другое?
Как это правильно сделать?
Чтение = НОвый ЧтениеJSON();
Результат = Соединение.Получить(Запрос);
Чтение.ОткрытьПоток(Результат.ПолучитьТелоКакПоток(),"windows-1251");
Данные =ПрочитатьJSON(Чтение, ИСТИНА, "ДатаВыпуска" , ФорматДатыJSON.ISO);
HTTPСоединение = Новый HTTPСоединение(Адрес);
HTTPЗапрос = Новый HTTPЗапрос(ТекстЗапроса);
Сообщить(ПолныйТекстЗапроса);
Результат = HTTPСоединение.Получить(HTTPЗапрос, "tmp.txt");
Поток = Результат.ПолучитьТелоКакПоток();
Чтение.ОткрытьПоток(Поток, "windows-1251");
Пока Чтение.Прочитать() Цикл
КонецЦикла;
Показать
так оно лучше, но результат возвращает HTML файл, в котором пытается мне сообщить "301 moved permanently". Т.е. он достучаться туда же, куда стучится браузер с такой же адресной строкой - не может. Подозреваю, что надо еще как-то задать HTTPСоединение "защищенное соединение".
"301 moved permanently". Т.е. он достучаться туда же, куда стучится браузер с такой же адресной строкой - не может.
Это просто не видно работу браузера, который так же получает это сообщение и формирует новое по новому адресу, которое передалось в заголовках.
В данном случае нужно это отловить самому программно и так же сформировать новый запрос. Смотреть поле Location в получаемых заголовках.
Результат = HTTPСоединение.Получить(HTTPЗапрос, "tmp.txt");
Если Результат.КодСостояния = 301 Тогда
НовыйАдрес = "";
Если Результат.Заголовки.Свойство("Location", НовыйАдрес) Тогда
//Формируем новый запрос с новым адресом
КонецЕсли;
КонецЕсли;
Показать
Как-то так.
PS. Вот на счет Свойство() не уверен. Там вроде как соответствие. Но я думаю направление мысли понятно?
(10) да, Свойство не але, там соответствие, но с этим я уж как-нибудь.
Но! Этот location в точности повторяет первый адрес и у нового запроса код состояния тоже 301.
Результат = HTTPСоединение.Получить(HTTPЗапрос, "tmp.txt");
Если Результат.КодСостояния = 301 Тогда
НовыйАдрес = Результат.Заголовки.Получить("Location");
Если НовыйАдрес <> Неопределено Тогда
HTTPЗапрос = Новый HTTPЗапрос(НовыйАдрес);
Результат = HTTPСоединение.Получить(HTTPЗапрос, "tmp2.txt");
КонецЕсли;
КонецЕсли;
(12) так то же самое. Может ему все же надо как=то сказать, что надо ssl?
1с в стандартных процедурах не забывает параметр ЗащищенноеСоединение в HTTPСоединение
где его только взять, попробую посмотреть, что туда записывает сама 1с.
Вообще там есть (это УТ 10.3, но и тут тоже есть) процедура ПолучитьФайлИзИнтернет, может через нее этот json попробовать прочитать.
(7) собственно у меня есть пример кода на php
его надо как-то перегнать в 1с
/* Для начала нам необходимо инициализировать данные, необходимые для составления запроса. */
$subdomain='test'; #Наш аккаунт - поддомен
#Формируем ссылку для запроса
$link='https://'.$subdomain.'.amocrm.ru/api/v2/contacts/';
/* Заметим, что в ссылке можно передавать и другие параметры, которые влияют на выходной результат (смотрите документацию).
Следовательно, мы можем заменить ссылку, приведённую выше на одну из следующих, либо скомбинировать параметры так, как Вам необходимо. */
$link='https://'.$subdomain.'.amocrm.ru/api/v2/contacts/';
$link='https://'.$subdomain.'.amocrm.ru/api/v2/contacts/?limit_rows=15';
$link='https://'.$subdomain.'.amocrm.ru/api/v2/contacts/?limit_rows=15&limit_offset=2';
/* Нам необходимо инициировать запрос к серверу. Воспользуемся библиотекой cURL (поставляется в составе PHP). Подробнее о работе с этой
библиотекой Вы можете прочитать в мануале. */
$curl=curl_init(); #Сохраняем дескриптор сеанса cURL
#Устанавливаем необходимые опции для сеанса cURL
curl_setopt($curl,CURLOPT_RETURNTRANSFER,true);
curl_setopt($curl,CURLOPT_USERAGENT,'amoCRM-API-client/1.0');
curl_setopt($curl,CURLOPT_URL,$link);
curl_setopt($curl,CURLOPT_HEADER,false);
curl_setopt($curl,CURLOPT_COOKIEFILE,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
curl_setopt($curl,CURLOPT_COOKIEJAR,dirname(__FILE__).'/cookie.txt'); #PHP>5.3.6 dirname(__FILE__) -> __DIR__
curl_setopt($curl,CURLOPT_SSL_VERIFYPEER,0);
curl_setopt($curl,CURLOPT_SSL_VERIFYHOST,0);
$out=curl_exec($curl); #Инициируем запрос к API и сохраняем ответ в переменную
$code=curl_getinfo($curl,CURLINFO_HTTP_CODE);
curl_close($curl);