Перейти к содержимому


Фотография

Библиотека "web": продвинутый аналог "internet.lua"

http-запросы интернет

  • Авторизуйтесь для ответа в теме
Сообщений в теме: 6

#1 Оффлайн   ECS

ECS
  • Гуру
  • Сообщений: 161
  • Уровень сигнала: 0,04%
  • В игре: 0 час. 13 мин.
  • ГородСанкт-Петербург

Награды

      7               

Отправлено 24 Ноябрь 2017 - 12:26

*
Популярное сообщение!

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

  • Рекурсивная сериализация Lua-таблиц в формат URL-кодированной строки
  • Обработка серверных ошибок по принципу "success, reason" без необходимости использовать pcall в каждой программе
  • Возможность прямой загрузки файлов с сервера в указанную директорию
  • Возможность исполнения файла по URL как Lua-программы
  • Поддержка ручной почанковой обработки загружаемых данных

Команда для загрузки:

wget https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/lib/web.lua /lib/web.lua -f

web.serialize( string/table data ): string serializedData

Преобразует входной аргумент в сериализованную строку, соответствующую спецификации HTTP-запросов. Помимо строк и чисел поддерживаются также таблицы с множеством вложенных таблиц:

print(
  web.serialize({
    string = "Hello world",
    number = 123,
    array = {
      arrayString = "Meow",
      arrayInArray = {
        arrayInArrayNumber = 456
      }
    }
  })
)

Результат:

II7HHlL.png?1

web.encode( string data ): string encodedData

 

Экранирует специальные символы, делая строку подходящей для осуществления запросов с множеством специфических данных:

print(
  "http://buttex.ru/test.php?message=" .. web.encode(
    "Привет, как дела?"
  )
)

Результат:
 
C2cKdxv.png?1
 
web.request( string url, [string/table postData, table headers] ): string result, string reason

 

Всем знакомый запрос к указанной URL, возвращающий строковый ответ с сервера. При указании аргумента postData сервер получит соответствующие данные в POST-массив, а при указании headers он получит кастомные заголовки.
 
Для примера я создал PHP-скрипт на домашнем сайте, возвращающий GET/POST-данные запроса, так мы сможем легко отслеживать успешность передачи содержимого:

<?php
  echo("\nСодержимое 'GET':\n");
  print_r($_GET);

  echo("\nСодержимое 'POST':\n");
  print_r($_POST);
?>

Если требуется осуществить обращение к серверу, принимающему исключительно GET-запросы, используем сериализацию данных для удобства и присоединим результат к исходной URL:

local result = web.request(
  "http://buttex.ru/test.php?" .. web.serialize({
    string = "Hello",
    number = 123
  })
)

print(result)

В результате сервер вернул переданные данные GET-запроса:
 
7fHaaUx.png?1

Осуществим POST-запрос к скрипту, указав таблицу в качестве аргумента postData:

local result = web.request(
  "http://buttex.ru/test.php", {
    string = "Hello",
    number = 123
  }
)

print(result)

Теперь сервер вернул переданные данные POST-запроса:
 
iTnImzR.png?2

web.download( string url, string path ): boolean result, string reason

Метод для загрузки файла по URL в указанную директорию. Возвращает true в случае успеха и false, reason в случае неудачи. К примеру, следующий код загрузит в корень диска программу "матрица":

web.download("https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Screensavers/Matrix.lua", "/matrix.lua")

web.run( string url, ... ): ...

Крайне полезная фича для быстрого запуска файла в виде Lua-программы, в которую передаются все указанные через "..." аргументы. Возвращает данные скрипта в случае успеха и false, reason в случае неудачи. Для примера запустим все ту же "матрицу:

print(
  web.run(
    "https://raw.githubusercontent.com/IgorTimofeev/OpenComputers/master/Screensavers/Matrix.lua"
  )
)

Результат:

bBKVAYc.png?1

web.rawRequest( string url, string/table postData, table headers, function chunkHandler, [int chunkSize]): boolean result, string reason

Напоследок метод, позволяющий осуществить ручную обработку загружаемых данных почанково. Для примера напишем программу, выдающую содержимое страницы vk.com через print() маленькими порциями по 20 символов. Разумеется, никаких postData и headers указывать не требуется:

print(
  web.rawRequest(
    "https://vk.com/",
    nil,
    nil,
    function(chunk)
      print(chunk)
    end,
    20
  )
)

Результат:
 
BJx4Mfr.png?1


Сообщение отредактировал ECS: 25 Ноябрь 2017 - 00:19


#2 Оффлайн   Laine_prikol

Laine_prikol
  • Пользователи
  • Сообщений: 123
  • Уровень сигнала: 0,67%
  • В игре: 4 час. 6 мин.

Награды

        

Отправлено 26 Ноябрь 2017 - 09:40

это типа LuaSocket для OC?



#3 Оффлайн   ECS

ECS
  • Автор темы
  • Гуру
  • Сообщений: 161
  • Уровень сигнала: 0,04%
  • В игре: 0 час. 13 мин.
  • ГородСанкт-Петербург

Награды

      7               

Отправлено 26 Ноябрь 2017 - 11:08

это типа LuaSocket для OC?
 

Нет, что ты. Это банально более функциональный враппер к интернет-компоненту для упрощенной работы с HTTP-хендлом



#4 Оффлайн   Kartze

Kartze
  • Пользователи
  • Сообщений: 433
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Отправлено 03 Декабрь 2017 - 19:12

Работы Игоря всегда поражали меня. Они, блин, для меня, простого смертного, такие... черт, такое чувство, когда смотришь на что-то... совершенное, идеальное. Короче, как всегда, на высоте с:



#5 Оффлайн   Fingercomp

Fingercomp
  • Гуру
  • Сообщений: 1 958
  • Уровень сигнала: 187,35%
  • В игре: 1148 час. 24 мин.

Награды

                                               

Отправлено 03 Декабрь 2017 - 20:53

Я не знаю, почему эту либу считают объектом поклонения, чем-то высоким и совершенным. Да, это полезно, чтобы не думать, а сразу брать готовое. Но это же ведь просто обёртка. Это же ведь просто поэтапная обработка ошибок. Это же ведь 100 строчек — и вся либа. Если кто-то вообще когда-либо читал что-то с сокета в OC, он бы сделал то же самое; он обязан сделать то же самое, иначе бы ничего не работало, ну или бы крашилось всё через раз.
 
Но 10 лайков стоят, тем не менее: либа полезна, да, доки расписаны адекватно, согласен, — немногие осиливают форматирование (или же всё красным жирным шрифтом пишут, чтобы внимание привлечь) и могут писать на техническом русском языке без путания мысли; ничего против автора не имею, ценю труды и очень уважаю за офигенные и сложные либы, которые он выкладывал сюда, — но это уже какой-то культ строится.

 

Но спасибо за некостыльный враппер.



#6 Оффлайн   Alex

Alex
  • Администраторы
  • Сообщений: 3 576
  • Уровень сигнала: 30,09%
  • В игре: 184 час. 25 мин.

Отправлено 03 Декабрь 2017 - 21:38

Я не знаю, почему эту либу считают объектом поклонения

ну не расстраивай Сейнта. :)  Хочет он, смертный человек, поклоняться либе и богам луа, пусть поклоняется. Может он пока просто не нашел в жизни более совершенного объекта поклонения, чем этот врапер.



#7 Оффлайн   FelixBanan

FelixBanan
  • Пользователи
  • Сообщений: 46
  • Уровень сигнала: 0%
  • В игре: 0 час. 0 мин.

Награды

           

Отправлено 10 Декабрь 2017 - 00:00

Если кто-то вообще когда-либо читал что-то с сокета в OC, он бы сделал то же самое; он обязан сделать то же самое, иначе бы ничего не работало, ну или бы крашилось всё через раз.

 

эти 100 строчек которые написал Игорь взяли и упростили жизнь многим новичкам и больше свободного времени будет у других разработчиков. Как по мне либа полезная, хоть и простая







Темы с аналогичным тегами http-запросы, интернет

Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных

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