lua-发送http请求 - - ITeye博客


本站和网页 https://www.iteye.com/blog/anbolihua-2316423 的作者无关,不对其内容负责。快照谨为网络故障时之索引,不代表被搜索网站的即时页面。

lua-发送http请求 - - ITeye博客
首页
资讯
精华
论坛
问答
博客
专栏
群组
下载
资源
搜索
您还未登录!
登录
TNT小炸弹
浏览:
56969 次
性别:
来自:
北京
最近访客
更多访客>>
路人NFTS
nk231001609
haigangyuan2011
malq159753
博主相关
博客
微博
相册
收藏
留言
关于我
文章分类
全部博客 (9)
知识积累--maven打jar包包含配置文件 (1)
知识积累--数据库篇 (1)
知识积累--linux安装系列 (1)
知识积累-lua之http篇 (1)
知识积累--redis在Web工程中的使用 (0)
知识积累--redis在Web工程中的运用 (1)
Memcached在Web工程中的运用 (1)
知识积累--项目中数据库链接--com.mchange.v2.resourcepool.TimeoutException: A client timed out while waiting to acquire a resource from com.mchange.v2.resourcepool.BasicResourcePool@7187a2f1 -- timeout at awaitAvailable() (1)
社区版块
我的资讯 (
0)
我的论坛 (
0)
我的问答 (
0)
存档分类
2020-04
1)
2018-11
1)
2017-06
1)
更多存档...
最新评论
TNT小炸弹:
网站有问题,目前上传图片上传不成功,过两天再补充图片
知识积累--activity工作流--问题总结
wy8232255:
我现在有这样的需求,实现用户必须在登录状态下访问图片信息。目前 ...
lua-发送http请求
TNT小炸弹:
上面有整个的文件,还有调用的入口,我不知道你还想要什么?
lua-发送http请求
wy8232255:
哥们您好,可否把你的代码发给我一份,谢谢
lua-发送http请求
TNT小炸弹
lua-发送http请求
博客分类: 知识积累-lua之http篇
luahttpcontent_type
阅读更多
概述:
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的内容,也许方式一也可以,但是我没搞出来。
~~~~~~~~纯个人项目遇到的问题总结,如能帮上您,我很开心,如有错误或者不严谨的地方,还望指教!~~~
大小: 8.9 KB
大小: 16.1 KB
大小: 10.8 KB
大小: 4.6 KB
大小: 13.6 KB
查看图片附件
0 顶0 踩
分享到:
知识积累-redis使用
linux安装mysql
2016-08-09 16:57
浏览 43015
评论(3)
分类:编程语言
查看更多
评论
3 楼
wy8232255
2016-10-19
我现在有这样的需求,实现用户必须在登录状态下访问图片信息。目前的图片服务器用的是Nginx做的。
2 楼
TNT小炸弹
2016-10-18
上面有整个的文件,还有调用的入口,我不知道你还想要什么?
1 楼
wy8232255
2016-10-17
哥们您好,可否把你的代码发给我一份,谢谢
发表评论
您还没有登录,请您登录后再发表评论
相关推荐
lua-resty-smtp:尝试通过Nginx发送邮件我一定疯了
在Nginx下的lua代码中使用lua-resty-smtp ,您只需要使用方便的HTTP客户端(来自Python的curl , wget , urllib2等)发出HTTP请求,以便将邮件发送到SMTP服务器。特征基于模块socket.smtp ,并且还与API兼容支持...
nginx-lua-rewrite-request:以下示例是通过添加一些其他数据来重写传入请求,然后将新请求发送到目标
反向代理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",...
lua-httpcli-resty:OpenResty的HTTP客户端模块
依存关系httpcli: : 安装luarocks install httpcli-resty --from=http://mah0x211.github.io/rocks/用法该模块将通过ngx.location.capture API发送http请求。 请参阅以获取有关该API和行为的更多详细信息。 支持...
lua-resty-consul:库与ngx_lua的consul HTTP API接口
lua-resty领事库与ngx_lua的consul HTTP API接口目录 概述所有方法都返回lua-resty-http响应对象。 已读取响应主体并将其设置为res.body ,如果响应具有Application/JSON的Content-Type标头, res.body JSON解码。 ...
ESP8266-HTTP:半HTTP兼容的lua库,用于下载文件和发送GET请求
ESP8266-HTTP 半HTTP兼容的lua库,用于下载文件和发送GET请求
基于storm实时热点统计的分布式并行缓存预热
在nginx这一层,接收到访问请求的时候,就把请求的流量上报发送给kafka 这样的话,storm才能去消费kafka中的实时的访问日志,然后去进行缓存热数据的统计 用得技术方案非常简单,从lua脚本直接创建一个kafka ...
HttpSpy:一种轻松重构客户端发送的HTTP请求的工具
一种轻松重建客户端发送的HTTP请求的工具。 为什么要使用这个? 与其他公共间谍不同,我的系统使用发送的信息重建请求。 您应该使用渗透测试吗? 简单的答案,不。有多种检测方法,我将其专用。
Envoy外部授权API与SPIFFE Workload API的桥梁-Golang开发
此服务与spire-agent通信,以获取和验证通过HTTP发送给它的JWT-SVID,通常是使用...Emissary的工作方式Emissary使用Envoy的ext_authz过滤器(或任何代理中的另一种方法来执行子请求并根据结果,lua等采取行动)以允许或
esp8266-ws2811-rgb-led-strip:基于 NodeMCU 的代码,用于基于 HTTP 的 WS2811 LED 控制
使用 HTTP 服务器和基于查询参数的请求对 WS2811 RGB LED 灯条进行简单控制 支持任意长度的十六进制模式: 可以将所有 LED 设置为相同颜色 例如可以交替两种颜色 每个 LED 可以发送一种颜色 要求 一个运行 NodeMCU...
fooking:分布式网关服务器(php游戏服务器,tcp服务器,websocket服务器)
fooking是分布式网关服务器,它将客户端的请求传输到后端并使用fpm协议将响应发送回去。 就像Nginx一样,使用nginx和fastcgi服务器(例如fpm等)构建http服务器,您可以使用fooking创建套接字服务器。特征1个网关...
整理
避免缓存雪崩且可有效减少重复发送相同的redis请求的缓存获取器对象; 基于Redis zset的简易优先级等级(复杂业务请考虑专业MQ组件); 使用Redis实现的关系型数据ORM,配合Lua Script基本能替代SQL; 支持服务平滑...
caress:Chatphrase 异步表示状态信号
在回答名称之前,只有第一项会提供给通过 HTTP 请求报价的代理。 报价回复位置/{报价名称} 端点的 UUID 接受对指定的未答复提议的答复。 报价名称/{uuid} 此 UUID 正在侦听的报价的名称。 提供答案/{uuid} UUID ...
gmod_discordrpc:已弃用-对Garry's Mod的Discord Rich Presence支持!
该脚本使您的游戏客户端将HTTP请求发送到Discord客户端的RPC服务器,以便根据您提供的内容更改Rich Presence。 它完全是客户端,您的服务器除了为播放器提供文件外,与该附件没有任何关系,因此不需要担心任何奇怪...
Global site tag (gtag.js) - Google Analytics