开发者在使用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”, 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”, nil, { [“Authorization”] }, “”, 60000, cbFnc ) |
本章节仅介绍了常见的Basic Auth认证方式,对于其他认证方式没做介绍,如果开发者用到其他认证方式,可以先在百度上搜索所用认证方式最终会修改http请求的哪个字段,是header还是url,然后填充http.request接口中的head或者url参数即可
四、postman工具Headers标签下配置的参数
此标签页下配置的参数,直接填充到http.request接口中的head参数即可,例如下图,在Headers标签页下手动输入了两个header
本示例调用http.request接口形式如下:
http.request( “GET”, 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 for k,v in if local bodyText for kk,vv in pairs(v) bodyText = end body[#body+1] elseif local { jpg = jpeg = png = } for kk,vv in body[#body+1] = {file = vv} end end end body[#body+1] = http.request( method, url, cert, { }, body, timeout, cbFnc, rcvFileName ) end |
本示例调用httpRequestFormData接口的形式如下:
httpRequestFormData( “POST”, nil, { texts = { }, files = { } }, 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 table.insert(msg, table.insert(msg, end table.remove(msg) return end |
本示例调用http.request接口形式如下:
http.request( “POST”, nil, { [“Content-Type”]=”application/x-www-form-urlencoded”, }, urlencodeTab({[“myKey1″]=”myValue1”, 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”, 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”, 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”] [“msg”] } ) |
本示例调用http.request接口形式如下:
http.request( “POST”, 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”, 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”, 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”, nil, { [“Content-Type”]=”image/jpeg“, [“Connection”] }, { [1]={[“file”] }, 60000, cbFnc ) |
<
p class=”MsoNormal” align=”left” style=”background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial; word-break: break-all;”>