使用 Lua 的 socket http 设置超时时间

我正试图创建一个能够使用 Lua 的 socket http 调用 REST 的函数。 我尝试使用以下方法设置超时时间。但是,当我运行此函数时,超时时间没有起作用。我该如何设置超时时间?

local http = require "socket.http"
local socket = require "socket"

       local respbody = {}
       http.request {
                     method = req_method,
                     url = req_url,
                     source = ltn12.source.string(req_body),
                     headers =
                              {
                                ["Content-Type"] = req_content_type,
                                ["content-length"] = string.len(req_body),
                                ["Host"] = host,

                              },

                     sink = ltn12.sink.table(respbody),
                     create = function()
                         local req_sock = socket.tcp()
                         req_sock:settimeout(3, 't')
                         return req_sock
                     end,

}
点赞
用户9582610
用户9582610

你可能想要查看lua-http。我使用它来调用REST并且运行得很好。虽然我不是一个专家,但据我所知,它是一个很好的LUA http实现。

你可以像下面这样简单设置两秒的超时时间:

local http_client = require "http.client"
local myconnection = http_client.connect {
    host = "myrestserver.domain.com";
    timeout = 2;
}

完整的文档在这里

2020-06-30 14:51:33
用户13803329
用户13803329

如果我按照自己的要求实现这个示例,会像这样吗? cmiiw

local http_client = require "http.client"
local req_body = "key1=value1&key2=value2"
local myconnection = http_client.connect {
    method = "POST";
    url = "myrestserver.domain.com/api/example";
    host = "myrestserver.domain.com";
    source = req_body
    headers = {
       ["Content-Type"] = "application/x-www-form-urlencoded",
       ["content-length"] = string.len(req_body),
    },
    timeout = 2;
}
2020-06-30 16:06:11
用户2328287
用户2328287

LuaSocket 会在套接字对象中隐式设置 http.TIMEOUT。 此外,您必须记住,套接字超时与请求超时不同。 套接字超时意味着每个操作超时独立地发生。对于简单情况,您可以等待连接达到 timeout 秒,然后每个读操作最多可能需要 timeout 秒。由于 HTTP 客户端按行读取响应,因此每个头部独立超时 timeout 秒,每个响应块独立超时 timeout 秒。此外,可能会有重定向,每个重定向都是单独的 HTTP 请求/响应。如果使用 TLS,连接后还会有握手,这也需要进行多次发送/接收操作。

我没有使用 lua-http 模块,并不知道其超时实现方式。 但是,如果确实需要限制请求超时,我更喜欢使用像 cURL 这样的模块。

2020-07-01 05:28:17