开发者在使用http.lua提供的http.request接口时,经常遇到“不知道如何填写request接口参数”的问题,首先我们来看下http.request的接口描述
request(method,url,cert,head,body,timeout,cbFnc,rcvFileName) |
method,url,cert,timeout,cbFnc,rcvFileName相对来说比较简单,可参考api和demo使用
接下来,本文以postman的http请求为例,来详细说明postman可以正常http访问时配置的参数,如何填充到http.request接口的参数中。如果不会使用postman工具,可百度搜索postman自行下载了解
二、postman工具Params标签下配置的参数
以访问http://iot.openluat.com/api/site/firmware_upgrade为例,Params标签下不配置任何参数时,如下图所示
当Params标签下配置两个参数,如下图所示:
可以看出,配置的两个参数以某种格式添加到了http的url中,成为url的一部分
所以在Params标签下配置参数后,把自动生成的url直接复制到http.request(method,url,cert,head,body,timeout,cbFnc,rcvFileName)中的url参数即可,例如上图中的url参数为:http://iot.openluat.com/api/site/firmware_upgrade?id=123456&name=test
本示例调用http.request接口形式如下:
http.request( "GET",
"http://iot.openluat.com/api/site/firmware_upgrade?id=123456&name=test", nil, nil, "", 60000, cbFnc ) |
三、postman工具Authorization标签下配置的参数
此标签下配置的参数为http请求时的认证凭证,可以简单的认为是用户名和密码
以访问http://iot.openluat.com/api/site/firmware_upgrade为例,Authorization标签下选择Basic Auth认证方式,用户名配置为123,密码配置为456,然后点击Send按钮发送http请求,如下图所示
点击Send按钮之后,可以发现Headers标签下多了几个自动生成的header,如下图所示
其中有一个header:KEY为Authorization,VALUE为Basic MTIzOjQ1Ng==,这个header实际上就是postman工具根据Authorization标签页下的认证参数自动生成的
所以Authorization标签页下的参数,实际上对应http请求的一个header,把自动生成的header直接填充到http.request(method,url,cert,head,body,timeout,cbFnc,rcvFileName)中的head参数即可,例如本示例对应的head参数为{ ["Authorization"] = "Basic MTIzOjQ1Ng==" }
问题又来了,我明明在Authorization标签页下选择了Basic Auth认证方式,用户名为123,密码为456,如何根据Basic Auth、123、456就生成了Basic MTIzOjQ1Ng==呢?
其实,Basic MTIzOjQ1Ng==中的Basic表示Basic Auth认证方式,之后跟一个空格(这是协议要求),最后的MTIzOjQ1Ng==为123:456的base64编码字符串
本示例对应http.request(method,url,cert,head,body,timeout,cbFnc,rcvFileName)中的head参数,最终可以填充为{ ["Authorization"]
= "Basic "..crypto.base64_encode("123:456", ("123:456"):len())
}
本示例调用http.request接口形式如下:
http.request( "GET",
"http://iot.openluat.com/api/site/firmware_upgrade", nil, { ["Authorization"]
= "Basic "..crypto.base64_encode("123:456", ("123:456"):len()) }, "", 60000, cbFnc ) |
本章节仅介绍了常见的Basic Auth认证方式,对于其他认证方式没做介绍,如果开发者用到其他认证方式,可以先在百度上搜索所用认证方式最终会修改http请求的哪个字段,是header还是url,然后填充http.request接口中的head或者url参数即可
四、postman工具Headers标签下配置的参数
此标签页下配置的参数,直接填充到http.request接口中的head参数即可,例如下图,在Headers标签页下手动输入了两个header
本示例调用http.request接口形式如下:
http.request( "GET",
"http://iot.openluat.com/api/site/firmware_upgrade", nil, { ["myKey1"]="myValue1", ["myKey2"]="myValue2", }, "", 60000, cbFnc ) |
五、postman工具Body标签下配置的参数
Body标签下有form-data、x-www-form-urlencoded、raw、binary几种格式,下文将分别介绍
5.1、form-data格式
如下图所示,以form-data格式配置了4个参数,2个text字符串,2个文件
此种body参数,无法直接对http.request的参数进行填充,可使用如下二次封装的接口httpRequestFormData接口来填充参数:
local function httpRequestFormData(method,url,cert,formData,timeout,cbFnc,rcvFileName) local
boundary,body,k,v,kk,vv =
"--------------------------"..os.time()..rtos.tick(),{} for k,v in
pairs(formData) do if
k=="texts" then local bodyText
= "" for kk,vv in pairs(v)
do bodyText =
bodyText.."--"..boundary.."\r\nContent-Disposition: form-data;
name=\""..kk.."\"\r\n\r\n"..vv.."\r\n" end body[#body+1]
= bodyText elseif
k=="files" then local
contentType = { jpg =
"image/jpeg", jpeg =
"image/jpeg", png =
"image/png", } for kk,vv in
pairs(v) do
print(kk,vv)
body[#body+1] =
"--"..boundary.."\r\nContent-Disposition: form-data;
name=\""..kk.."\";
filename=\""..vv:match("([^/]+)$").."\"\r\nContent-Type:
"..(contentType[vv:match("%.(%w+)$")] or
"application/octet-stream").."\r\n\r\n" body[#body+1] = {file = vv}
body[#body+1] = "\r\n" end end end body[#body+1] =
"--"..boundary.."--\r\n" http.request( method, url, cert, {
["Content-Type"] = "multipart/form-data;
boundary="..boundary,
["Connection"] = "keep-alive" }, body, timeout, cbFnc, rcvFileName ) end |
本示例调用httpRequestFormData接口的形式如下:
httpRequestFormData( "POST",
"http://iot.openluat.com/api/site/firmware_upgrade", nil, { texts = {
["myTextKey1"] = "myTextValue1",
["myTextKey2"] = "myTextValue2" }, files = {
["myFileKey1"] = "/ldata/file.txt", --此处填写文件的完整路径
["myFileKey2"] = "/ldata/file.jpg", --此处填写文件的完整路径 } }, 60000, cbFnc ) |
5.2、x-www-form-urlencoded格式
如下图所示,以x-www-form-urlencoded格式配置了2个参数
此种格式的body参数,需要对http.request的head和body参数进行填充,head参数需要添加["Content-Type"]="application/x-www-form-urlencoded",body参数可使用如下接口httpRequestFormData接口来生成:
local function urlencodeTab(params) local msg = {} for k, v in
pairs(params) do table.insert(msg,
string.urlEncode(k) .. '=' .. string.urlEncode(v)) table.insert(msg,
'&') end table.remove(msg) return
table.concat(msg) end |
本示例调用http.request接口形式如下:
http.request( "POST",
"http://iot.openluat.com/api/site/firmware_upgrade", nil, { ["Content-Type"]="application/x-www-form-urlencoded", }, urlencodeTab({["myKey1"]="myValue1",
["myKey2"]="myValue2"}), 60000, cbFnc ) |
5.3、raw格式
raw又可分为Text、JavaScript、Json、HTML、XML几种,下文将分别介绍
5.3.1、Text格式
如下图所示,以raw Text格式配置了1个字符串123456
此种格式的body参数,需要对http.request的head和body参数进行填充,head参数需要添加["Content-Type"]="text/plain",body参数直接填充123456:
本示例调用http.request接口形式如下:
http.request( "POST",
"http://iot.openluat.com/api/site/firmware_upgrade", nil, { ["Content-Type"]="text/plain", }, "123456", 60000, cbFnc ) |
5.3.2、JavaScript格式
如下图所示,以raw JavaScript格式配置了1个字符串123456
此种格式的body参数,需要对http.request的head和body参数进行填充,head参数需要添加["Content-Type"]="application/javascript",body参数直接填充123456:
本示例调用http.request接口形式如下:
http.request( "POST",
"http://iot.openluat.com/api/site/firmware_upgrade", nil, { ["Content-Type"]="application/javascript", }, "123456", 60000, cbFnc ) |
5.3.3、Json格式
如下图所示,以raw Json格式配置了2个参数
此种格式的body参数,需要对http.request的head和body参数进行填充,head参数需要添加["Content-Type"]="application/json",
body参数可使用如下代码来生成:
json.encode( { ["code"]
= 25, ["msg"]
= "test" } ) |
本示例调用http.request接口形式如下:
http.request( "POST",
"http://iot.openluat.com/api/site/firmware_upgrade", nil, { ["Content-Type"]="application/json", }, json.encode( { ["code"] = 25, ["msg"] = "test" } ), 60000, cbFnc ) |
5.3.4、HTML格式
如下图所示,以raw HTML格式配置了1个字符串123456
此种格式的body参数,需要对http.request的head和body参数进行填充,head参数需要添加["Content-Type"]="text/html",body参数直接填充123456:
本示例调用http.request接口形式如下:
http.request( "POST",
"http://iot.openluat.com/api/site/firmware_upgrade", nil, { ["Content-Type"]="text/html", }, "123456", 60000, cbFnc ) |
5.3.5、XML格式
如下图所示,以raw XML格式配置了1个字符串123456
此种格式的body参数,需要对http.request的head和body参数进行填充,head参数需要添加["Content-Type"]="text/xml",body参数直接填充123456:
本示例调用http.request接口形式如下:
http.request( "POST",
"http://iot.openluat.com/api/site/firmware_upgrade", nil, { ["Content-Type"]="text/xml", }, "123456", 60000, cbFnc ) |
5.4、binary格式
如下图所示,以binary格式配置了1个文件file.jpg
此种格式的body参数,需要对http.request的head和body参数进行填充,head参数需要添加
["Connection"]
= "keep-alive"
["Content-Type"]="xxx",此处的xxx和文件类型有关,例如jpg文件为image/jpeg,可自行百度搜索Content-Type了解更多,最简单的一种方式是postman点击Send按钮后,会自动在Headers标签下生成Content-Type这个请求头,可直接使用Content-Type这个请求头的值,如下图所示
body参数填充文件路径即可
本示例调用http.request接口形式如下:
http.request( "POST",
"http://iot.openluat.com/api/site/firmware_upgrade", nil, { ["Content-Type"]="image/jpeg", ["Connection"]
= "keep-alive" }, { [1]={["file"]
= "/ldata/file.jpg"}--此处填写文件的完整路径 }, 60000, cbFnc ) |
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!