如何将此curl命令翻译成lua?

我在远程服务器上有一个能运行的.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=emaiil@email.com")
    print(response)

end

我相信这可能是-F标志保留了lua传输,但是关于lua curl的文档有点稀少和旧。

提前感谢任何建议!

答案细节: 第一个推荐的方法...

response= socket.http.request("http://someurl.com", "USER=user&PASS=pass&TIME=12345&EMAIL=email@email.com")

...的确有用!

点赞
用户3713103
用户3713103

curlCreate 中,你的 request 调用格式有误。request 的字符串参数形式接受一个或两个参数,先是 URL,然后是请求体。在 HTTP 中,传递各种参数设置的一种方式是使用 "&" 符号连接它们,因此您可以将调用的第二个参数(请求体)尝试为:

"USER=user&PASS=pass&TIME=12345&EMAIL=email@email.com"

我怀疑甚至这也不会起作用。curl 的 -F 选项还会设置内容类型报头(为 "multipart/form-data"),许多 Web 应用程序会查找该报头以验证请求,但我不知道这是否与 PHP 有关。要设置标头,您需要将参数映射传递给 request,这更复杂,因为映射参数形式是更一般的较低级别工具。像这样:

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) 的实现必须看起来类似于此。)

请注意,在此示例中,Content-Type 不是 "multipart/form-data":请参阅此问题 下的解释。

2014-06-18 16:05:27