POST запрос

Belo4ka_belka

Известный
Автор темы
191
7
Версия MoonLoader
.026-beta
Добрый день. Имеется задача отправить get запрос на таблицу гугл с длинющей (около 6к символов) строкой в качестве аргумента. Через GET у меня это сделать не получается - пытаюсь в POST.

В таком варианте получаю error invalid argument и судя по всему это ошибка от мунлоадера а не от принимающего скрипта в гугле (ибо приходит ответ мгновенно).
Код:
httpRequest(url, '123', function(response, code, headers, status)
    if response then
        print('OK', status)
     else
        print('Error', code)
      end
end)

Подскажите пожалуйста как правильно оформить тело запроса (оно будет включать только текст).
 
Решение
А где собственно эту функцию взять не подскажешь?
Там же где и другие. https://www.blast.hk/threads/20532/
Её использование противопоказано бла бла бла. Асинхронщинна в луа это та еще шляпа, одно хуже другого.

Применение с LuaJIT 2.1-beta (и MoonLoader .025+) противопоказано! (подробности)
Lua:
local lanes = require('lanes').configure() -- в начало скрипта, конечно же

function async_http_request(method, url, args, resolve, reject)
    local request_lane = lanes.gen('*', {package = {path = package.path, cpath = package.cpath}}, function()
        local requests = require 'requests'
        local ok, result = pcall(requests.request, method, url, args)
        if ok then
            result.json, result.xml...

Hatiko

Известный
Проверенный
1,469
610
Через GET у меня это сделать не получается
В Гет длина запроса макс 2к символов.
Используй effi для различных запросов. [ссылка]. В теме небольшой пример присутствует.
Аргумент в виде таблицы составляется:
Lua:
local args = {}
args.data = "запрос"
args.headers = {
    ['content-type']='application/x-www-form-urlencoded'
}
 

Belo4ka_belka

Известный
Автор темы
191
7
В Гет длина запроса макс 2к символов.
Используй effi для различных запросов. [ссылка]. В теме небольшой пример присутствует.
Аргумент в виде таблицы составляется:
Lua:
local args = {}
args.data = "запрос"
args.headers = {
    ['content-type']='application/x-www-form-urlencoded'
}
Но если засунуть таблицу в body идет ругательство что функция ожидает строку, а

Код:
local args = {}
args.data = "var=123"
args.headers = { ['content-type']='application/x-www-form-urlencoded' }
httpRequest(url, encodeJson(args), function(response, code, headers, status)
    if response then
        print('OK', status)
    else
        print('Error', code)
     end
end)

выдает такую же ошибку error invalid argument.
 

Hatiko

Известный
Проверенный
1,469
610
Но если засунуть таблицу в body идет ругательство что функция ожидает строку, а
Я же написал, что аргумент в виде таблицы передаётся, не надо её конвертировать в json строчку, просто переменную таблицы укажи.
 

Belo4ka_belka

Известный
Автор темы
191
7
Я же написал, что аргумент в виде таблицы передаётся, не надо её конвертировать в json строчку, просто переменную таблицы укажи.
Но если засунуть таблицу в body идет ругательство что функция ожидает строку
Error C:\GTA San Andreas\moonloader\lib\copas.lua:40: C:\GTA San Andreas\moonloader\lib\copas\http.lua:389: bad argument #1 to 'len' (string expected, got table)
 

Hatiko

Известный
Проверенный
1,469
610
Не очень догоняю, какую либу ты юзаешь, где в функции первым аргументом идёт url, не ошибся ли ты. Лучше не перься, а используй effi, она более стабильная в работе, её многие используют, пример и источник выше изложил.
 

Belo4ka_belka

Известный
Автор темы
191
7
Не очень догоняю, какую либу ты юзаешь, где в функции первым аргументом идёт url, не ошибся ли ты. Лучше не перься, а используй effi, она более стабильная в работе, её многие используют, пример и источник выше изложил.
Принцип твоего предложения в том чтобы отправить три-четыре get запроса подряд из частей текста или effi позволяет использовать более 2к строк в запросе?
 

Hatiko

Известный
Проверенный
1,469
610
отправить три-четыре get запроса подряд
Ну так последовательно и отправь, в чём проблема, если ты задачу заполнения гугл таблицы разобьёшь на части, чтобы укладывалось в 2к строк. Но тут подойдёт и обычная функция из moonloader UrlDowload что-то там. В Post же длина строки не ограничена, поэтому одним запросом можно осуществить. Effi предлагаю, т.к. она более юзабельная и на ней ты найдёшь больше примеров в скриптах по реализации.
Хотя надо ещё уточнить какие запросы для апи гугл таблцы приемлемы.
 
Последнее редактирование:

Belo4ka_belka

Известный
Автор темы
191
7
Ну так последовательно и отправь, в чём проблема, если ты задачу заполнения гугл таблицы разобьёшь на части, чтобы укладывалось в 2к строк. Но тут подойдёт и обычная функция из moonloader UrlDowload что-то там. В Post же длина строки не ограничена, поэтому одним запросом можно осуществить. Effi предлагаю, т.к. она более юзабельная и на ней ты найдёшь больше примеров в скриптах по реализации.
Хотя надо ещё уточнить какие запросы для апи гугл таблцы приемлемы.
Вот как раз потому и нужен один большой запрос, так как конвеером передачу запросов у меня не получилось реализовать. Я смог начать передачу строчки только с ограничителем 128 символов - а это 215 запросов).

Функцию юзаю от фипа:
Screenshot_2.png


Меня впринципе не волнует каким образом отправить пост запрос с текстом, какой функцией и так далее. Главное чтобы игра пережила этот запрос - а то я слышал старый async крашил игру.
 

Fott

Известный
3,400
2,208
А где собственно эту функцию взять не подскажешь?
Там же где и другие. https://www.blast.hk/threads/20532/
Её использование противопоказано бла бла бла. Асинхронщинна в луа это та еще шляпа, одно хуже другого.

Применение с LuaJIT 2.1-beta (и MoonLoader .025+) противопоказано! (подробности)
Lua:
local lanes = require('lanes').configure() -- в начало скрипта, конечно же

function async_http_request(method, url, args, resolve, reject)
    local request_lane = lanes.gen('*', {package = {path = package.path, cpath = package.cpath}}, function()
        local requests = require 'requests'
        local ok, result = pcall(requests.request, method, url, args)
        if ok then
            result.json, result.xml = nil, nil -- cannot be passed through a lane
            return true, result
        else
            return false, result -- return error
        end
    end)
    if not reject then reject = function() end end
    lua_thread.create(function()
        local lh = request_lane()
        while true do
            local status = lh.status
            if status == 'done' then
                local ok, result = lh[1], lh[2]
                if ok then resolve(result) else reject(result) end
                return
            elseif status == 'error' then
                return reject(lh[1])
            elseif status == 'killed' or status == 'cancelled' then
                return reject(status)
            end
            wait(0)
        end
    end)
end
Пример вызова
Lua:
async_http_request('GET', 'https://www.google.com/robots.txt', nil --[[параметры запроса]],
  function(response) -- вызовется при успешном выполнении и получении ответа
    print(response.text) -- response.text - текст ответа. ещё есть response.status_code и response.headers
  end,
  function(err) -- вызовется при ошибке, err - текст ошибки. эту функцию можно не указывать
    print(err)
  end)

Более сложный, но походит для частых и последовательных запросов, запускает один поток при первом запросе, который остаётся активен до завершения работы скрипта:
Lua:
local lanes = require('lanes').configure()

function sequent_async_http_request(method, url, args, resolve, reject)
    if not _G['lanes.async_http'] then
        local linda = lanes.linda()
        local lane_gen = lanes.gen('*', {package = {path = package.path, cpath = package.cpath}}, function()
            local requests = require 'requests'
            while true do
                local key, val = linda:receive(50 / 1000, 'request')
                if key == 'request' then
                    local ok, result = pcall(requests.request, val.method, val.url, val.args)
                    if ok then
                        result.json, result.xml = nil, nil
                        linda:send('response', result)
                    else
                        linda:send('error', result)
                    end
                end
            end
        end)
        _G['lanes.async_http'] = {lane = lane_gen(), linda = linda}
    end
    local lanes_http = _G['lanes.async_http']
    lanes_http.linda:send('request', {method = method, url = url, args = args})
    lua_thread.create(function(linda)
        while true do
            local key, val = linda:receive(0, 'response', 'error')
            if key == 'response' then
                return resolve(val)
            elseif key == 'error' then
                return reject(val)
            end
            wait(0)
        end
    end, lanes_http.linda)
end
 

Belo4ka_belka

Известный
Автор темы
191
7
Нихрена у меня не получилось. То ошибка отсутствия url, то просто краши. Сделал крч кривой костыльный способ но пока что работающий.
Screenshot_3.png


Screenshot_4.png


в плане запросов АХК действительно очень даже удобнее мунлоадера(

Всем спасибо, можно закрывать.