必看|如何正确使用http.request接口?

朱天华 合宙Luat 昨天

开发者在使用http.lua提供的http.request接口时,经常遇到“不知道如何填写request接口参数”的问题。

今天我们将分享合宙技术专家朱天华为大家整理的文章,以Postman的http请求为例,详细说明request接口参数的正确使用方法。

文章篇幅较长,图片及代码建议横屏或PC端查看。






1

request概述




开发者在使用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

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

)







3

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参数即可。





4

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

)







5

Postman工具Headers标签下配置的参数




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又可分为TextJavaScriptJsonHTMLXML几种,下文将分别介绍。


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屏显驱动 -


- 往期官方教程 -



刘晨旭白话Lua零基础系列教程:

白话Lua教程第一期:初识Lua

白话Lua教程第二期:变量

白话Lua教程第三期:字符串

白话Lua教程第四期:逻辑运算

白话Lua教程第五期:分支判断

白话Lua教程第六期:函数

白话Lua教程第七期:Table



●  Luat系列官方教程1:下载调试工具LuaTools

●  Luat系列官方教程2:控制LED小灯

●  Luat系列官方教程3:Luat程序的基本时序

  Luat系列官方教程4:Luat程序的基本时序

●  Luat系列官方教程5:Socket代码详解

●  Luat系列官方教程6:MQTT代码详解

●  Luat系列官方教程7:串口收发




●  Luat程序如何实现延时运行

●  2G/4G系列模块Lua版本串口功能汇总

●  史上最详细的4G模块驱动安装教程

●  4G模块AT版本PDP使用汇总

●  4G模块AT版本MQTT应用说明

●  4G模块AT版本HTTP应用说明

●  4G模块在Linux 设备上的RNDIS网卡使用

●  4G模块Linux USB驱动以及PPP拨号说明





点亮在看,和更多人一起了解物联网

↓↓↓