开发者在使用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 ) | 
 
                如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!