如何用LuaSec发起带自定义User-Agent的https.request并正常获取响应体
解决LuaSec 0.4中自定义User-Agent并避免响应体返回1的问题
我正好踩过LuaSec 0.4的这个坑!你遇到的“响应体变成数值1”的问题,本质是混淆了https.request的两种调用模式,下面给你详细拆解解决方案:
核心问题解释
当你给https.request传入字符串URL时,它直接返回响应体、状态码、响应头、状态字符串;但当你传入配置表时,第一个返回值是布尔类型的请求成功标记(true在Lua里转成数值就是1),实际响应体需要通过ltn12库的sink来收集——这就是你看到1的根本原因!
正确的实现代码
下面是带自定义User-Agent的完整请求示例,包含GET和POST两种常用场景:
1. 基础GET请求
local https = require("ssl.https") local ltn12 = require("ltn12") -- 定义自定义请求头 local headers = { ["user-agent"] = "My User Agent", ["accept"] = "*/*" -- 可选,按需添加其他请求头 } -- 构造请求配置表(必须包含url字段) local req_config = { url = "https://example.com", method = "GET", -- 默认GET,可省略 headers = headers, -- 用table作为sink收集响应体 sink = ltn12.sink.table({}) } -- 发起请求 local success, status_code, resp_headers, status_str = https.request(req_config) -- 处理响应 if success then -- 从sink中拼接出完整响应体 local resp_body = table.concat(req_config.sink:getvalue()) print("请求成功,状态码:", status_code) print("响应体:", resp_body) else print("请求失败:", status_str) end
2. POST请求(带请求体)
如果需要发送POST数据,只需扩展配置表:
local post_body = "key1=value1&key2=value2" local headers = { ["user-agent"] = "My User Agent", ["content-type"] = "application/x-www-form-urlencoded", ["content-length"] = tostring(#post_body) } local req_config = { url = "https://example.com/api", method = "POST", headers = headers, sink = ltn12.sink.table({}), -- 用source传入POST请求体 source = ltn12.source.string(post_body) } -- 后续请求和处理逻辑和GET一致
关键注意事项
- 配置表必须包含
url字段,否则会触发未定义行为 - 请求头的键名不区分大小写,但行业习惯用小写(比如
user-agent) - 必须通过
ltn12.sink.table收集响应体,不要把第一个返回值(成功标记)当成响应体 - 如果不需要处理响应体,可以用
ltn12.sink.null替代table sink
内容的提问来源于stack exchange,提问作者Oxy Synth
相关产品推荐
相关产品推荐

