开发者在使用http.lua提供的http.request接口时,经常遇到“不知道如何填写request接口参数”的问题。
今天我们将分享合宙技术专家朱天华为大家整理的文章,以Postman的http请求为例,详细说明request接口参数的正确使用方法。
文章篇幅较长,图片及代码建议横屏或PC端查看。
1
开发者在使用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为用户提供强大的 Web API & HTTP 请求调试功能。Postman能够发送任何类型的HTTP 请求 (GET, HEAD, POST, PUT..),附带任何数量的参数+ headers,是一款非常实用的调试工具。
如果不会使用Postman工具,可百度搜索Postman自行下载了解。
2
首先,我们以访问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
)
3
此标签下配置的参数为http请求时的认证凭证,可以简单的认为是用户名和密码。
以访问http://iot.openluat.com/api/site/firmware_upgrade为例。
Authorization标签下选择Basic Auth认证方式,用户名配置为123,密码配置为456,然后点击Send按钮发送http请求,如下图所示:
其中有一个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参数即可。
4
此标签页下配置的参数,直接填充到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
)
5
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
)
以上就是今天的内容,你是否都掌握了呢?合宙技术QQ群:851800257,欢迎加入探讨~
春天来了,疫情终会过去,合宙Cat.1系列模块也即将与您见面,敬请关注!
感谢阅览本期内容
欢迎文末留言互动
本期文末最先留言的五位同学
— 将获得合宙商城五折券一张 —
五折券有效期至3月31日
点击公众号菜单“合宙商城”即可使用
2月01日起合宙商城已恢复正常发货
- 粉丝专有福利 -
- Air720SG新品系列 -
- 4G屏显驱动 -
- 往期官方教程 -
点亮在看,和更多人一起了解物联网
↓↓↓