RestFul作为通用的json+http传输请求的规范,越来越多的api采用此形式进行交互。不可避免的,需要对其请求的内容进行审计。然而RestFul的Post请求一般采用以下的方式进行请求。
curl -H "Content-Type: application/json" -d '{"key":"value"}' http://localhost:8000/hello
这一形式,是将json data 采用httpbody进行承载。在常用的http处理框架中,一般的处理形式都是从InputStream这种输入流中读取,流不可以二次读取,这个是肯定的。一旦在某个程序某个地方拦截之后,就无法让接下来的程序逻辑去透明的处理httpbody了。难道必须每个action都进行硬编码记录吗?答案是否定的,我们可以通过在处理框架前面堆代理服务器进行请求拦截和获取数据,也就是我们一般常说的反向代理。
在nginx中,通过安装lua模块之后,在rewrite阶段通过lua去获取bodydata,然后再进行其余的操作,基本思路就是这样子的。
rewrite_by_lua '
ngx.req.read_body();
local body = ngx.req.get_body_data()
ngx.log(ngx.DEBUG,body);
...
';
一般情况下,除了直接获取body之外,还需要对记录的内容做一些逻辑,这里就不阐述了。