概述:
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-cURL是一个用于在Lua环境中实现HTTP和HTTPS访问的库,它是基于著名的C语言库cURL构建的。这个库提供了全面的功能,使得Lua...无论你是处理简单的HTTP请求还是构建复杂的网络应用,Lua-cURL都是一个值得信赖的库。
这些API允许Lua脚本直接操作Nginx的连接对象、请求对象以及响应对象,如读写客户端请求、设置HTTP头、发送响应数据等。例如,`ngx.say()`用于向客户端发送文本,`ngx.exit()`可以用来提前结束请求处理。 此外,lua-...
在现代Web服务开发中,高效的HTTP请求处理是至关重要的。OpenResty,一个基于Nginx与LuaJIT的高性能Web平台,为开发者提供了丰富的功能来构建复杂的Web应用程序。而`lua-resty-post`则是针对OpenResty设计的一个HTTP...
这个库允许你在 `OpenResty` 的 Lua 脚本中发送 HTTP 请求,从而扩展 `Nginx` 的功能,比如实现 API 调用、负载均衡、缓存处理等。 **主要特点:** 1. **基于 cosocket:** `lua-resty-http` 使用 OpenResty 的 ...
3. **Luasocket**: lua-multipart-post可能利用Luasocket库提供的TCP和UDP套接字功能,用于发送HTTP请求。Luasocket还支持HTTP协议,使得Lua可以处理各种HTTP操作。 4. **使用方法**: 库通常会提供API接口,允许...
lua-resty-auto-ssl会根据ACME协议,通过HTTP或DNS验证来证明你对请求证书的域名拥有权,然后向Let's Encrypt提交请求,获取并安装SSL证书。 在OpenResty中配置lua-resty-auto-ssl,你需要先确保已经安装了...
这使得Lua开发者能够利用libcurl的强大功能,如发起HTTP请求、管理cookies、进行文件上传下载等,而无需直接与底层的C代码交互。 **标签解析:** - **lua**:表示这是关于Lua编程语言的内容。 - **curl**:指的是...
在Nginx下的lua代码中使用lua-resty-smtp ,您只需要使用方便的HTTP客户端(来自Python的curl , wget , urllib2等)发出HTTP请求,以便将邮件发送到SMTP服务器。特征基于模块socket.smtp ,并且还与API兼容支持...
lua-resty领事库与ngx_lua的consul HTTP API接口目录 概述所有方法都返回lua-resty-http响应对象。 已读取响应主体并将其设置为res.body ,如果响应具有Application/JSON的Content-Type标头, res.body JSON解码。 ...
3. **httpcli-resty**:这是另一个OpenResty的Lua模块,用于执行HTTP请求。lua-etcd-resty依赖于它来发送RESTful请求到etcd服务器。 4. **etcd**:显然,你需要在系统上安装并运行etcd服务,以便lua-etcd-resty可以...
此外,还可以利用lua-resty-http库发送HTTP请求,获取其他服务的metrics,进一步丰富监控视图。 配置好后,Prometheus服务器会定期抓取Nginx暴露的metrics,然后通过其强大的查询语言Grafana或其他可视化工具展示...
这个库的出现极大地简化了在Lua中处理网络请求的流程,特别是对于那些需要频繁发送HTTP请求的项目,如Web爬虫、API接口测试或数据抓取任务。以下是关于Lua-Requests的一些关键知识点: 1. **HTTP协议支持**:Lua-...
在Lua中,该客户端通常用于处理HTTP请求,如GET、POST、PUT、DELETE等,以及管理JSON数据的序列化和反序列化。它简化了API调用的流程,使得开发者能够专注于业务逻辑,而不是底层网络细节。 **主要功能与特性:** ...
lua-curl 提供了发送 GET、POST、PUT、DELETE 等多种请求的方法,并能处理重定向、cookies、HTTP 基本认证等多种功能。在 `lua-github` 中,lua-curl 负责实际的网络通信,将 Lua 代码中的请求参数转化为 HTTP 请求...
反向代理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",...
通过分析和学习这个示例,开发者可以快速掌握在Cocos2d-x环境中进行HTTP请求的方法,从而实现在游戏中的网络功能,如下载资源、同步用户数据等。 总之,Cocos2d-x提供的`network`模块为开发者提供了方便的接口来...
### Lua解码HTTP POST数据知识点解析 #### 一、HTTP POST请求概述 HTTP协议作为互联网上应用最为广泛的一种网络协议,其POST方法主要用于向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含...
`lua-mailgun` 库实现了对 Mailgun 提供的 HTTP API 的调用,使 Lua 开发者能够利用其功能而无需直接处理底层 HTTP 请求。通过这个库,你可以轻松创建、发送和跟踪电子邮件,从而简化了邮件服务集成的过程。 **2. ...
这段代码创建了一个TCP客户端,连接到本地主机的80端口,并发送了一个HTTP请求。 4. **TCP与UDP** - **TCP(Transmission Control Protocol)**:是一种面向连接的协议,保证数据的可靠传输。Lua Socket的TCP接口...
例如,`ngx.var` 变量可以获取HTTP请求的相关信息,而 `ngx.shared.DICT` 允许我们共享内存字典,用于在不同请求之间存储和共享数据。 要统计虚拟主机的性能,我们可能需要记录每个请求的处理时间、请求类型(GET、...