`

lua-发送http请求

阅读更多

概述:

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
分享到:
评论
3 楼 wy8232255 2016-10-19  
我现在有这样的需求,实现用户必须在登录状态下访问图片信息。目前的图片服务器用的是Nginx做的。
2 楼 TNT小炸弹 2016-10-18  
上面有整个的文件,还有调用的入口,我不知道你还想要什么?
1 楼 wy8232255 2016-10-17  
哥们您好,可否把你的代码发给我一份,谢谢

相关推荐

    lua-cURL访问http/https

    Lua-cURL是一个用于在Lua环境中实现HTTP和HTTPS访问的库,它是基于著名的C语言库cURL构建的。这个库提供了全面的功能,使得Lua...无论你是处理简单的HTTP请求还是构建复杂的网络应用,Lua-cURL都是一个值得信赖的库。

    lua-nginx-module-0.10.20.tar.gz

    这些API允许Lua脚本直接操作Nginx的连接对象、请求对象以及响应对象,如读写客户端请求、设置HTTP头、发送响应数据等。例如,`ngx.say()`用于向客户端发送文本,`ngx.exit()`可以用来提前结束请求处理。 此外,lua-...

    lua-resty-post:用于openresty的HTTP发布实用程序

    在现代Web服务开发中,高效的HTTP请求处理是至关重要的。OpenResty,一个基于Nginx与LuaJIT的高性能Web平台,为开发者提供了丰富的功能来构建复杂的Web应用程序。而`lua-resty-post`则是针对OpenResty设计的一个HTTP...

    lua-resty-http:用于OpenResty ngx_lua的Lua HTTP客户端cosocket驱动程序

    这个库允许你在 `OpenResty` 的 Lua 脚本中发送 HTTP 请求,从而扩展 `Nginx` 的功能,比如实现 API 调用、负载均衡、缓存处理等。 **主要特点:** 1. **基于 cosocket:** `lua-resty-http` 使用 OpenResty 的 ...

    lua-multipart-post:HTTP Multipart Post帮助程序

    3. **Luasocket**: lua-multipart-post可能利用Luasocket库提供的TCP和UDP套接字功能,用于发送HTTP请求。Luasocket还支持HTTP协议,使得Lua可以处理各种HTTP操作。 4. **使用方法**: 库通常会提供API接口,允许...

    lua-resty-auto-ssl:使用Let's Encrypt在OpenRestynginx内即时(免费)进行SSL注册和更新

    lua-resty-auto-ssl会根据ACME协议,通过HTTP或DNS验证来证明你对请求证书的域名拥有权,然后向Let's Encrypt提交请求,获取并安装SSL证书。 在OpenResty中配置lua-resty-auto-ssl,你需要先确保已经安装了...

    Lua-cURLv3:Lua绑定到libcurl

    这使得Lua开发者能够利用libcurl的强大功能,如发起HTTP请求、管理cookies、进行文件上传下载等,而无需直接与底层的C代码交互。 **标签解析:** - **lua**:表示这是关于Lua编程语言的内容。 - **curl**:指的是...

    lua-resty-smtp:尝试通过Nginx发送邮件我一定疯了

    在Nginx下的lua代码中使用lua-resty-smtp ,您只需要使用方便的HTTP客户端(来自Python的curl , wget , urllib2等)发出HTTP请求,以便将邮件发送到SMTP服务器。特征基于模块socket.smtp ,并且还与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解码。 ...

    lua-etcd-resty:OpenResty 的 etcd 客户端模块

    3. **httpcli-resty**:这是另一个OpenResty的Lua模块,用于执行HTTP请求。lua-etcd-resty依赖于它来发送RESTful请求到etcd服务器。 4. **etcd**:显然,你需要在系统上安装并运行etcd服务,以便lua-etcd-resty可以...

    nginx-lua-prometheus.tgz

    此外,还可以利用lua-resty-http库发送HTTP请求,获取其他服务的metrics,进一步丰富监控视图。 配置好后,Prometheus服务器会定期抓取Nginx暴露的metrics,然后通过其强大的查询语言Grafana或其他可视化工具展示...

    lua-requests:请求lua!

    这个库的出现极大地简化了在Lua中处理网络请求的流程,特别是对于那些需要频繁发送HTTP请求的项目,如Web爬虫、API接口测试或数据抓取任务。以下是关于Lua-Requests的一些关键知识点: 1. **HTTP协议支持**:Lua-...

    lua-api-client:Lua REST API客户端

    在Lua中,该客户端通常用于处理HTTP请求,如GET、POST、PUT、DELETE等,以及管理JSON数据的序列化和反序列化。它简化了API调用的流程,使得开发者能够专注于业务逻辑,而不是底层网络细节。 **主要功能与特性:** ...

    lua-github:GitHub ReST API v3的lua-curl包装器

    lua-curl 提供了发送 GET、POST、PUT、DELETE 等多种请求的方法,并能处理重定向、cookies、HTTP 基本认证等多种功能。在 `lua-github` 中,lua-curl 负责实际的网络通信,将 Lua 代码中的请求参数转化为 HTTP 请求...

    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",...

    cocos2dx Http 网络请求 例子

    通过分析和学习这个示例,开发者可以快速掌握在Cocos2d-x环境中进行HTTP请求的方法,从而实现在游戏中的网络功能,如下载资源、同步用户数据等。 总之,Cocos2d-x提供的`network`模块为开发者提供了方便的接口来...

    Lua解码http post数据

    ### Lua解码HTTP POST数据知识点解析 #### 一、HTTP POST请求概述 HTTP协议作为互联网上应用最为广泛的一种网络协议,其POST方法主要用于向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含...

    lua-mailgun:Lua与Mailgun HTTP API的绑定

    `lua-mailgun` 库实现了对 Mailgun 提供的 HTTP API 的调用,使 Lua 开发者能够利用其功能而无需直接处理底层 HTTP 请求。通过这个库,你可以轻松创建、发送和跟踪电子邮件,从而简化了邮件服务集成的过程。 **2. ...

    lua socket 支持lua SOCKET编程

    这段代码创建了一个TCP客户端,连接到本地主机的80端口,并发送了一个HTTP请求。 4. **TCP与UDP** - **TCP(Transmission Control Protocol)**:是一种面向连接的协议,保证数据的可靠传输。Lua Socket的TCP接口...

    通过ngx-lua来统计nginx上的虚拟主机性能数据

    例如,`ngx.var` 变量可以获取HTTP请求的相关信息,而 `ngx.shared.DICT` 允许我们共享内存字典,用于在不同请求之间存储和共享数据。 要统计虚拟主机的性能,我们可能需要记录每个请求的处理时间、请求类型(GET、...

Global site tag (gtag.js) - Google Analytics