ngx.req和get/post参数获取

ngx.req.raw_header 和ngx.req.get_headers示例

(1)ngx.req.raw_header
函数原型: headers = ngx.req.get_headers(max_headers?, raw?)
返回值类型为table,其大概的内容如下:

Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.8,en;q=0.6
Cache-Control:max-age=0
Connection:keep-alive
Host:localhost:8080
Upgrade-Insecure-Requests:1
User-Agent:Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36

(2)ngx.req.get_headers
函数原型:str = ngx.req.raw_header(no_request_line?)
返回值类型为是string,其大概的内容如下:

GET /echo/cyrus HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Cache-Control: max-age=0
User-Agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
Upgrade-Insecure-Requests: 1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6

以上内容因使用的web client不同,输出的内容也有较大的差异,但是一些基本的信息和格式大致是相同的。
在使用中,一般都可以通过特定的函数获取到指定的内容,比如host/uri/method/http_version等。

ngx.req.get_uri_args 和 ngx.req.get_post_args示例

(1)ngx.req.get_uri_args
函数原型:args = ngx.req.get_uri_args(max_args?)
返回类型为table,可以使用以下方式遍历:

for key, val in pairs(args) do
...
end

注意只能获取?后面的变量和相应的值,比如location为location ~ /echo/(.*)
http://localhost:8080/echo/cyrus?name&age=2
输出的结果为:

hello, cyrus
age:2
name:true

无法获取到path Variable的变量和值。对于path variable的获取使用以下方式:
ngx.say("hello, ",ngx.var[1])
注意这里的下标是从1开始。
(2)ngx.req.get_post_args
函数原型:args, err = ngx.req.get_post_args(max_args?)
返回值类型为table,遍历方式同(1)。其请求的方式为:
curl --data 'foo=bar&bar=baz&bar=blah' localhost/test
结果为:

foo: bar
bar: baz, blah

注意这里可以多次定义同一个key(比如bar),解析时作为一个可以有多个值,且使用逗号进行分割。Web使用json格式发送post请求更为常见,这里就可以使用ngx.req.get_body_data
(3)ngx.req.get_body_data
函数原型:data = ngx.req.get_body_data()
返回值类型为string,对于接收到的字符串可以进行json解码,从而实现json参数的传递。

Nginx获取请求体(body)参数有多种方式,这里介绍其中两种常用的方式: 1. 使用 Nginxngx_http_lua_module 模块解析请求体 首先需要安装 ngx_http_lua_module 模块,然后在 Nginx 配置文件中添加以下配置: ``` location /test { content_by_lua_block { ngx.req.read_body() local args, err = ngx.req.get_post_args() if not args then ngx.say("failed to get post args: ", err) return end ngx.say("args: ", cjson.encode(args)) } } ``` 上述配置中,`ngx.req.read_body()` 用于读取请求体,`ngx.req.get_post_args()` 用于解析请求体中的 POST 参数,如果是 JSON 格式的请求体,可以使用 `ngx.req.get_body_data()` 获取原始的请求体数据,然后使用 JSON 库进行解析。 2. 使用 Nginxngx_http_echo_module 模块解析请求体 ngx_http_echo_module 模块可以让 Nginx 支持类似于 PHP 中 $_POST 的功能。需要安装 ngx_http_echo_module 模块,然后在 Nginx 配置文件中添加以下配置: ``` location /test { echo_request_body; } ``` 上述配置中,`echo_request_body` 指令用于输出请求体中的所有参数。如果只想输出某个参数,可以使用 `echo_request_body_var` 指令,例如: ``` location /test { echo_request_body_var name; # 输出 name 参数的值 } ``` 在 Java 的 Servlet 中,可以使用 HttpServletRequest 对象获取请求参数、请求头和请求体。以下是示例代码: ```java protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 获取参数 String name = request.getParameter("name"); String age = request.getParameter("age"); // 获取请求头 String userAgent = request.getHeader("User-Agent"); // 获取请求体 BufferedReader reader = request.getReader(); StringBuilder sb = new StringBuilder(); String line = null; while ((line = reader.readLine()) != null) { sb.append(line); } String body = sb.toString(); // 处理请求 // ... // 返回响应 response.setContentType("text/html;charset=utf-8"); PrintWriter out = response.getWriter(); out.println("Hello, " + name); out.flush(); out.close(); } ``` 在上述代码中,`request.getParameter()` 方法用于获取参数,`request.getHeader()` 方法用于获取请求头,`request.getReader()` 方法用于获取请求体的字符流,可以通过读取字符流获取请求体的内容。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值