ECS 1 903 Опубликовано: 24 ноября, 2017 (изменено) До поры до времени я преспокойно себе использовал 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 } } }) ) Результат:web.encode( string data ): string encodedData Экранирует специальные символы, делая строку подходящей для осуществления запросов с множеством специфических данных: print( "http://buttex.ru/test.php?message=" .. web.encode( "Привет, как дела?" ) ) Результат: 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-запроса: Осуществим POST-запрос к скрипту, указав таблицу в качестве аргумента postData: local result = web.request( "http://buttex.ru/test.php", { string = "Hello", number = 123 } ) print(result) Теперь сервер вернул переданные данные POST-запроса: 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" ) ) Результат: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 ) ) Результат: Изменено 24 ноября, 2017 пользователем ECS 15 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Laine_prikol 48 Опубликовано: 26 ноября, 2017 это типа LuaSocket для OC? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ECS Автор темы 1 903 Опубликовано: 26 ноября, 2017 это типа LuaSocket для OC? Нет, что ты. Это банально более функциональный враппер к интернет-компоненту для упрощенной работы с HTTP-хендлом Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Гость Kartze Опубликовано: 3 декабря, 2017 Работы Игоря всегда поражали меня. Они, блин, для меня, простого смертного, такие... черт, такое чувство, когда смотришь на что-то... совершенное, идеальное. Короче, как всегда, на высоте с: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Fingercomp 4 409 Опубликовано: 3 декабря, 2017 Я не знаю, почему эту либу считают объектом поклонения, чем-то высоким и совершенным. Да, это полезно, чтобы не думать, а сразу брать готовое. Но это же ведь просто обёртка. Это же ведь просто поэтапная обработка ошибок. Это же ведь 100 строчек — и вся либа. Если кто-то вообще когда-либо читал что-то с сокета в OC, он бы сделал то же самое; он обязан сделать то же самое, иначе бы ничего не работало, ну или бы крашилось всё через раз. Но 10 лайков стоят, тем не менее: либа полезна, да, доки расписаны адекватно, согласен, — немногие осиливают форматирование (или же всё красным жирным шрифтом пишут, чтобы внимание привлечь) и могут писать на техническом русском языке без путания мысли; ничего против автора не имею, ценю труды и очень уважаю за офигенные и сложные либы, которые он выкладывал сюда, — но это уже какой-то культ строится. Но спасибо за некостыльный враппер. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
FelixBanan 8 Опубликовано: 9 декабря, 2017 Если кто-то вообще когда-либо читал что-то с сокета в OC, он бы сделал то же самое; он обязан сделать то же самое, иначе бы ничего не работало, ну или бы крашилось всё через раз. эти 100 строчек которые написал Игорь взяли и упростили жизнь многим новичкам и больше свободного времени будет у других разработчиков. Как по мне либа полезная, хоть и простая Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
levshx 0 Опубликовано: 24 июля, 2020 Ссыльку бы обновить Цитата Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах