JSON ОткрытьПоток

1. starjevschik 11.12.17 14:11 Сейчас в теме
Есть некий сайт, у него есть API, они возвращают JSON
В браузере можно написать https://сайт/api/?запрос - и он записывает файлик json.
Теперь я хочу из 1с прочитать то, что сайт возвращает.
	Чтение = Новый ЧтениеJSON();
	
	ПолныйТекстЗапроса = СокрЛП(Адрес) + СокрЛП(ТекстЗапроса);
	Сообщить(ПолныйТекстЗапроса);
	Чтение.ОткрытьПоток(ПолныйТекстЗапроса);

код неправильный, т.к. в ОткрытьПоток() в параметр нужно передать поток, а где его взять, я не могу понять. Подскажите плз...
Есть, конечно, вариант 2 - записать файлик куда-нибудь и читать уже из файла, может это так надо делать? Во всех примерах, какие нашел в Инете, читается файл, с потоками как-то не складывается, может это вообще что-то другое?
Как это правильно сделать?
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
17. Xershi 1484 11.12.17 19:00 Сейчас в теме
(1) результат записывай в файл и далее читай файл.
2. user623969_dusa 11.12.17 14:21 Сейчас в теме
если ты запрос получаешь как файл то прочитай этот файл в строку джсон
что за метод ОткрытьПоток - какая версия 1с?

знаю метод у чтения открыть файл но не знаю открыть поток)
3. HanterVol 8 11.12.17 14:36 Сейчас в теме
Чтение = НОвый ЧтениеJSON();
Результат = Соединение.Получить(Запрос);
Чтение.ОткрытьПоток(Результат.ПолучитьТелоКакПоток(),"windows-1251");
Данные =ПрочитатьJSON(Чтение, ИСТИНА, "ДатаВыпуска" , ФорматДатыJSON.ISO);
starjevschik; +1 Ответить
6. starjevschik 11.12.17 16:56 Сейчас в теме
(3) Спасибо большое. Так понятнее
HTTPСоединение = Новый HTTPСоединение(Адрес);
	HTTPЗапрос = Новый HTTPЗапрос(ТекстЗапроса); 
	Сообщить(ПолныйТекстЗапроса);
	
	Результат =  HTTPСоединение.Получить(HTTPЗапрос, "tmp.txt");
	Поток = Результат.ПолучитьТелоКакПоток();
	Чтение.ОткрытьПоток(Поток, "windows-1251");
	Пока Чтение.Прочитать() Цикл
	КонецЦикла;
Показать

так оно лучше, но результат возвращает HTML файл, в котором пытается мне сообщить "301 moved permanently". Т.е. он достучаться туда же, куда стучится браузер с такой же адресной строкой - не может. Подозреваю, что надо еще как-то задать HTTPСоединение "защищенное соединение".


(2) 8.3.10. Сколько еще открытий чудных о)
7. spacecraft 11.12.17 17:03 Сейчас в теме
(6)
"301 moved permanently". Т.е. он достучаться туда же, куда стучится браузер с такой же адресной строкой - не может.

Это просто не видно работу браузера, который так же получает это сообщение и формирует новое по новому адресу, которое передалось в заголовках.
В данном случае нужно это отловить самому программно и так же сформировать новый запрос. Смотреть поле Location в получаемых заголовках.
8. starjevschik 11.12.17 17:10 Сейчас в теме
(7) там все возвращаемое вот так выглядит
<ht ml>
<head><title>301 Moved Permanently</title></head>
<body bgcolor="white">
<center><h1>301 Moved Permanently</h1></center>
<hr><center>nginx</center>
</body>
</html>

а... почитал про эту ошибку, вроде понял, о чем речь. Но как в 1с получить это перенаправление?...
10. spacecraft 11.12.17 17:16 Сейчас в теме
(8) я же указал: смотреть полученные заголовки.
Результат =  HTTPСоединение.Получить(HTTPЗапрос, "tmp.txt");
Если Результат.КодСостояния = 301 Тогда
    НовыйАдрес =  "";
    Если Результат.Заголовки.Свойство("Location", НовыйАдрес) Тогда
        //Формируем новый запрос с новым адресом
    КонецЕсли;
КонецЕсли;
Показать

Как-то так.

PS. Вот на счет Свойство() не уверен. Там вроде как соответствие. Но я думаю направление мысли понятно?
starjevschik; +1 Ответить
11. starjevschik 11.12.17 17:26 Сейчас в теме
(10) да, Свойство не але, там соответствие, но с этим я уж как-нибудь.
Но! Этот location в точности повторяет первый адрес и у нового запроса код состояния тоже 301.
Результат =  HTTPСоединение.Получить(HTTPЗапрос, "tmp.txt");
	Если Результат.КодСостояния = 301 Тогда
	    НовыйАдрес =  Результат.Заголовки.Получить("Location");
		Если НовыйАдрес <> Неопределено Тогда
			HTTPЗапрос = Новый HTTPЗапрос(НовыйАдрес); 
			Результат =  HTTPСоединение.Получить(HTTPЗапрос, "tmp2.txt");
	    КонецЕсли;
	КонецЕсли;
12. spacecraft 11.12.17 17:39 Сейчас в теме
(11) а если так:
Заголовки = Новый Соответствие();
Заголовки.Вставить("host", Адрес);
HTTPЗапрос = Новый HTTPЗапрос(ТекстЗапроса, Заголовки);
HTTPОтвет  = HTTPСоединение.Получить(HTTPЗапрос);


Адрес должен быть без http.
т.е. вместо http://ya.ru/code Должно быть просто: ya.ru
13. starjevschik 11.12.17 17:59 Сейчас в теме
(12) так то же самое. Может ему все же надо как=то сказать, что надо ssl?
1с в стандартных процедурах не забывает параметр ЗащищенноеСоединение в HTTPСоединение
где его только взять, попробую посмотреть, что туда записывает сама 1с.

Вообще там есть (это УТ 10.3, но и тут тоже есть) процедура ПолучитьФайлИзИнтернет, может через нее этот json попробовать прочитать.
14. starjevschik 11.12.17 18:07 Сейчас в теме
(13) ха, вот так получает как-той json

НастройкаСохранения = Новый Структура("Путь, МестоХранения", "tmp.txt", "Сервер");
	Получено = ПолучениеФайловИзИнтернетаКлиентСервер.ПодготовитьПолучениеФайла(
					ПолныйТекстЗапроса, 
					ИмяПользователя, 
					Пароль,
					Неопределено, 
					100, 
					Истина, 
					Ложь, 
					НастройкаСохранения);	
Показать


неожиданно ))
16. spacecraft 11.12.17 18:15 Сейчас в теме
(14) еще и пароль с пользователем...
Тогда так:
Новый HTTPСоединение(Адрес, 443, ИмяПользователя, Пароль);
15. spacecraft 11.12.17 18:13 Сейчас в теме
(13) если https, то: HTTPСоединение = Новый HTTPСоединение(Адрес, 443);
В Адрес не должно быть указание протокола.
18. ArchLord42 83 11.12.17 20:42 Сейчас в теме
(11) в локайшен тот же урл 100% из за того что веб сервер делает редирект с хттп на хттпс, собственно юзайте запрос с хттпс
9. starjevschik 11.12.17 17:14 Сейчас в теме
(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);
4. HanterVol 8 11.12.17 14:37 Сейчас в теме
т.е. тест запроса ты сформировал, но его на сервер не передал для выполнения
5. HanterVol 8 11.12.17 14:38 Сейчас в теме
Соединение - Это http соединение с параметрами....
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот