Air系列模块Luat版本如何使用http.request接口

以postman的http请求为例,来详细说明postman可以正常http访问时配置的参数,如何填充到http.request接口的参数中

一、概述

            开发者在使用http.lua提供的http.request接口时,经常遇到“不知道如何填写request接口参数”的问题,首先我们来看下http.request的接口描述

request(method,url,cert,head,body,timeout,cbFnc,rcvFileName)

        

         method,url,cert,timeout,cbFnc,rcvFileName相对来说比较简单,可参考apidemo使用

         接下来,本文以postmanhttp请求为例,来详细说明postman可以正常http访问时配置的参数,如何填充到http.request接口的参数中。如果不会使用postman工具,可百度搜索postman自行下载了解

二、postman工具Params标签下配置的参数

            以访问http://iot.openluat.com/api/site/firmware_upgrade为例,Params标签下不配置任何参数时,如下图所示


         Params标签下配置两个参数,如下图所示:


         可以看出,配置的两个参数以某种格式添加到了httpurl中,成为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,如下图所示


         其中有一个headerKEYAuthorizationVALUEBasic 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 Auth123456就生成了Basic MTIzOjQ1Ng==呢?

         其实,Basic MTIzOjQ1Ng==中的Basic表示Basic Auth认证方式,之后跟一个空格(这是协议要求),最后的MTIzOjQ1Ng==123:456base64编码字符串

         本示例对应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-datax-www-form-urlencodedrawbinary几种格式,下文将分别介绍

5.1form-data格式

       如下图所示,以form-data格式配置了4个参数,2text字符串,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.2x-www-form-urlencoded格式

       如下图所示,以x-www-form-urlencoded格式配置了2个参数


         此种格式的body参数,需要对http.requestheadbody参数进行填充,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.3raw格式

       raw又可分为TextJavaScriptJsonHTMLXML几种,下文将分别介绍

       5.3.1Text格式

       如下图所示,以raw Text格式配置了1个字符串123456


         此种格式的body参数,需要对http.requestheadbody参数进行填充,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.2JavaScript格式

       如下图所示,以raw JavaScript格式配置了1个字符串123456


         此种格式的body参数,需要对http.requestheadbody参数进行填充,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.3Json格式

       如下图所示,以raw Json格式配置了2个参数


         此种格式的body参数,需要对http.requestheadbody参数进行填充,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.4HTML格式

       如下图所示,以raw HTML格式配置了1个字符串123456


         此种格式的body参数,需要对http.requestheadbody参数进行填充,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.5XML格式

       如下图所示,以raw XML格式配置了1个字符串123456


         此种格式的body参数,需要对http.requestheadbody参数进行填充,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.4binary格式

       如下图所示,以binary格式配置了1个文件file.jpg


         此种格式的body参数,需要对http.requestheadbody参数进行填充,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

)

 

  • 发表于 2020-02-28 18:57
  • 阅读 ( 3132 )
  • 分类:默认分类

0 条评论

请先 登录 后评论
不写代码的码农
朱天华

软件工程师

19 篇文章

作家榜 »

  1. 技术销售Delectate 43 文章
  2. 陈夏 26 文章
  3. 国梁 24 文章
  4. miuser 21 文章
  5. 晨旭 20 文章
  6. 朱天华 19 文章
  7. 金艺 19 文章
  8. 杨奉武 18 文章