如何在Lua Socket调用中捕获完整响应

我正在尝试通过LUA调用REST API。 但是,我无法捕获API返回的完整原始响应。 以下是代码示例:

local http_socket = require("socket.http")
local pretty_print = require("pl.pretty")
local header = {
                 ["x-device-type"] = "M",
                 ["authorization"] = "ashdjkashd",
                 ["x-app-secret"] = "asdasda",
                 ["x-user-id"] = "asdasdasd"
                 }

r, c, h = http_socket.request {
       method = "GET",                          -- 验证API方法
       url = "http://google.com",   -- 验证API URL
       headers = header
}
print(r .. c)
pretty_print.dump(h)

我使用的是lua 5.3和luarocks版本=2.4.1。 在变量c中,我得到了代码,而在h中有几个标头。 我需要捕获API返回的完整响应。

点赞
用户234175
用户234175

正如你所知,luasocket的http.request有两种使用方式。我假定你需要第二种方式来为那个特定的API自定义resty请求。

在这种情况下,为了捕获响应正文,你需要使用ltn12.sink模块的sink字段。例如:

local ltn12 = require 'ltn12'

-- ...

local res = {}
r, c, h, s = http_socket.request
{
  method = "GET",               -- Validation API Method
  url = "http://google.com",    -- Validation API URL
  headers = header,
  sink = ltn12.sink.table(res)
}

res = table.concat(res)
print(res)

由于响应可能由多个块组成(在接收到时附加到res上),因此需要使用table.concat

你也可以将其写入文件,只需用ltn12.sink.file替换上面的代码即可,例如使用ltn12.sink.file(io.stdout)将响应转储到标准输出。

2017-02-22 21:59:48