- 浏览: 33039 次
最新评论
#### 做前端开发,大多数情况下,都需要跟后端打交道,而最常见的方式则是通过http请求,进行通信。
在openresty中,通过http跟后端整合通信的方式又很多种,各有各的好处,可以根据情况交叉使用
## 1、直接proxy
这种方式最简单,也是我们最熟悉的,直接配置一个反向代理,跟nginx的用法一致
比如我们有一个后端服务,提供用户相关接口,是java写的,端口8080,为了简单起见,我直接在openresty里面配置一个server,模拟java端,通过一个简单的案例的来说明情况
nginx.conf
```
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
lua_package_path "/Users/john/opensource/openresty-web-dev/demo7/lua/?.lua;/usr/local/openresty/lualib/?.lua";
server {
listen 80;
server_name localhost;
lua_code_cache off;
location / {
root html;
index index.html;
}
location ~ ^/user {
proxy_pass http://127.0.0.1:8080;
}
}
# 这个只是模拟后端
server {
listen 8080;
server_name localhost;
lua_code_cache off;
location ~ /user/(.+) {
default_type text/html;
content_by_lua_file lua/$1.lua;
}
}
}
```
上面配置了两个location,将所有以/user开头的请求都转到后端的8080服务器,其他的则是静态页面,直接从html目录读取,然后返回,从这里开始就是前端开发了
为了简单起见,假设后端提供了一个登陆接口,我们这里直接用lua来实现一下就好了,检查用户名跟密码是admin,就返回成功,否则返回失败
lua/login.lua
```
local req = require "req"
local cjson = require "cjson"
local args = req.getArgs()
local username = args['username']
local password = args['password']
local res = {}
if username == "admin" and password == "admin" then
res['ret'] = true
res['token'] = ngx.md5('admin/' .. tostring(ngx.time()))
else
res['ret'] = false
end
ngx.say(cjson.encode(res))
```
index.html
```
<html>
<head>
<meta charset="UTF-8">
<title>Login Page</title>
</head>
<body>
UserName: <input type="text" id="username" value="admin">
Password: <input type="password" id="password" value="admin">
<a href="javascript:void(0)" onclick="login()">Login</a>
<script src="//cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>
<script>
function login() {
var username = $('#username').val();
var password = $('#password').val();
$.post('/user/login', {username: username, password: password}, function(res){
console.log(res)
var msg = res.ret ? "登录成功" : "登录失败"
alert(msg)
}, 'json')
}
</script>
</body>
</html>
```
2、使用ngx.location.captrue
这个方法主要用于发送内部请求,即请求当前server内的其他location,默认会将当前请求的参数带过去,也可以手动指定参数,GET参数通过args传递,post参数通过body传递
如:
local req = require "req"
local args = req.getArgs()
GET 调用
local res = ngx.location.capture('/user/login', {
method = ngx.HTTP_GET,
args = args,
});
POST 调用
local res = ngx.location.capture('/user/login', {
method = ngx.HTTP_POST,
body = ngx.encode_args(args),
});
现在我们自己写一个lua来调用后台接口实现登陆,然后对请求做一点处理,实现一些额外的逻辑,比如在原来的参数上面加上一个from字段
lua/local-login.lua
```
local req = require "req"
local cjson = require "cjson"
local args = req.getArgs()
-- GET
local res = ngx.location.capture('/user/login', {method = ngx.HTTP_GET, args = args})
-- POST
-- local res = ngx.location.capture('/user/login', {method = ngx.HTTP_POST, body = ngx.encode_args(args)})
-- print(res.status) -- 状态码
if res.status == 200 then
local ret = cjson.decode(res.body)
ret['from'] = 'local'
ngx.say(cjson.encode(ret))
else
print(res.body)
ngx.say('{"ret": false, "from": "local"}')
end
```
index.html 也需要改一下,多加一个按钮,调用本地登陆接口
```
<html>
<head>
<meta charset="UTF-8">
<title>Login Page</title>
</head>
<body>
UserName: <input type="text" id="username" value="admin">
Password: <input type="password" id="password" value="admin">
<a href="javascript:void(0)" onclick="login()">Login</a>
<a href="javascript:void(0)" onclick="local_login()">Local Login</a>
<script src="//cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>
<script>
function login() {
var username = $('#username').val();
var password = $('#password').val();
$.post('/user/login', {username: username, password: password}, function(res){
console.log(res)
var msg = res.ret ? "登录成功" : "登录失败"
alert(msg)
}, 'json')
}
function local_login() {
var username = $('#username').val();
var password = $('#password').val();
$.post('/lua/local-login', {username: username, password: password}, function(res){
console.log(res)
var msg = res.ret ? "本地登录成功" : "本地登录失败"
alert(msg)
}, 'json')
}
</script>
</body>
</html>
```
3、第三方模块[lua-resty-http](https://github.com/pintsized/lua-resty-http)
这种方式跟上面那种不同的地方是调用的时候,不会带上本地请求的请求头、cookie、以及请求参数,不过这也使得请求更纯粹,不会带上那些没必要的东西,减少数据传输
最后local-login.lua 变成如下
```
local req = require "req"
local cjson = require "cjson"
local http = require "resty.http"
local args = req.getArgs()
-- GET
-- local res = ngx.location.capture('/user/login', {method = ngx.HTTP_GET, args = args})
-- POST
-- local res = ngx.location.capture('/user/login', {method = ngx.HTTP_POST, body = ngx.encode_args(args)})
-- http
local httpc = http.new()
local res = httpc:request_uri("http://127.0.0.1:8080/user/login", {
method = "POST",
body = ngx.encode_args(args),
headers = {
["Accept"] = "application/json",
["Accept-Encoding"] = "utf-8",
["Cookie"] = ngx.req.get_headers()['Cookie'],
["Content-Type"] = "application/x-www-form-urlencoded",
}
})
httpc:set_keepalive(60)
print(res.status) -- 状态码
if res.status == 200 then
local ret = cjson.decode(res.body)
ret['from'] = 'local'
ngx.say(cjson.encode(ret))
else
print(res.body)
ngx.say('{"ret": false, "from": "local"}')
end
```
到此,基本上已经能通过openresty,做一些前后端的交互了,下次介绍怎么使用openresty模板渲染,以及搭配react开发前端。
[示例代码](https://github.com/362228416/openresty-web-dev) 参见demo7部分
在openresty中,通过http跟后端整合通信的方式又很多种,各有各的好处,可以根据情况交叉使用
## 1、直接proxy
这种方式最简单,也是我们最熟悉的,直接配置一个反向代理,跟nginx的用法一致
比如我们有一个后端服务,提供用户相关接口,是java写的,端口8080,为了简单起见,我直接在openresty里面配置一个server,模拟java端,通过一个简单的案例的来说明情况
nginx.conf
```
worker_processes 1;
error_log logs/error.log;
events {
worker_connections 1024;
}
http {
lua_package_path "/Users/john/opensource/openresty-web-dev/demo7/lua/?.lua;/usr/local/openresty/lualib/?.lua";
server {
listen 80;
server_name localhost;
lua_code_cache off;
location / {
root html;
index index.html;
}
location ~ ^/user {
proxy_pass http://127.0.0.1:8080;
}
}
# 这个只是模拟后端
server {
listen 8080;
server_name localhost;
lua_code_cache off;
location ~ /user/(.+) {
default_type text/html;
content_by_lua_file lua/$1.lua;
}
}
}
```
上面配置了两个location,将所有以/user开头的请求都转到后端的8080服务器,其他的则是静态页面,直接从html目录读取,然后返回,从这里开始就是前端开发了
为了简单起见,假设后端提供了一个登陆接口,我们这里直接用lua来实现一下就好了,检查用户名跟密码是admin,就返回成功,否则返回失败
lua/login.lua
```
local req = require "req"
local cjson = require "cjson"
local args = req.getArgs()
local username = args['username']
local password = args['password']
local res = {}
if username == "admin" and password == "admin" then
res['ret'] = true
res['token'] = ngx.md5('admin/' .. tostring(ngx.time()))
else
res['ret'] = false
end
ngx.say(cjson.encode(res))
```
index.html
```
<html>
<head>
<meta charset="UTF-8">
<title>Login Page</title>
</head>
<body>
UserName: <input type="text" id="username" value="admin">
Password: <input type="password" id="password" value="admin">
<a href="javascript:void(0)" onclick="login()">Login</a>
<script src="//cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>
<script>
function login() {
var username = $('#username').val();
var password = $('#password').val();
$.post('/user/login', {username: username, password: password}, function(res){
console.log(res)
var msg = res.ret ? "登录成功" : "登录失败"
alert(msg)
}, 'json')
}
</script>
</body>
</html>
```
2、使用ngx.location.captrue
这个方法主要用于发送内部请求,即请求当前server内的其他location,默认会将当前请求的参数带过去,也可以手动指定参数,GET参数通过args传递,post参数通过body传递
如:
local req = require "req"
local args = req.getArgs()
GET 调用
local res = ngx.location.capture('/user/login', {
method = ngx.HTTP_GET,
args = args,
});
POST 调用
local res = ngx.location.capture('/user/login', {
method = ngx.HTTP_POST,
body = ngx.encode_args(args),
});
现在我们自己写一个lua来调用后台接口实现登陆,然后对请求做一点处理,实现一些额外的逻辑,比如在原来的参数上面加上一个from字段
lua/local-login.lua
```
local req = require "req"
local cjson = require "cjson"
local args = req.getArgs()
-- GET
local res = ngx.location.capture('/user/login', {method = ngx.HTTP_GET, args = args})
-- POST
-- local res = ngx.location.capture('/user/login', {method = ngx.HTTP_POST, body = ngx.encode_args(args)})
-- print(res.status) -- 状态码
if res.status == 200 then
local ret = cjson.decode(res.body)
ret['from'] = 'local'
ngx.say(cjson.encode(ret))
else
print(res.body)
ngx.say('{"ret": false, "from": "local"}')
end
```
index.html 也需要改一下,多加一个按钮,调用本地登陆接口
```
<html>
<head>
<meta charset="UTF-8">
<title>Login Page</title>
</head>
<body>
UserName: <input type="text" id="username" value="admin">
Password: <input type="password" id="password" value="admin">
<a href="javascript:void(0)" onclick="login()">Login</a>
<a href="javascript:void(0)" onclick="local_login()">Local Login</a>
<script src="//cdn.bootcss.com/jquery/2.2.4/jquery.min.js"></script>
<script>
function login() {
var username = $('#username').val();
var password = $('#password').val();
$.post('/user/login', {username: username, password: password}, function(res){
console.log(res)
var msg = res.ret ? "登录成功" : "登录失败"
alert(msg)
}, 'json')
}
function local_login() {
var username = $('#username').val();
var password = $('#password').val();
$.post('/lua/local-login', {username: username, password: password}, function(res){
console.log(res)
var msg = res.ret ? "本地登录成功" : "本地登录失败"
alert(msg)
}, 'json')
}
</script>
</body>
</html>
```
3、第三方模块[lua-resty-http](https://github.com/pintsized/lua-resty-http)
这种方式跟上面那种不同的地方是调用的时候,不会带上本地请求的请求头、cookie、以及请求参数,不过这也使得请求更纯粹,不会带上那些没必要的东西,减少数据传输
最后local-login.lua 变成如下
```
local req = require "req"
local cjson = require "cjson"
local http = require "resty.http"
local args = req.getArgs()
-- GET
-- local res = ngx.location.capture('/user/login', {method = ngx.HTTP_GET, args = args})
-- POST
-- local res = ngx.location.capture('/user/login', {method = ngx.HTTP_POST, body = ngx.encode_args(args)})
-- http
local httpc = http.new()
local res = httpc:request_uri("http://127.0.0.1:8080/user/login", {
method = "POST",
body = ngx.encode_args(args),
headers = {
["Accept"] = "application/json",
["Accept-Encoding"] = "utf-8",
["Cookie"] = ngx.req.get_headers()['Cookie'],
["Content-Type"] = "application/x-www-form-urlencoded",
}
})
httpc:set_keepalive(60)
print(res.status) -- 状态码
if res.status == 200 then
local ret = cjson.decode(res.body)
ret['from'] = 'local'
ngx.say(cjson.encode(ret))
else
print(res.body)
ngx.say('{"ret": false, "from": "local"}')
end
```
到此,基本上已经能通过openresty,做一些前后端的交互了,下次介绍怎么使用openresty模板渲染,以及搭配react开发前端。
[示例代码](https://github.com/362228416/openresty-web-dev) 参见demo7部分
发表评论
-
openresty 前端开发轻量级MVC框架封装二(渲染篇)
2017-01-11 00:50 1720#### 这一章主要介绍怎么使用模板,进行后端渲染,主要用到了 ... -
openresty 前端开发轻量级MVC框架封装一(控制器篇)
2017-01-10 22:48 780#### 通过前面几章,我们已经掌握了一些基本的开发知识,但是 ... -
openresty 前端开发入门六之调试篇
2017-01-04 14:03 787#### 大多数情况下,调试信息,都可以通过ngx.say打印 ... -
openresty 前端开发入门五之Mysql篇
2017-01-04 00:00 510openresty 前端开发入门五 ... -
openresty 前端开发入门四之Redis篇
2017-01-03 10:41 1475#### 这章主要演示怎么 ... -
openresty 前端开发入门三之JSON篇
2017-01-03 10:36 716#### 这章主要介绍一下,lua怎么返回一个json字符串, ... -
openresty 前端开发入门二
2017-01-03 10:36 560#### 这一章主要介绍介绍怎么获取请求参数,并且处理之后返回 ... -
openresty 前端开发入门一
2016-12-30 00:41 725OpenResty ™ 是一个基于 Nginx 与 Lua 的 ... -
使用nginx管理docker容器
2016-12-28 00:07 1608### 一直YY着想有一个基于web的docker管理器,市面 ... -
openresty 前端开发序
2016-12-09 11:45 497还记得第一次尝试前后端分离的时候,是使用nginx + ...
相关推荐
openresty 前端开发进阶三之后端整合二 openresty 前端开发进阶四之session篇 openresty 前端开发进阶六之websocket篇 openresty 前端开发高级应用一之性能优化 openresty 前端开发高级应用一之动态追踪技术 ...
OpenResty+Lua+Redis 高性能后端接口 OpenResty 是基于 Nginx 的高性能 web 服务器,它使用 Lua 语言作为脚本语言来实现动态内容生成和处理。 Lua 是一种轻量级的脚本语言,广泛应用于游戏、嵌入式系统和 web 开发...
通过Nginx的高性能网络I/O,Lua的轻量级脚本处理,以及Redis的高速数据存储,可以构建出满足高并发、低延迟需求的服务,广泛应用于大型网站、移动应用的后端开发中。在实际项目中,合理运用这三个工具,能够显著提升...
OpenResty是一个基于Nginx的Web服务,结合Lua脚本语言,可以方便地实现HTTP服务器的扩展,用于处理前端埋点的数据收集和转发。而Lua则是一种轻量级的脚本语言,常用于嵌入式系统,这里可能是用来编写处理埋点数据的...
《OpenResty官方学习资料》是一份由章亦春编写的综合教程,旨在帮助开发者从初识到精通OpenResty这一强大的Web服务框架。OpenResty是基于Nginx和LuaJIT的开源项目,它将Nginx的高性能与Lua的轻量级脚本能力相结合,...
这些操作直接关系到Web应用的前端交互和后端服务数据交换。 在高级应用中,我们会使用Lua开发各种功能模块,如Lua Resty Redis Library进行Redis数据库的快速访问,以及Lua Resty CJSON Library处理JSON数据的解析...
在语音交互领域,OpenResty可以作为一个强大的后端处理引擎,与各种语音识别和合成技术相结合,提供高效、实时的语音交互体验。 OpenResty的核心是Nginx,一个著名的高性能HTTP和反向代理服务器。Nginx以其事件驱动...
本章将深入讲解如何安装OpenResty开发环境,帮助你搭建起一个基于Nginx的动态、高性能Web应用程序平台。 首先,我们要了解OpenResty是什么。OpenResty是一个开源项目,它集成了Nginx服务器和LuaJIT,允许开发者在...
OpenResty是一套基于Nginx和LuaJIT的高性能Web平台,它将Lua语言和Nginx模块化设计的优点...它为那些对Web前端开发、网关开发以及限流代理服务器开发感兴趣的读者提供了宝贵的指导,同时也为OpenResty社区做出了贡献。
通过揉和众多设计良好的 Nginx 模块,OpenResty 有效地把 Nginx 服务器转变为一个强大的 Web 应用服务器,基于它开发人员可以使用 Lua 编程语言对 Nginx 核心以及现有的各种 Nginx C 模块进行脚本编程,构建出可以...
OpenResty的目标是让你的Web服务直接跑在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅仅对 HTTP 客户端请求,甚至于对远程后端诸如 MySQL、PostgreSQL、Memcached 以及 Redis 等都进行一致的高性能响应...
OpenResty 是一个强大的 Web 应用服务器,Web 开发人员可以使用 Lua 脚本语言调动 Nginx 支持的各种 C 以及 Lua 模块,更主要的是在性能方面,OpenResty可以 快速构造出足以胜任 10K 以上并发连接响应的超高性能 Web ...
在 OpenResty 中,LuaJIT 被用于处理 HTTP 请求,执行业务逻辑,以及与后端数据库或其他服务交互。Lua 脚本可以轻松地控制 Nginx 的事件循环,实现非阻塞I/O,从而充分利用多核处理器的能力。 三、OpenResty 1.25....
OpenResty是一个高性能的Web平台,它基于Nginx核心,并集成了Lua语言及大量Lua库、第三方模块,用于构建能够处理高并发请求的服务器。该平台被广泛应用于开发动态Web应用、API网关、微服务、负载均衡等场景。 ...
书籍涵盖了多个知识点,从最基础的Lua脚本语言学习,到OpenResty的高级使用,为读者提供了一条从入门到进阶的学习路径。以下是书中提到的一些关键知识点的详细说明。 ### Lua脚本入门 Lua是一种轻量级的脚本语言,...
- **定义**:OpenResty是一款基于Nginx与Lua的高性能Web平台,它使得开发人员能够轻松地编写出高性能、高可靠性的Web应用程序和服务。 - **特点**: - 集成了强大的Nginx核心和许多有用的Nginx模块。 - 支持丰富的...
总结,OpenResty是一个强大且灵活的Web服务平台,尤其在Windows 64位环境下,为开发者提供了便捷的开发和运维工具。通过熟练掌握OpenResty,我们可以构建出高性能、可扩展的Web应用,满足企业级的复杂需求。
这个项目展示了如何结合OpenResty和lor框架来构建高性能的社区软件,并结合JavaScript开发出用户友好的前端,提供了一个完整的Web内容管理系统解决方案。通过深入学习和理解这个项目,开发者可以掌握到如何在实际...
《OpenResty最佳实践》是一本深入探讨OpenResty使用和优化的专业指南,它涵盖了从基础到高级的各种主题,旨在帮助开发者充分利用OpenResty的强大功能。OpenResty是一款基于Nginx和LuaJIT的高性能Web平台,它将Nginx...