如何将此curl命令转换为lua?

时间:2014-06-18 05:38:00

标签: php post 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=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")

......确实有效!

1 个答案:

答案 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以获取解释。