我在远程服务器上有一个工作的.php文件。如果我运行以下内容:
curl -F "USER=user" -F "PASS=pass" -F "TIME=12345" -F "EMAIL=email@email.com" http://myurl.com/create.php
它将返回:
{"PASS":"pass","USER":"user"}
但是,我试图在lua中使用新接口使用相同的代码,并且当它与服务器联系时,它也会返回"无效请求"。我已将.php设置为返回"无效请求"如果没有设置正确的POST值。
我编辑了.php,无论收到的输入是什么,都会回复:
{"PASS":null,"USER":null}
我的.php代码通常如下:
if (isset($_POST["USER"]) && isset($_POST["PASS"]) && isset($_POST["TIME"]) && isset($_POST["EMAIL"])){
[...]do stuff[...]
}else{
sendResponse('Invalid request');
}
和lua代码:
require "socket.http"
function curlCreate()
response= socket.http.request("http://myurl.com/create.php","USER=user", "PASS=pass", "TIME=12345", "EMAIL=email@email.com")
print(response)
end
我相信它可能是-F标志规定了lua传输,但关于lua curling的文档有点稀疏和陈旧。
提前感谢任何建议!
答案详情: 第一个推荐的方法......
response= socket.http.request("http://someurl.com", "USER=user&PASS=pass&TIME=12345&EMAIL=email@email.com")
......确实有效!
答案 0 :(得分:2)
" request
中的curlCreate
来电格式错误。 request
的字符串参数形式接受一个或两个参数,URL然后是body。在HTTP中,传递所有各种参数设置的一种方法是将它们与"&"连接起来,这样你就可以尝试调用第二个(正文)参数:
"USER=user&PASS=pass&TIME=12345&EMAIL=email@email.com"
我怀疑即便这样也行不通。 curl -F选项还设置内容类型标题(到" multipart / form-data"),许多网络应用程序在验证请求时查找该标题 - 我不知道如果这是PHP的问题。要设置标题,您需要将参数映射传递给request
,这更复杂,因为map-argument表单是更通用的低级设施。像这样:
local http = require "socket.http"
local ltn12 = require "ltn12"
function postForm(url, body)
local sink, responseData = ltn12.sink.table()
local responseCode, statusCode, headers, statusLine = http.request {
url = url,
method = "POST",
headers = {
["Content-Type"] = "application/x-www-form-urlencoded",
["Content-Length"] = #body -- this header might not be necessary
},
source = ltn12.source.string(body),
sink = sink
}
return table.concat(responseData), responseCode, -- etc.
end
(request(url, body)
的实现必须与此类似。)
请注意,在此示例中,内容类型不是"多部分/表单数据":请参阅this question以获取解释。