一、基本介绍


httpc库框架的内部实现的http client库, 支持设置HTTP/1.1的连接、请求超时设置、头部设置;

httpc库支持httphttps两种协议请求, 根据传参自动判断是否需要进行安全TCP连接;

httpc库封装了常见的GETPOSTJSONFILEPUTDELETE请求方法, 减少开发者的工作重复程度;

二、基本使用


导入库: local httpc = require "httpc"

1. httpc.get


函数原型: httpc.get(domain, headers, args, timeout)

get方法将会对domain参数发起一个GET HTTP/1.1请求, timeout参数决定请求在多久未得到回应将视为超时;

headers参数为用户自定义头部, args参数为用户自定义请求参数并追加在domain的后面; 它们是table类型的数组;

此方法有2个返回值, 第一个返回值是一个Integer类型的响应codenil; 第二个参数是响应内容(body)或者Location;

使用示例:

local code, body = httpc.get("http://localhost:8080/api?page=1&limit=10", {{"Auth", "admin"}})
local code, body = httpc.get("http://localhost:8080/api", {{"Auth", "admin"}}, {{'page', 1}, {'limit', 10}})
local code, body = httpc.get("http://localhost:8080/api", {{"Auth", "admin"}}, {{'page', 1}, {'limit', 10}}, 3)
-- 请求参数将会被编码为: page=1&limit=10

2. httpc.post


函数原型: httpc.post(domain, headers, args, timeout)

post方法将会对domain参数发起一个POST HTTP/1.1请求, timeout参数决定请求在多久未得到回应将视为超时;

headers参数为用户自定义头部, args参数为用户自定义请求参数并被放置在body上; 它们是table类型的数组;

此方法有2个返回值, 第一个返回值是一个Integer类型的响应codenil; 第二个参数是响应内容(body)或者Location;

此方法的Content-Typeapplication/x-www-form-urlencoded;

使用示例:

local code, body = httpc.post("http://[::ffff:127.0.0.1]:8080/api", {{"Auth", "admin"}}, {{'page', 1}, {'limit', 10}}, 3)
-- 请求参数将会被编码为: page=1&limit=10

3. httpc.json


函数原型: httpc.json(domain, headers, json, timeout)

json方法将会对domain参数发起一个POST HTTP/1.1请求, timeout参数决定请求在多久未得到回应将视为超时;

headers参数为用户自定义头部, json参数会被直接填充到body上; json可以是String或者Table类型(被编码);

此方法有2个返回值, 第一个返回值是一个Integer类型的响应codenil; 第二个参数是响应内容(body)或者Location;

此方法的Content-Typeapplication/json;

使用示例:

local json = requiore "json"

local code, body = httpc.json("http://localhost:8080/api", {{"Auth", "admin"}}, {page = 1, limit = 10})
-- 传递可被格式化的table参数, body为:{"page":1,"limit":10}
local code, body = httpc.json("http://localhost:8080/api", {{"Auth", "admin"}}, json.encode({page = 1, limit = 10}))
-- 传递合法的json格式化字符串, body为:{"page":1,"limit":10}

4. httpc.file


函数原型: httpc.file(domain, headers, files, timeout)

file方法将会对domain参数发起一个POST HTTP/1.1请求, timeout参数决定请求在多久未得到回应将视为超时;

headers参数为用户自定义头部, filesfile对象{name = name, filename = filename, file = file, type = type}数组;

file对象包含名称、文件名、文件内容、文件后缀(类型), 这个请求可以保证开发者通过HTTP协议发送文件到远程服务器;

使用示例:

local code, body = httpc.file('http://localhost:8080/view', nil, {
  {name='1', filename='1.jpg', file='1', type='abc'},
  {name='2', filename='2.jpg', file='2', type='abc'},
})

5. httpc.multi_request


函数原型: httpc.multi_request(opt)

multi_request方法为并发请求提供了可能; 在多个不相关的接口中快速获得数据, 以减少网络延迟带来的并发问题.

opts是对个请求组成的一个数组, 其中的每个item都可能代表一个不同请求. 其中包含的参数:

  • domain - String类型, 此参数为用户请求的域名与路径;

  • method - String类型, 此参数为用户请求的的方法名称; 包括: ["get", "post", "json", "file"];

  • headers - table[]类型, 此参数为用户请求头部信息数组; 示例: {{"Token", "932njkaad"}, {"signature", "21321"}}

  • args - table[]类型, 此参数为用户请求参数信息数组; (get请求特有);

  • body - table[]类型, 此参数为用户请求内容信息数组; (post请求特有);

  • json - table[]类型, 此参数为用户请求内容信息数组; (json请求特有);

  • file - table[]类型, 此参数为用户请求文件信息数组; (file请求特有);

    使用示例:

local httpc = require "httpc"
local LOG = require "logging"

local ok, response = httpc.multi_request {
  {
    domain = "http://localhost:8080/api",
    method = "get",
    headers = {{"Auth", "admin"}},
    args = {{'page', 1}, {'limit', 10}}
  },

  {
    domain = "http://localhost:8080/api",
    method = "post",
    headers = {{"Auth", "admin"}},
    body = {{'page', 1}, {'limit', 10}}
  },

  {
    domain = "http://localhost:8080/api",
    method = "json",
    headers = {{"Auth", "admin"}},
    json = json.encode({page=1, limit=10})
  },

  {
    domain = "http://localhost:8080/api",
    method = "file",
    headers = {{"Auth", "admin"}},
    files = {
      {name='1', filename='1.jpg', file='1', type='abc'},
      {name='2', filename='2.jpg', file='2', type='abc'},
    }
  }

}

LOG:DEBUG(response, "回应数量: " .. #response)

三、请求对象


什么是HTTP请求对象? HTTP请求对象提供了连接复用的功能, 在对相同域名的不同方法请求可以无需重新建立TCP连接.

1. 使用差异


前面章节所述的httpc库都会在连接请求完成(无论成功与否), 都将释放连接并返回结果到开发者调用端. 这样通常是没有问题的.

但是某些特殊场景下! 我们需要在整个流程中对一个远程服务同时调用多次的时候, 这样前面所述的方式就会较浪费资源.

HTTP请求对象是基于class建立的请求抽象模型; 所以它可以非常简单就能保留链接引用下文;

其内部所有实现方法与httpc库是一样的, 这样就可以在不暴露内部接口的同事提供连接复用的功能.

2. 使用方式


由于HTTP请求对象是基于对象实现, 其使用相关方法的时候需要使用冒号(:)来调用;

HTTP请求对象使用之初需要先导入httpc.class对象, 然后使用前面所述的方法来进行使用;

3. 使用示例


local httpc = require "httpc.class"
local hc = httpc:new {}

local code, data = hc:get("localhost:8080/api?a=1&b=2")
print(code, data)
hc:close()

四、代理请求


特定的网络环境下, 我们可能会需要用到第三方的服务器来完成网络连接. 这就是通常意义上的代理请求.

httpc库目前支持两种协议完成代理: 1. 基于HTTP的Connect协议请求代理, 2. 基于sock5的请求转发代理;

在使用之前, 我们先要导入基于httpProxy库: local http_proxy = require "httpc.proxy"

1. 基于Connect的代理


函数原型: http_proxy.tunnel_connect(opt)

此方法通过使用HTTP的Connect方法来完成认证与代理; opt参数是一个配置用的table, 内部包含以下参数:

  • opt.proxy_domain - String类型的代理域名与端口(可选), 例如: http://proxy.com/, http://proxy.com:8080/;

  • opt.source_domain - String类型的目的域名与端口(可选), 例如: http://proxy.com/, http://proxy.com:8080/;

  • opt.headers - table类型数组参数表示需要为通道握手添加额外的头部信息, 这在一些特殊的代理服务器中可能会用到;

  • opt.auth - table类型参数; 如有需要, 可配置此字段内的usernamepassword属性使用basic认证;

  • opt.timeout - Number类型参数表示与代理服务器之间握手的超时时间, 超过这个时间将会主动断开连接;

    此方法在代理建立成功后将会返回一个httpc class对象, 用户可以使用此对象来访问服务器的. 其他情况会返回nil与出错信息;

    当您不想时候http proxy的时候, 请主动调用它的close方法回收资源;

2. 基于Sock5的代理


函数原型: http_proxy.socks5_connect(opt)

此方法通过使用SOCK5协议来完成认证与代理; opt参数是一个配置用的table, 内部包含以下参数:

  • opt.proxy_domain - String类型的代理域名与端口(可选), 表示方式为: socks5://ip|domain:port

  • opt.source_domain - String类型的目的域名与端口(可选), 例如: http://proxy.com/, http://proxy.com:8080/;

  • opt.auth - table类型参数; 如有需要, 可配置此字段内的usernamepassword属性使用用户名/密码认证;

  • opt.timeout - Number类型参数表示与代理服务器之间握手的超时时间, 超过这个时间将会主动断开连接;

    此方法在代理建立成功后将会返回一个httpc class对象, 用户可以使用此对象来访问服务器的. 其他情况会返回nil与出错信息;

    当您不想时候http proxy的时候, 请主动调用它的close方法回收资源;

五、使用注意


  • httpc的任何一个方法都不会为用户解析response body;

  • httpc的遇到301/302的时候会返回状态码Location, 不会理会response body(因为没有意义);

  • httpc每次都会随机生成一个User-Agent, 这个会在框架内部自动完成;

六、结束


以上为luahttpc使用内容.

Copyright © CandyMi 2019-2022 all right reserved,powered by Gitbook该文件修订时间: 2021-11-19 22:06:43

results matching ""

    No results matching ""