POST запрос

Belo4ka_belka

Известный
Автор темы
189
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

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

Belo4ka_belka

Известный
Автор темы
189
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

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

Belo4ka_belka

Известный
Автор темы
189
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

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

Belo4ka_belka

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

Hatiko

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

Belo4ka_belka

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

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


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

user335463

Потрачен
3,246
1,978
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.

user335463

Потрачен
3,246
1,978
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
А где собственно эту функцию взять не подскажешь?
Там же где и другие. 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

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


Screenshot_4.png


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

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