Как перевести запрос curl в запрос на 1с
cURL (расшифровывается как Client URL) — программное обеспечение, которое предоставляет библиотеку libcurl и инструмент командной строки curl. Возможности cURL огромны, во многих опциях легко потеряться.
Команда curl запускается из командной строки и предустановлена в большинстве дистрибутивов Linux.
Варианты применения:
- доступ без браузера;
- внутри shell-скриптов;
- для тестирования API.
В основном я использовал curl для тестирования API, иногда просто вставляя команды, которые нашел в интернете. Но я хочу разобраться в curl и лучше понять его особенности. Так что поделюсь некоторыми командами, с которыми столкнулся во время работы.
Есть два варианта этой команды.
Еще можно скачать несколько файлов одной командой, хотя в мануале так делать не рекомендуют.
Если вы хотите посмотреть, какие заголовки отдает сервер, то можно использовать опции -I или -head. Они позволяют получить заголовок без тела документа.
Когда вы тестируете веб-приложение или API, то в вашем тестовом окружении могут быть самоподписанные или неправильные SSL-сертификаты. По умолчанию curl верифицирует все сертификаты. Чтобы он не выдавал ошибку о неверных сертификатах и устанавливал соединение для тестирования, используйте опцию -k или -insecure.
API защищено авторизацией по логину-паролю — вы можете передать пару логин-пароль, используя параметр -u или --user. Если просто передать логин, то curl запросит пароль в командной строке. Используете параметр несколько раз — для авторизации на сервер будет передано только последнее значение.
О возможности загрузки файла через curl я узнал недавно. Не был уверен, что это возможно, но, по всей видимости, это так: curl с опцией -F эмулирует отправку заполненной формы, когда пользователь нажимает кнопку отправки. Опция указывает curl передавать данные в виде POST-запроса, используя multipart / form-data Content-Type.
Вы можете загрузить несколько файлов, повторяя параметр -F.
Вы можете использовать опцию -w для отображения информации в stdout после завершения передачи. Она поддерживает отображение набора переменных. Например, можно узнать общее время, которое потребовалось для успешного выполнения запроса. Это удобно, если вам нужно определить время загрузки или скачивания с помощью curl.
Это некоторые из опций, которые можно использовать с curl. Надеюсь, информация была вам полезна и статья понравилась.
Вам не кажется, что это продолжение старого разговора, в котором мы уже достаточно прояснили позиции друг-друга ? :)
Уже обсуждали же это, если пытаться из кажого пустяка содрать с заказчика три шкуры, то люди сюда ходить не будут, имеено из-за ощущения, что здесь сидят одни живодёры, мечтащие нажиться на их незнании. Думаю, такой вариант развития событий отнюдь не в интересах ресурса.
Примеров, когда заказчик просит здесь сделать то, что есть в стандартном фунционале более, чем хватает.
В данном случае заказчик Я В Н О указал в своей заявке:
"Вся обработка видимо не нужна, нет понимания как сделать " -F name"."
То есть, заказчик сам не понимает, что ему нужно, вся суть его впороса в именно в том, как сделать требуемое, но "обработка ему не нужна".
Ну, наверное, ему нужно моральное сочувствие, подавайте завяки на выполнение :)
Я с вами согласен, что ему надо было не заявку публиковать, раз ему "обработка не нужна", а вопрос на формуме, но это уже не моя проблема, что он сделал иначе, либо модераторы должны были перенести его заявку туда, но опять же - это не моя беда, я пытаюсь помочь человеку в С Т Р О Г О М соответствии с его запросами, там, где он опубликовал свой запрос.
Дело все в том, что это противоречит правилам сайта. Вспомнил, что один раз меня уже банили за ссылку в комментах.
Дело все в том, что это противоречит правилам сайта. Вспомнил, что один раз меня уже банили за ссылку в комментах.
Нужны ли ресурсу такие правила, из-за которых заказчики не будут сюда ходить ?
Кроме того, помимо буквы закона есть ещё и дух закона, и общепринятая юридическая мудрость чётко рекомендует руководствоваться духом закона, а не его буквой, во избежании принятия абсурдных решений.
Так вот дух данного ресурса отражён в преамбуле, которая встречает любого зашедшего на него, на первой странице:
"Главное — это ваше желание получить помощь по 1С. За право ее оказать борются программисты и специалисты 1С из всех стран СНГ, которые делают вам самые выгодные предложения. В итоге вы гарантированно решаете свои задачи по самой приемлемой для Вас цене без посредников, переплат и комиссий. "
замечательная фраза, не правда ли ? Проникновенная.
Вот только, если целью ресурса является обязательное сдирание с заказчика денег за любой чих ( а так же за его отсутствие, что бы было не повадно не чихать) - то надо преамубулу переписать, и указать, что целью ресурса является не "помощь", а возмоность содрать с заказчика максимум денег, вне зависимости от его реальных потребностей.
То есть, грубо говоря, переписать так:
"Главное — это ваше обязанность заплатить нам много денег за ваши проблемы с 1С. За право вас обобрать борются программисты и специалисты 1С из всех стран СНГ, которые делают вам самые невыгодные предложения. В итоге вы гарантированно решаете свои задачи(или не решаете) по самой неприемлемой для Вас цене без посредников, переплат и комиссий(мы и так с вас три шкуры сдерем, зачем на с кем-то делится). "
Сформированный URL-адрес вводим в браузер. После нажатия Enter скачается файл или отобразится содержимое в формате JSON. Этот файл можно открыть блокнотом и посмотреть что он содержит.
Создаем php файл с текстом:
// Проверка наличия ошибок
if ($output === FALSE)
echo "cURL Error: " . curl_error($ch);
>
//Выводим сервисную информацию по выполнению запроса
$info = curl_getinfo($ch);
echo 'Took ' . $info['total_time'] . ' seconds for url ' . $info['url'];
// Очистка ресурсов
curl_close($ch);
*/
echo "
";
echo "
";
$obj = json_decode ( $output , true );
echo "Выводит все содержимое JSON";
echo "
";
var_dump ( $obj ); // Выводит все содержимое JSON в браузер
echo "
";
echo "
";
echo "Выводит одну запись из массива JSON";
echo "
";
$Code = $obj [1]['Code'];
echo $Code ;
echo "
";
$Naim = $obj [1]['Naim'];
echo $Naim ;
echo "
";
echo "
";
echo "Выводит циклически из массива JSON все записи";
echo "
";
foreach ( $obj as $key => $value)
<
foreach ( $obj [ $key ] as $key => $value )
<
echo $key .':'. $value . PHP_EOL ;
echo "
";
>
>
?>
Результат выполнения
/*
//Первый способ
// Получение файла JSON используя file_get_contents($url)
//отправляем запрос с параметрами
$username = "Администратор";
$password = "1";
$auth = base64_encode("$username:$password"); //Создаем строку авторизации
//по типу Basic auth, для авторизации в веб-сервисе
$context = stream_context_create([
'http' => [
'method' => "GET",
'header' => "Authorization: Basic $auth"
]
]);
$url ='http://localhost/test/hs/ob/OblistAll';
$output = file_get_contents($url, false, $context);
*/
//Второй способ
//Получение файла JSON используя curl
//Авторизация
$username = "Администратор";
$password = "1";
$host_api font-size: medium;">localhost /test";
$ch = curl_init ( $host_api );
// Проверка наличия ошибок
if ( $output === FALSE )
<
echo "cURL Error: " . curl_error ( $ch );
>
//Выводим сервисную информацию по выполнению запроса
$info = curl_getinfo ( $ch );
echo 'Took ' . $info ['total_time'] . ' seconds for url ' . $info ['url'];
// Очистка ресурсов
curl_close ( $ch );
echo "
";
echo "
";
$obj = json_decode ( $output , true );
echo "Выводит все содержимое JSON";
echo "
";
var_dump ( $obj ); // Выводит все содержимое JSON в браузер
echo "
";
echo "
";
echo "Выводит одну запись из массива JSON";
echo "
";
$Code = $obj [1]['Code'];
echo $Code ;
echo "
";
$Naim = $obj [1]['Naim'];
echo $Naim ;
echo "
";
echo "
";
echo "Выводит циклически из массива JSON все записи";
echo "
";
foreach ( $obj as $key => $value)
<
foreach ( $obj [ $key ] as $key => $value )
<
echo $key .':'. $value . PHP_EOL ;
echo "
";
>
>
?>
GET запросы в 1С 8.3
Принцип работы GET запроса очень прост. После соединения с сервером происходит отправка заголовка запроса, и, если запрос одобрен, отправителю возвращается ответ, содержащий тело с содержимым запрашиваемого ресурса.
Отличительной особенностью GET запроса является отсутствие тела запроса, наличествуют только заголовки.
Для начала рассмотрим вопрос, как же нам сформировать сам текст запроса. На самом деле в отношении файла с картинкой это совсем не сложно. Воспользуемся инструментами браузера. Я буду использовать Оперу, в Вашем браузере процесс может несколько отличаться, но принцип один.
Итак, нажимаем правой кнопкой мышки на логотип и выбираем «Посмотреть код элемента»:
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Откроется окно с кодом, где нас интересует тэг img src= и далее адрес картинки:
Вот этот адрес и нужно скопировать. В разных браузерах по-разному можно это сделать, в Опере это проще всего сделать, перейдя сначала в режим редактирования (правая кнопка мышки – Edit attribute).
Теперь разберем ее на две части:
-
– это наш сервер;
- /wp-content/themes/govpress-new/images/GOODWILL.jpg – это и есть текст запроса.
Теперь можно переходить к написанию кода. Я приведу весь код сразу, целиком. А пояснения будут в комментариях. Готовую обработку можно скачать здесь.
POST запросы в 1С 8.3
POST запросы кроме заголовков могут содержать еще и тело. Тем самым они предоставляют гораздо большие возможности, чем GET запросы. Они широко применяются, например, для авторизации на ресурсе и последующих действий. Также с помощью POST запросов можно запускать сложные процессы, зависящие от входящих данных, и так далее. Кроме того, POST запросы бывают двух типов:
Практический пример я рассматривать не буду, так как область применения POST запросов очень обширна и, как правило, связана со сложными процессами, достойными отдельной разработки. Я дам лишь пример общей схемы работы с такими запросами. Если у Вас возникнут вопросы или затруднения, мы всегда рады ответить на вопросы или выполнить разработку под заказ.
Итак, отправка POST запроса средствами платформы 1С: Предприятие 8.3 осуществляется следующим образом:
Если Вы начинаете изучать 1С программирование, рекомендуем наш бесплатный курс (не забудьте подписаться на YouTube — регулярно выходят новые видео):
Все примеры реализованы в тестовой конфигурации, загрузить которую Вы можете по ссылке в конце статьи. Конфигурация работает с версиями платформы 8.2 и выше.
GET-ЗАПРОС
Структура метаданных обработки для выполнения GET-запросов |
Форма обработки выполнения GET-запроса для скачивания файла из 1С:Предприятия |
В поле "Сервер запроса" вводим адрес сервера, с которого будем загружать файл. В поле "Текст запроса" копируем часть ссылки, идущую после имени сервера. Т.е. если ссылка:
На скриншоте выше поля содержат адрес сервера и ссылку для скачивания тестовой картинки PNG с сайта www.develplatform.com. Что это за картинка Вы можете узнать скачав тестовую конфигурацию и выполнив GET-запрос по кнопке "Выполнить запрос" на форме.
Поле "Расширение выходного файла" позволяет указать программе какой тип файла будет загружен, чтобы уже в диалоге выбора пути к сохраняемому файлу можно было бы установить фильтр по этому расширению. Его заполнять не обязательно.
Далее представлен программный код для выполнения GET-запроса на скачивание файла и последующее сохранение загруженного файла на диске:
Код, непосредственно относящийся к выполнение GET-запроса, пометил в комментариях как ". ". Общий принцип такой: сначала создаем класс HTTP-соединения с заданным адресом сервера. После этого выполняем метод "Получить()" для указанного адреса на этом сервере в первом параметре. Во втором параметре указываем путь, по которому будет сохранен загруженный файл. Если оставить только непосредственно относящийся к GET-запросу код, то мы увидим следующее:
POST-ЗАПРОС
Далее рассмотрим общий принцип формирования POST-запросов средствами платформы 1С:Предприятие, а также разные форматы передаваемых запросом данных (SOAP и JSON) на примере взаимодействия с сервисами Yandex.
Отправка средствами платформы
Отличие от GET-запроса - это объявление заголовков и тела запроса. Подробно описывать нет смысла, ход действий должен быть понятен по комментариям в коде выше.
Рассмотрим на практике применение POST-запросов для платформы 1С:Предприятие с использованием разных форматов данных, передаваемых в теле запроса.
В разных форматах
Примеры отправки POST-запросов будут демонстрироваться для работы с сервисами Yandex'a: Yandex.Direct и Yandex.Wordstat. В рамках статьи мы не будем подробно рассматривать реализацию аутентификации на этих сервисах, самостоятельно пример Вы сможете посмотреть в тестовой конфигурации к статье. Отмечу лишь некоторые моменты, чтобы Вы смогли использовать собственный аккаунт на Яндексе, чтобы посмотреть примеры из статьи.
Первое, что вам нужно сделать - это включить использование профессионального интерфейса для сервиса Yandex.Direct, чтобы стала доступна работа через API. Какой интерфейс использовать сервис спросит Вас в самом начале. Подробнее написано в справке Директа или на форуме.
Сохраняем идентификатор приложения в тестовой конфигурации |
И последний шаг - это получение токена доступа. Для этого достаточно запустить обработку авторизации и при необходимости войти в аккаунт Яндекса. Токен будет получен автоматически!
Согласно руководству разработчика Yandex.Direct поддерживает два способа взаимодействия через API: через SOAP или JSON. Рекомендуется использовать последний, но для примера выполним один из методов Директа с использованием SOAP, отправив тело POST-запросом.
Пусть это будет метод "PingAPI", проверяющий доступность сервиса. Вот так выглядит программный код для вызова метода:
Принцип тот же, что и для обычного POST-запроса. Содержимое тела запроса формируется следующей функцией:Формирование тела POST-запроса в формате SOAP для выполнения метода "PingAPI" Яндекс.Директ |
Ответ Яндекс.Директ для метода PingAPI в формате SOAP |
JSON - это текстовый формат обмена данными, основанный наJavaScript и обычно используемый именно с этим языком. Как и многие другие текстовые форматы, JSON легко читается людьми.
В рамках статьи не будем касаться серилизации и десериализации типов данных 1С:Предприятия и JSON. Будем использовать готовую разработку Александра Переверзева, которую можно скачать в его блоге. Созданный им парсер и серилизатор позволяет за короткое время создать алгоритмы по отправке и приему данных в формате JSON.
В примере мы создадим обработку, которая будет получать статистику по запросам сервиса Yandex.Wordstat за последний месяц. Функционал обработки следующий:
Форма обработки для получения статистики Yandex.Wordstat |
В поле "Поиск" вводим фразу, нажимаем "Получить статистику" и через некоторое время в табличных частях появляется статистика по ключевым фразам, где участвует введенная фраза, и статистика по связанным запросам. Вот так выглядит программный код команды по получению статистики запросов Yandex.Wordstat:
Рассматривать каждый из методов мы не будем, подробнее о них Вы можете узнать в официальной документации по ссылкам выше.
Подробнее посмотреть принцип работы алгоритмов работы с JSON Вы можете в тестовой конфигурации или в блоге Александра Переверзева.
Пример рабочий, статистику получает без проблем! Но столкнулся с проблемой, решение которой не нашел. Если искать статистику, не вводя кириллицу - все работает отлично! Стоит только ввести русские буквы, сразу возникают проблемы с кодировками.
Проблему решил отказавшись от использования собственных средств платформы для отправки POST-запросов.
РЕШЕНИЕ ПРОБЛЕМЫ
- // Параметры: server - сервер для отправки запроса
- // service - ссылка на сервис сервера
- // fileWithJSON - путь к файлу с телом запроса
- // Туда же и поместится ответ сервера
- // timeout - время ожидания ответа от сервера
- public static void SendQuery( string server, string service, string fileWithJSON, int timeout)
- try
- string json = System.IO.File.ReadAllText(fileWithJSON);
- byte [] body = Encoding.UTF8.GetBytes(json);
- HttpWebRequest request =
- (HttpWebRequest)WebRequest.Create( "https://" + server + service);
- request.Timeout = timeout;
- request.Method = "POST" ;
- request.ContentType = "application/json" ;
- request.ContentLength = body.Length;
- using (Stream stream = request.GetRequestStream())
- stream.Write(body, 0, body.Length);
- stream.Close();
- >
- string answer = "" ;
- using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
- using (StreamReader stream =
- new StreamReader(response.GetResponseStream(), Encoding.UTF8))
- answer = stream.ReadToEnd();
- >
- response.Close();
- >
- string [] lines = < answer >;
- System.IO.File.WriteAllLines(fileWithJSON, lines);
- >
- catch (Exception ex)
- string info = "[ERROR]: " + ex.Message;
- string [] lines = < info >;
- System.IO.File.WriteAllLines(fileWithJSON, lines);
- >
- >
Пример использования утилиты Вы можете посмотреть в тестовой конфигурации, подробно рассматривать ее работу не буду, т.к. это выходит за рамки статьи.
В обработке получения статистики Yandex.Wordstat в тестовой конфигурации можно использовать как встроенные средства платформы, так и написанную мной утилиту. Выбор осуществляется на форме обработки:Выбор режима отправки POST-запроса |
ЗАКЛЮЧЕНИЕ
Интеграция - вот где может стать незаменимым использование GET и POST-запросов в платформе 1С:Предприятие 8.x.
В статье мы рассмотрели их использование для работы с сервисами Yandex.Direct и Yandex.Wordstat. Разобравшись в теме можно настраивать интеграцию с любыми сервисами, предоставляющими API. Тот же Google использует похожую схему авторизации и работу посредством POST-запросов в формате JSON или SOAP. Пример GET-запроса продемонстрировал как выполнить скачивание файла с веб-сервера.
4 комментария:
Тестовой конфы нет.
Тестовая конфа будет?
Меня зовут господин Бенжамин. И твои деньги у меня. Ты их больше не увидишь, а сам я уже в Австралии.
Спасибо за сотрудничество. Удачи!
Читайте также: