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

时间:2017-02-22 13:36:11

标签: lua luasocket luarocks

我试图通过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",                          -- Validation API Method                           
       url = "http://google.com",   -- Validation API URL
       headers = header
}
print(r .. c)
pretty_print.dump(h)

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

1 个答案:

答案 0 :(得分:2)

如您所知,luasocket的http.request支持two forms of usage。我假设您需要第二个表单来自定义该特定API的resty请求。

在这种情况下,要捕获响应正文,您需要将sink字段与ltn12.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)

需要table.concat,因为响应可能包含多个块大小(在收到时附加到res)。

您也可以将上面的内容替换为ltn12.sink.file,例如,将其写入文件。使用ltn12.sink.file(io.stdout)会将响应转储到标准输出。