概述:
lua 你可以理解为又一门比较轻便的语言,他对nginx做了很好的支撑。
本文写的目的主要是做网站的时候,有部分简单逻辑交给了lua,需要发送请求到别的机器,于是就有了本篇lua之HTTP的整理。
实现方式有两种,如下:
方式一:socket.http
github地址:https://github.com/diegonehab/luasocket
包使用:直接解压安装,需要注意的是貌似makefile里面指定了安装的路径,所以安装的时候无需再制定路径,直接
make make install
默认应该是在/usr/local下,这是我之前安装时候遇到的,也许新版会有所不同,具体看README.txt,安装好之后的路径如图
代码示例:
http有GET,POST于是我就对这两个方法进行了封装了下,单写了一个lua的文件如下
lua_http.lua
-- -- Created by IntelliJ IDEA. -- User: lihua -- Date: 2016/2/29 -- Time: 17:44 -- To change this template use File | Settings | File Templates. -- 需要安装luasocket 才会支持 65上的安装地址是 /app/src/lj2/share/lua/5.1 local http = require("socket.http") local ltn12 = require("ltn12") function HttpUtil() local self = {} -- get请求 self.httpget = function(u) local t = {} local r, c, h = http.request{ url = u, -- 20160708 如果传入的是table的话, 就需要用一个容器来接收http body的内容, 也就是sink那个参数 sink = ltn12.sink.table(t)} return r, c, h, table.concat(t) end self.httpPost = function(u,inParam) -- 参考 http://www.stutostu.com/?p=1285 ngx.log(ngx.WARN,"url:"..u) ngx.log(ngx.WARN,"inParam:"..inParam) local response_body = {} local post_data = inParam local res, code = http.request{ url = u, method = "POST", headers = { ["Content-Type"] = "application/json", ["Content-Length"] = #post_data, }, source = ltn12.source.string(post_data), sink = ltn12.sink.table(response_body) } res = table.concat(response_body) ngx.log(ngx.WARN,"res:"..res) ngx.log(ngx.WARN,"code:"..code) return res,code end return self end
调用:
local httputil = HttpUtil() local url = "http://ip地址:端口/...." local resStr --响应结果 local res,code = httputil.httpPost(url,str) if code ~= 200 then ngx.log(ngx.WARN,"非200状态,code:"..code) return resStr end resStr = res
到此,方式一就介绍结束了
使用心得:方式一是我一开始的选择,因为最先学会这个,但是当我遇到我另外一个需求的时候,我发现它满足不了我,就是无法回去响应体的Header的相关的信息,因为我要用Content-Type做一些逻辑处理,百度无解后,于是采用了方式二
方式二:resty.http
github地址:https://github.com/pintsized/lua-resty-http
包说明:这个包不用安装,直接解压,然后把要用的lua文件拷到自己的lualib中就可以了
mkdir -p /app/lua_resty_http/ cd /app/lua_resty_http/ --压缩包上传在这里 解压 tar -xvf lua-resty-http-0.08.tar.gz
将这两个文件拷贝到我openresty安装的lua的lib库中,下图是我openresty中nginx.conf配置文件中制定的lua的支持模块的路径,so
cd /app/openresty/luapro/lualib
看到
把上面的http.lua,http_header.lua放到上图中的resty文件夹中就可以了。
好了,准备工作ok.
代码示例:
这个省事,直接调用了
local http = require "resty.http" local httpc = http.new() local url = "http://ip:端口/......" local resStr --响应结果 local res, err = httpc:request_uri(url, { method = "POST", --args = str, body = str, headers = { ["Content-Type"] = "application/json", } }) if not res then ngx.log(ngx.WARN,"failed to request: ", err) return resStr end --请求之后,状态码 ngx.status = res.status if ngx.status ~= 200 then ngx.log(ngx.WARN,"非200状态,ngx.status:"..ngx.status) return resStr end --header中的信息遍历,只是为了方便看头部信息打的日志,用不到的话,可以不写的 for key, val in pairs(res.headers) do if type(val) == "table" then ngx.log(ngx.WARN,"table:"..key, ": ", table.concat(val, ", ")) else ngx.log(ngx.WARN,"one:"..key, ": ", val) end end --响应的内容 resStr = res.body
ok,大功告成!
上面方式一说的获取不到的header的信息,采用的这个,这个怎么获取的就如上面的for循环,直接都打印出来了,我要用的是Content-Type,使用的方法是,接着上面的代码继续写.....
local typeOfContent = res.headers["content-type"] local byteData local res if typeOfContent == 'image/jpeg;charset=UTF-8' or typeOfContent == 'image/jpg;charset=UTF-8' then res = ngx.encode_base64(resStr) --这个是我页面上想要的格式 res = '{"result":"'..res..'"}' ngx.log(ngx.WARN,"osa--typeOfContent-yes-resStr="..res) resStr = res end
(如果响应体content_type是image的话,为了防止内容被篡改,base64一下,再给页面,页面也是可以显示出图片的,我一开始还在想读流呢!哎,,)
好了 ,结束!
总结:
就上面的两种方法,我觉的方式二相对好点,首先不用安装,其次可以获取响应的Header的内容,也许方式一也可以,但是我没搞出来。
~~~~~~~~纯个人项目遇到的问题总结,如能帮上您,我很开心,如有错误或者不严谨的地方,还望指教!~~~
相关推荐
lua-resty-post:用于openresty的HTTP发布实用程序
lua-resty领事库与ngx_lua的consul HTTP API接口目录 概述所有方法都返回lua-resty-http响应对象。 已读取响应主体并将其设置为res.body ,如果响应具有Application/JSON的Content-Type标头, res.body JSON解码。 ...
在Nginx下的lua代码中使用lua-resty-smtp ,您只需要使用方便的HTTP客户端(来自Python的curl , wget , urllib2等)发出HTTP请求,以便将邮件发送到SMTP服务器。特征基于模块socket.smtp ,并且还与API兼容支持...
反向代理cd nginx-lua-request-capturedocker-compose -f docker-compose.yml up -d记录器cd loggerdocker-compose -f docker-compose-loger.yml up -d发送请求curl -i ...d '{ "level":"INFO", "source":"Gershon",...
依存关系httpcli: : 安装luarocks install httpcli-resty --from=http://mah0x211.github.io/rocks/用法该模块将通过ngx.location.capture API发送http请求。 请参阅以获取有关该API和行为的更多详细信息。 支持...
iOS 平台下 cocos2dx 关于HTTP 网络请求的小例子 GET请求 和POST请求 的简单的使用
ESP8266-HTTP 半HTTP兼容的lua库,用于下载文件和发送GET请求
在nginx这一层,接收到访问请求的时候,就把请求的流量上报发送给kafka 这样的话,storm才能去消费kafka中的实时的访问日志,然后去进行缓存热数据的统计 用得技术方案非常简单,从lua脚本直接创建一个kafka ...
一种轻松重建客户端发送的HTTP请求的工具。 为什么要使用这个? 与其他公共间谍不同,我的系统使用发送的信息重建请求。 您应该使用渗透测试吗? 简单的答案,不。有多种检测方法,我将其专用。
配置松弛的Webhook,以在服务器识别字符串'hsbot'时向服务器发送GET请求例子: hsbot [Druid of the Claw] 选项目前仅提供一个额外的选项。 这项工作仍在进行中。 G: hsbot [Varian Wrynn] -g将连接金卡图像的一个...
使用 HTTP 服务器和基于查询参数的请求对 WS2811 RGB LED 灯条进行简单控制 支持任意长度的十六进制模式: 可以将所有 LED 设置为相同颜色 例如可以交替两种颜色 每个 LED 可以发送一种颜色 要求 一个运行 NodeMCU...
此服务与spire-agent通信,以获取和验证通过HTTP发送给它的JWT-SVID,通常是使用...Emissary的工作方式Emissary使用Envoy的ext_authz过滤器(或任何代理中的另一种方法来执行子请求并根据结果,lua等采取行动)以允许或
fooking是分布式网关服务器,它将客户端的请求传输到后端并使用fpm协议将响应发送回去。 就像Nginx一样,使用nginx和fastcgi服务器(例如fpm等)构建http服务器,您可以使用fooking创建套接字服务器。特征1个网关...
避免缓存雪崩且可有效减少重复发送相同的redis请求的缓存获取器对象; 基于Redis zset的简易优先级等级(复杂业务请考虑专业MQ组件); 使用Redis实现的关系型数据ORM,配合Lua Script基本能替代SQL; 支持服务平滑...
在回答名称之前,只有第一项会提供给通过 HTTP 请求报价的代理。 报价回复位置/{报价名称} 端点的 UUID 接受对指定的未答复提议的答复。 报价名称/{uuid} 此 UUID 正在侦听的报价的名称。 提供答案/{uuid} UUID ...
该脚本使您的游戏客户端将HTTP请求发送到Discord客户端的RPC服务器,以便根据您提供的内容更改Rich Presence。 它完全是客户端,您的服务器除了为播放器提供文件外,与该附件没有任何关系,因此不需要担心任何奇怪...