1с как через post метод передать массив
Нужно передать массив контрагентов в постзапросе, постзапрос делаю к сервису дадата, проверяю на контров на инн, для одного контрагента написал запрос через json, а как послать сразу несколько не понмиаю, с постзапросами да и с json работаю впервые могу что-то не понимать.
(0) Прям в жсоне и передавай массив. В чем вопрос?
адрес такой POST https://suggestions.dadata.ru/suggestions/api/4_1/rs/suggest/party
в заголовках указываю
Content-Type: application/json или application/xml.
Accept — аналогично.
1234567890 — API-ключ.
в параметрах передаю:
query string ИНН или ОГРН
вопрос как передать массив разных инн для проверки
(1) пробовал писать чтото такое на моменте ЗаписатьJSON падает с ошибкой
МассивДанныхJSON = Новый Массив;
СтруктураJSON = Новый Структура;
тДанные = Новый Структура;
Для Сч = 0 по массивконтров.ВГраница() Цикл
КонтрагентПро = массивконтров[Сч];
СведенияОКонтрагенте = ОбщегоНазначения.ЗначенияРеквизитовОбъекта(КонтрагентПро, «ИНН, КПП, ЮрФизЛицо»);
КонтрагентИННПРО = СокрЛП(СведенияОКонтрагенте.ИНН);
КонтрагентКПП = СокрЛП(СведенияОКонтрагенте.КПП);
КонтрагентВид = СведенияОКонтрагенте.ЮрФизЛицо;
тДанные.Вставить(«query», КонтрагентИННПРО);
КонецЦикла;
МассивДанныхJSON.Добавить(тДанные);
СтруктураJSON.Вставить(«data», МассивДанныхJSON);
ЗаписьJSON = новый ЗаписьJSON();
ЗаписатьJSON(ЗаписьJSON, СтруктураJSON);
СтрокаJS = ЗаписьJSON.Закрыть();
Dadata ищет только по одному инн за раз
(4) то есть из вариантов только постзапрос в цикл засунуть?
(0) Читайте документацию и примеры реализации
https://dadata.ru/api/suggest/party/
Там же все по русски на писано и примеры рабочие есть, а так же все ограничение описаны. Вы указываете данные, по которым ищется организация, вам в ответе максимум 20 вариантов подходящих.
По сабжу я не увидел возможности поиска сразу нескольких организаций. (5) Нужно еще учитывать ограничения на запросы
Очень прикольный сервис, я через него переводил базу вручную вбитых адресов в классификатор и получал геокоординаты адресов.
(6) я читал, смотрел, сейчас просто реализована проверка инн через фнс и там через прокси была реализована проверка сразу нескольких контрагентов, думал можно через Json как-то через дадату также делать только без прокси, но видимо придется как-то в цикле все делать
1с как через post метод передать массив
Подскажите как это сделать через пост запрос:
$data = array(
‘login’ => ‘client1’, // логин (обязательное поле)
‘token’ => ‘hash.token’, // код авторизации (обязательное поле)
‘comments_client’ => ‘comment к накл’, //комментарий к накладной
‘punkt_id’ => ‘Moskovskaya-A16’, // идентификатор ПВ (Moskovskaya-A16, Pionerskaya-K15k2)
‘orders’ => array(
// Заказ N2047 стоимостью 123р
array(
‘sku’ => ‘2047’, //номер заказа (обязательное поле)
‘price’ => 123, //сумма к оплате клиентом (обязательное поле)
‘buyer_phone’ => ‘123-34-45’, //тел. клиента
‘buyer_fio’ => ‘Владимир Петров’, //имя клиента
‘comment’ => ‘comment1’ //коммент к заказу
),
array(
‘sku’ => ‘2049’,
‘price’ => 1234,
‘payed’ => 1, //признак, что заказ предоплачен
‘buyer_phone’ => ‘123-56-89’,
‘buyer_delivery_needed’ => 1, // нужна доставка
‘buyer_address’ => ‘адрес’, // адрес доставки
‘buyer_delivery_time’ => ‘пожелания к дате/времени доставки’, // пожелания к дате/времени доставки
‘comment’ => ‘comment1’ //коммент к заказу
),
)
);
$post_body = http_build_query($data);
echo $post_body;
как передать параметры которые являются массивом?
пример кода можно?
Так посмотреть, как работает функция http_build_query() и оттуда уже плясать.
Пример #3. Пример использования http_build_query() с многомерными массивами.
http://php.net/manual/ru/function.http-build-query.php
так из 1С это как передать? )
(6) А что, у тебя пост 27 в Отправка POST запроса к 1С враги вырезали?
похоже долго разбираться придется, нужно до Пн сделать, есть желающие помочь? по стоимости пишите в ICQ.
(8) Фига се поворот событий.
просто нет у меня сейчас времени разбираться, сможешь помочь?
(10) Хм. Ну хоккей. Давай попробуем. Стучись в скайп или напиши на почту.
если это простой параметр, то можно сделать так:
WinHttp = Новый COMОбъект(«WinHttp.WinHttpRequest.5.1»);
WinHttp.Option(2,»utf-8″);
WinHttp.Open(«POST»,»http://public.services.dellin.ru/tracker/XML/»,0);
WinHttp.SetRequestHeader(«Accept-Language», «ru»);
WinHttp.SetRequestHeader(«Accept-Charset»,»utf-8″);
WinHttp.setRequestHeader(«Content-Language», «ru»);
WinHttp.setRequestHeader(«Content-Charset», «utf-8»);
WinHttp.setRequestHeader(«Content-type», «application/x-www-form-urlencoded; charset=utf-8»);
ПараметрыПОСТ = «rwID=» + СокрЛП(НомерНакладной);
WinHttp.Send(ПараметрыПОСТ);
ТекстОтвета = WinHttp.ResponseText();
а если параметр массив?
в пхп массив это строка
как передать блок «orders» — там массив из нескольких документов должен быть, как разделить разные документы?
как выглядит тело POST запроса:
если смотреть пример как должно выглядеть тело запроса, все заказы идут одной строкой
&orders%5B0%5D%5Bprice%5D=123 вопрос что это «%5B0%5D%5B» между orders и price для одного заказа оно одинаково, т.е. все заказы идут в строку с каким то разделителем между их параметрами
Боюсь, что параметр типа массив передать невозможно. Даже через XML, даже через SOAP. Во всяком случае два дня гугленья и изучение примеров на ИТС результата не дали. Остался одиноко висеть и мой вопрос на Мисте..
структра через XML передается без проблем, у параметра вложенные параметры со своими значениями, так я уже делал обмен заказами с DPD, но тут немного по другому .
(17) >> вопрос что это «%5B0%5D%5B» между orders и price для одного заказа оно одинаково
Мде. В (12) ты сам установил:
>>WinHttp.setRequestHeader(«Content-type», «application/x-www-form-urlencoded; charset=utf-8»);
А теперь так девственно. А «что это» (с).
Ну ладно. Переведу за тебя. Для всех твоих параметров, ты устанавливаешь тип x-www-form-urlencoded, при этом кодируешь их в кодировке utf-8. А т.к. у тебя массив, то сюрприз, надо ж как-то определить порядковый номер элемента массива. Как? —> «что это» (с).
(20) это не я, это был однин из примеров из инета )
я нев веб программист для меня это темный лес )
(20) так как правильно передать здесь элементы массива?
(23) Создаешь обычный файл. Кодируешь строчку параметров ручками. Затем набираешь в синтакст-помошнике HTTPСоединение и долго и нудно читаешь пример по методу ОтправитьДляОбработки. Потом не забудь написать о результатах. Потомки, нагуглившие это поклонются тебе 🙂
(24) >Затем набираешь в синтакст-помошнике HTTPСоединение и долго и нудно читаешь пример по методу ОтправитьДляОбработки
да знаю я про это, вопрос был в том как правильно параметры массива передать
(25) я надеюсь, я ответил как и ты понял ответ. Не так ли? 🙂 Нет больше вопроса «а что это?» (с) Или есть? :)))
(26) только не считай себя умником, так другие знают то о чем ты даже представления не имеешь))), я же сказал веб не моя область
(27) кстати, отлично поблагодарил за единственный дельный совет в ветке. Пожалуйста, если что.
(28) за совет спасибо, но не зазнавайся ), но я как раз нехотел все кодировать ручками поэтому и возникла тема как передавть параметры массива, все остальное было и так ясно примеров полно.
ФайлОтправки = Новый ЗаписьТекста(ИмяФайлаОтправки);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«content-disposition: form-data; name=»»login»»» + Символы.ВК + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«content-disposition: form-data; name=»»login»»» + Символы.ВК + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(login);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«content-disposition: form-data; name=»»token»»» + Символы.ВК + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«content-disposition: form-data; name=»»token»»» + Символы.ВК + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(token);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«content-disposition: form-data; name=»»comments_client»»» + Символы.ВК + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«content-disposition: form-data; name=»»comments_client»»» + Символы.ВК + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(comments_client);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«content-disposition: form-data; name=»»punkt_id»»» + Символы.ВК + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«content-disposition: form-data; name=»»punkt_id»»» + Символы.ВК + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(punkt_id);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«content-disposition: form-data; name=»»orders[» + Строка(Индекс) + «][sku]»»» + Символы.ВК + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(Формат(Заказ.Номер, «ЧЦ=11»));
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«content-disposition: form-data; name=»»orders[» + Строка(Индекс) + «][price]»»» + Символы.ВК + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(Формат(Заказ.Оплата, «ЧРД=.; ЧН=0; ЧГ=0»));
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«content-disposition: form-data; name=»»orders[» + Строка(Индекс) + «][payed]»»» + Символы.ВК + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(Формат(Заказ.Предоплачен, «БЛ=0; БИ=1»));
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«content-disposition: form-data; name=»»orders[» + Строка(Индекс) + «][buyer_phone]»»» + Символы.ВК + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(Заказ.Телефон);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«content-disposition: form-data; name=»»orders[» + Строка(Индекс) + «][buyer_fio]»»» + Символы.ВК + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(Заказ.КонтактноеЛицо);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ФайлОтправки.ЗаписатьСтроку(«content-disposition: form-data; name=»»orders[» + Строка(Индекс) + «][comment]»»» + Символы.ВК + Символы.ПС);
ФайлОтправки.ЗаписатьСтроку(Заказ.ДополнительнаяИнформация);
ФайлОтправки.ЗаписатьСтроку(«—My1cV8bNdr»);
ЗаголовокHTTP = Новый Соответствие();
ЗаголовокHTTP.Вставить(«Content-Type», «multipart/form-data; boundary=My1cV8bNdr»);
Попытка
Соединение.ОтправитьДляОбработки(ИмяФайлаОтправки, HTTPАдресСкрипта, ИмяФайлаОтвета, ЗаголовокHTTP);
Исключение
Сообщить(«Не удалось получить данные с сервера.Проверьте правильность адреса сервера,»
+ Символы.ПС + «а также настройки подключения к Интернет.»);
Возврат;
КонецПопытки;
1C отправить POST запрос с JSON файлом
Прикручивая очередную интеграцию, понадобилось мне значит отправить на веб-сервис сайта POST запрос с остатками товаров. Остатки товаров были аккуратно упакованы в JSON. В версиях платформы выше 8.3.6 делается очень просто. Задача вроде как и тривиальная, но все же вызвала некоторые сложности. \
- Формирование валидного JSON из результата запроса.
2. Отправка сформированного запроса на сайта
Итак начнем по порядку.
Формирование JSON из Результата запроса
Ниже приведу код и добавлю некоторые комментарии для того чтобы было понятно. Вначале мы переводим Результат Запроса в ТаблицуЗначений (ТЗ) , затем ТЗ в Массив Структур. И только затем полученный массив сериализуем в JSON. В общем ничего сложного, код предельно простой.
Функция СформироватьJSON(ИдАптеки) Если НЕ ЗначениеЗаполнено(ИдАптеки) Тогда ЗаписьЖурналаРегистрации(ИмяСобытияЖР, УровеньЖурналаРегистрации.Ошибка. "Не указан ИД Аптеки",); Возврат Неопределено; КонецЕсли; //Начинаем формирование прайса, сначала формируем остатки ЗаписьЖурналаРегистрации(ИмяСобытияЖР,УровеньЖурналаРегистрации.Информация. "Выполнение запроса остатков. "); Рез = ВыполнитьЗапросОстатков(); // Тут у нас будет ТЗ значений с результатами запроса КоличествоЗаписей = Рез.Количество(); ЗаписьЖурналаРегистрации(ИмяСобытияЖР, УровеньЖурналаРегистрации.Информация, , , "Запрос остатков выполнен. Количество записей: " + КоличествоЗаписей); Если КоличествоЗаписей = 0 Тогда Возврат Неопределено; КонецЕсли; // файл будем создавать в определенном каталоге на сервере, // Если файл уже имеется то удалим его Попытка УдалитьФайлы("D:\temp\","pills.json"); Исключение Сообщить(ОписаниеОшибки()); КонецПопытки; Запись = Новый ЗаписьJSON; ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON( ,Символы.Таб); Запись.ОткрытьФайл("D:\temp\pills.json". ПараметрыЗаписиJSON); НастройкиСериализации = Новый НастройкиСериализацииJSON; НастройкиСериализации.ФорматСериализацииДаты = ФорматДатыJSON.ISO; НастройкиСериализации.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДата; Данные = Новый Структура; Данные.Вставить("pharmacyCode", ИдАптеки); Данные.Вставить("pills", ТабЗначВМассив(Рез)); Данные.Вставить("dateCreate", ТекущаяДата()); Попытка ЗаписатьJSON(Запись, Данные, НастройкиСериализации); Запись.Закрыть(); Возврат Истина; Исключение ЗаписьЖурналаРегистрации(ИмяСобытияЖР,УровеньЖурналаРегистрации.Ошибка. "Прайс не сформирован, произошла ошибка " + ОписаниеОшибки()); Возврат Ложь; КонецПопытки;; КонецФункции Функция ТабЗначВМассив(ТаблицаЗначений) Экспорт НашМассив = Новый Массив; Для Каждого СтрокаТаблицы из ТаблицаЗначений Цикл НашаСтруктура = Новый Структура; Счетчик = 0; Для Каждого СтрокаСтруктуры из СтрокаТаблицы Цикл Если НЕ ТипЗнч(СтрокаСтруктуры) = Тип(ТаблицаЗначений) тогда НашаСтруктура.Вставить(ТаблицаЗначений.Колонки[Счетчик].Имя,СтрокаТаблицы[Счетчик]); Иначе НашаСтруктура.Вставить(ТаблицаЗначений.Колонки[Счетчик].Имя,ТабЗначВМассив(СтрокаСтруктуры)); КонецЕсли; Счетчик = Счетчик + 1; КонецЦикла; НашМассив.Добавить(НашаСтруктура); КонецЦикла; Возврат(НашМассив); КонецФункции
Отправка POST-запроса с JSON в 1с
Тут уже попотеть пришлось чуточку больше, так как данную задачу решал впервые, и быстрое гугление не дало результатов. Все примеры которые находил были разрозненны и по каким то причинам не работали. Возможно у меня руки не оттуда растут, не отрицаю.
Полученный на предыдущем этапе файл мы должны отправить. Делается это так.
Функция ОповеститьСервер(ФайлПрайса, URLСайта, Ресурс) Экспорт ФайлОтправки = Новый Файл(ФайлПрайса); РазмерФайлаОтправки = XMLСтрока(ФайлОтправки.Размер()); ЗаголовокЗапросаHTTP = Новый Соответствие(); // Передаем в заголовках размер и тип данных на отправку ЗаголовокЗапросаHTTP.Вставить("Content-Length", РазмерФайлаОтправки); ЗаголовокЗапросаHTTP.Вставить("Content-Type", "application/json; charset=utf-8"); HTTP = Новый HTTPСоединение(URLСайта,8000); //Адрес сайта и порт если потребуется. пример - http://localhost:8000 запросPOST = Новый HTTPЗапрос(Ресурс, ЗаголовокЗапросаHTTP); // адрес url веб-сервиса /api/v1/datafill/ запросPOST.УстановитьИмяФайлаТела(ФайлПрайса); Попытка //Отправляем для обрааботки на наш сервер ЗаписьЖурналаРегистрации(ИмяСобытияЖР, УровеньЖурналаРегистрации.Информация, , , "Начало отправки запроса"); ФайлРезультата = ПолучитьИмяВременногоФайла(); HTTPОтвет = HTTP.ОтправитьДляОбработки(запросPOST, ФайлРезультата); ТекстовыйФайлОтвет = Новый ТекстовыйДокумент; ТекстовыйФайлОтвет.Прочитать(ФайлРезультата,КодировкаТекста.UTF8); ОтветСервера = ТекстовыйФайлОтвет.ПолучитьТекст(); ОтветСервера = HTTPОтвет.ПолучитьТелоКакСтроку(); ЗаписьЖурналаРегистрации(ИмяСобытияЖР, УровеньЖурналаРегистрации.Информация, , , "Ответ сервера: " + ОтветСервера); Исключение ЗаписьЖурналаРегистрации(ИмяСобытияЖР, УровеньЖурналаРегистрации.Ошибка, , , "Ответ сервера: " + ОписаниеОшибки()); КонецПопытки; Возврат ОтветСервера; КонецФункции
Стоит отметить что данные будут отправлены в теле запроса, а не в параметрах POST.
Http запросы GET и POST в языке 1С 8. Примеры работы
В статье приводятся практические примеры работы с самыми часто используемыми HTTP запросами средствами языка 1С – GET и POST.
Общая информация
Для различного рода интеграций, обменов данными и взаимодействия между разными системами широко используется протокол http, и платформа 1С имеет ряд инструментов и объектов для работы с этим протоколом.
Основные объекты языка 1С, предназначенные для работы с протоколом http – HTTPСоединение, HTTPЗапрос и HTTPОтвет. Для организации работы через прокси-сервер используется объект ИнтернетПрокси, а для создания защищенного https-соединения существует объект ЗащищенноеСоединениеOpenSSL. Есть еще ряд объектов, которые могут применяться при работе с протоколом HTTP, но они используются достаточно редко, а потому в данной статье не рассматриваются.
HTTPСоединение отвечает за создание соединения с сервером по протоколу HTTP. Свойства этого объекта позволяют задать параметры авторизации, такие как логин, пароль и признак аутентификации ОС, а также параметры подключения – адрес сервера, порт, прокси, таймаут, и защищенное соединение. Методы объекта HTTPСоединение повторяют основные методы HTTP, такие как Get, Post, Put, Delete и др.
HTTPЗапрос позволяет задать заголовки, адрес запрашиваемого ресурса и тело запроса. Методы данного объекта предназначены для различных способов получения и установки тела запроса.
HTTPОтвет является результатом отправки запроса через соединение. В свойствах этого объекта будут содержаться ответные заголовки и код состояния, а методы предназначены для получения тела ответа в различном виде (например, как двоичные данные или в виде строки).
- Список заголовков HTTP
- Список кодов состояния HTTP
ИнтернетПрокси, как следует из названия, используется для указания настроек прокси-сервера. Для каждого протокола можно независимо указать параметры прокси-сервера при помощи метода Установить().
ЗащищенноеСоединениеOpenSSL используется для создания защищенного соединения OpenSSL. Есть возможность указать сертификат клиента и/или удостоверяющего центра, но в большинстве случаев, при организации доступа к обычным сайтам по протоколу HTTPS, сертификаты указывать не требуется.
Http запрос с использованием защищенного соединения
Защищенное подключение используется для соединения с сервером по протоколу https. В случае, если запрашиваемый ресурс требует наличия сертификатов, существует возможность указать как клиентский сертификат, так и сертификаты удостоверяющих центров. Есть несколько нюансов, на которые стоит обратить внимание.
Объект клиентского сертификата СертификатКлиентаФайл (с приватным ключом), загружается из файла с форматом :
*.PFX; *.P12 – файл сертификата формата P12;
*.PEM – файл сертификата формата PEM.
по умолчанию – файл сертификата формата PEM.
Объект клиентского сертификата СертификатКлиентаWindows загружается из системного хранилища сертификатов операционной системы MS Windows.
// Для большинства интернет-сайтов сертификаты указывать не требуется. // При необходимости следует задать сертификат для клиента и/или для удостоверяющих центров. // ssl = Новый ЗащищенноеСоединениеOpenSSL(Новый СертификатКлиентаWindows(), Новый СертификатыУдостоверяющихЦентровWindows()); ЗащищенноеСоединение = Новый ЗащищенноеСоединениеOpenSSL(); БезопасноеСоединение = Новый HTTPСоединение("yandex.ru",443,,,,,ЗащищенноеСоединение); Ответ = БезопасноеСоединение.Получить(Новый HTTPЗапрос("/")); Если Ответ.КодСостояния = 200 Тогда Сообщить(Ответ.ПолучитьТелоКакСтроку()); КонецЕсли;
Использование заголовков в http запросах в языке 1С
Для передачи кукис (Cookie), кэширования, хранения данных пользовательской сессии, выполнения запроса с указанием конкретного браузера, и для многих других целей, используются заголовки http запросов. Заголовки – это обычное соответствие, с парами Ключ: Значение. Помимо стандартных заголовков разработчик может передавать свои собственные, если это предусмотрено логикой принимающего сервера.
Соединение = Новый HTTPСоединение("yandex.ru",443,,,,,Новый ЗащищенноеСоединениеOpenSSL()); Заголовки = Новый Соответствие; Заголовки.Вставить("User-Agent", "Mozilla/5.0 (X11; Linux i686; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"); Заголовки.Вставить("Cookie", "id=12345"); Ответ = Соединение.Получить(Новый HTTPЗапрос("/", Заголовки));
Получить страницу сайта при помощи http запроса GET
Get-запросу в языке 1С соответствует метод Получить(). Для большинства современных сайтов необходимо использовать защищенное соединение.
// Подключение к сайту 1c.alexcode.ru. // Новый HTTPСоединение(, , , , , , , ) СоединениеHTTP = Новый HTTPСоединение("1c.alexcode.ru", 443,,,,, Новый ЗащищенноеСоединениеOpenSSL()); // Получение текста главной страницы через запрос. ЗапросHTTP = Новый HTTPЗапрос("/"); // Можно указать любую нужную страницу например, "/about" или "/contacts" Ответ = СоединениеHTTP.Получить(ЗапросHTTP); // Get запрос Если Ответ.КодСостояния = 200 Тогда Сообщить(Ответ.ПолучитьТелоКакСтроку()); //получим HTML-код страницы Иначе Сообщить("Код ответа: "+Ответ.КодСостояния); //анализируем код состояния и делаем выводы КонецЕсли;
Сохранить картинку с сайта через GET-запрос
При помощи http протокола можно получать не только текстовые данные (html, json, xml и т.п.), но и другие объекты, доступные по url адресу – медиа-файлы, картинки и другие ресурсы. Рассмотрим пример получения логотипа компании 1С:
Соединение = Новый HTTPСоединение("static.1c.ru"); Запрос = Новый HTTPЗапрос("/images/logo.png"); // Вариант 1. Укажем имя выходного файла. // Используются обычные слэши ПутьДляСохранения = "C:/1c_logo.png"; Ответ = Соединение.Получить(Запрос, ПутьДляСохранения); // Вариант 2. Получим из ответа двоичные данные // В Windows используются обратные слэши, в Unix-подобных системах (Linux) - обычные слэши // После их можно обработать, сохранить в ХранилищеЗначений в базу данных, // либо сохранить их также в файл ПутьДляСохранения = "C:\1c_logo_2.png"; Ответ = Соединение.Получить(Запрос); Ответ.ПолучитьТелоКакДвоичныеДанные().Записать(ПутьДляСохранения);
Как обработать перенаправление (redirect) http запроса в 1С
Переадресация при http запросе может возникнуть по разным причинам. Самые популярные:
- смена адреса запрашиваемого ресурса (например, изменили название статьи, и вместе с ним – адрес)
- переадресация с www
- редирект с http на https
При переадресации сервер возвращает в заголовках параметр Location, в котором указано новое назначение.. Далее разработчик может проанализировать эту строку, выделить сервер, путь к ресурсу, логин и пароль, и сформировать новый запрос. Следует иметь в виду, что редиректов может быть несколько, и переадресация будет идти по цепочке. Рассмотрим простой пример переадресации с незащищенного соединения на безопасное по протоколу https:
СоединениеHTTP = Новый HTTPСоединение("1c.alexcode.ru", 80); ЗапросHTTP = Новый HTTPЗапрос("/"); Ответ = СоединениеHTTP.Получить(ЗапросHTTP); Если Ответ.КодСостояния = 200 Тогда Сообщить(Ответ.ПолучитьТелоКакСтроку()); //получим HTML-код страницы ИначеЕсли Ответ.КодСостояния = 301 Тогда // постоянная переадресация Сообщить(Ответ.Заголовки.Получить("Location")); //куда нас отправляют // СтруктураURI - служебная функция, которая раскладывает адресную строку // и возвращает удобную структуру с параметрами подключения. URI = СтруктураURI(Ответ.Заголовки.Получить("Location")); Если URI.Схема = "https" Тогда // обработаем перенаправление на защищенное соединение БезопасноеСоединение = Новый HTTPСоединение(URI.ИмяСервера,443,,,,,Новый ЗащищенноеСоединениеOpenSSL()); //путь к ресурсу также возьмем из структуры URI Ответ = БезопасноеСоединение.Получить(Новый HTTPЗапрос(URI.ПутьНаСервере)); Если Ответ.КодСостояния = 200 Тогда Сообщить(Ответ.ПолучитьТелоКакСтроку()); КонецЕсли; КонецЕсли; Иначе Сообщить("Код ответа: "+Ответ.КодСостояния); КонецЕсли;
&НаКлиенте Функция СтруктураURI(Знач СтрокаURI) Экспорт СтрокаURI = СокрЛП(СтрокаURI); Схема = ""; Позиция = Найти(СтрокаURI, "://"); Если Позиция > 0 Тогда Схема = НРег(Лев(СтрокаURI, Позиция - 1)); СтрокаURI = Сред(СтрокаURI, Позиция + 3); КонецЕсли; СтрокаСоединения = СтрокаURI; ПутьНаСервере = ""; Позиция = Найти(СтрокаСоединения, "/"); Если Позиция > 0 Тогда ПутьНаСервере = Сред(СтрокаСоединения, Позиция + 1); СтрокаСоединения = Лев(СтрокаСоединения, Позиция - 1); КонецЕсли; СтрокаАвторизации = ""; ИмяСервера = СтрокаСоединения; Позиция = Найти(СтрокаСоединения, "@"); Если Позиция > 0 Тогда СтрокаАвторизации = Лев(СтрокаСоединения, Позиция - 1); ИмяСервера = Сред(СтрокаСоединения, Позиция + 1); КонецЕсли; Логин = СтрокаАвторизации; Пароль = ""; Позиция = Найти(СтрокаАвторизации, ":"); Если Позиция > 0 Тогда Логин = Лев(СтрокаАвторизации, Позиция - 1); Пароль = Сред(СтрокаАвторизации, Позиция + 1); КонецЕсли; Хост = ИмяСервера; Порт = ""; Позиция = Найти(ИмяСервера, ":"); Если Позиция > 0 Тогда Хост = Лев(ИмяСервера, Позиция - 1); Порт = Сред(ИмяСервера, Позиция + 1); КонецЕсли; Результат = Новый Структура; Результат.Вставить("Схема", Схема); Результат.Вставить("Логин", Логин); Результат.Вставить("Пароль", Пароль); Результат.Вставить("ИмяСервера", ИмяСервера); Результат.Вставить("Хост", Хост); Результат.Вставить("Порт", ?(Порт > "", Число(Порт), Неопределено)); Результат.Вставить("ПутьНаСервере", ПутьНаСервере); Возврат Результат; КонецФункции
Использование прокси сервера для http запросов в 1С
Интернет-прокси может использоваться для соединения по различным протоколам: http, https, ftp и ftps. Для каждого протокола необходимо вызвать метод Установить() с указанием нужных параметров – логина, пароля, адреса Proxy-сервера и т.д.
Прокси = Новый ИнтернетПрокси; Прокси.Установить("http", "hostname", 8000, "login", "password"); //Прокси.Установить("https", "hostname", 8000, "login", "password"); Соединение = Новый HTTPСоединение("example.com",,,,Прокси); Ответ = Соединение.Получить(Новый HTTPЗапрос);
Использование http запросов типа POST в 1С 8
Запросы Post широко применяются в том случае, когда нужно передать на сервер какие-то данные для дальнейшей обработки – провести авторизацию, загрузить файл, передать большой массив данных в качестве параметров, и т.п.
Get запросы также имеют возможность параметризации, но длина адресной строки ограничена 2048 символами. Поэтому, если, например, вам нужно передать в качестве параметров 1000 наименований номенклатуры или 1000 электронных адресов сотрудников, для этого отлично подойдет post запрос. Post запрос отличается от запроса get тем, что помимо строки запроса и заголовков, имеет еще и тело запроса.
В языке 1С запросу POST соответствует метод ОтправитьДляОбработки(). Средствами языка 1С тело запроса может быть установлено из файла, из строки либо из двоичных данных.
Тип передаваемых данных указывается заголовком Content-Type