POST请求使用Nginx Lua进行表单数据操作

时间:2016-03-16 05:26:43

标签: ajax nginx lua multipartform-data

我使用最新版本的OpenResty使用Nginx Lua对POST请求数据执行一些操作。我通过rewrite_by_lua_file调用调用的测试Lua脚本很简单

ngx.req.read_body();
local args = ngx.req.get_post_args();
ngx.say(args["a"]);

为了测试它,我有一个简单的HTML文档

<html>
<head>
<script   
 src="https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js">   
</script>
<script>
 $(document).ready(function(){
  $('#btnPOST').click(doPOST);
  $('#btnAJAX').click(doAJAX);
 });

 function doPOST()
 {
  $.post('index.php',{a:2,b:3},afterAJAX);
 }

 function doAJAX()
 {
  var fd = new FormData();
  fd.append('a',2);
  fd.append('b',3);

  $.ajax(
        {url:'index.php',data:fd,cache:false,contentType:false,
         processData:false,
         type:'POST',success:function(d){afterAJAX(d);},error:netError});
  }

  function afterAJAX(d,e)
  {
   debugger;
   alert(d);
  }

  function netError(){alert('error');}
 </script>
</head>
 <body>
  <button id='btnPOST'>Post</button>
  <button id='btnAJAX'>Ajax</button>
 </body>
</html>

点击“发布”按钮会显示预期结果 - 警告框中显示“&#39; 2&#39;。

单击提交表单OTH的AJAX按钮返回d=nil

我不确定这里发生了什么。我怀疑这里的问题与多部分表单数据的发送方式有关。似乎Lua / Nginx在解析多部分边界上的表单数据时遗漏了。但是,目前尚不清楚我应该在Lua端做些什么。我非常感谢一些帮助

1 个答案:

答案 0 :(得分:1)

单击AJAX按钮,以下请求将发送到nginx。

POST /index.php HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Content-Length: 222
Pragma: no-cache
Cache-Control: no-cache
Accept: */*
Origin: http://localhost:8080
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarylz2ebdJs5FUQBDut
Referer: http://localhost:8080/1.html
Accept-Encoding: gzip, deflate
Accept-Language: en-US,en;q=0.8
Cookie: ASP.NET_SessionId=g2cg0ewk1p1o3atzmtliqydx


------WebKitFormBoundaryJOYCopXkOqDBaqff
Content-Disposition: form-data; name="a"

2
------WebKitFormBoundaryJOYCopXkOqDBaqff
Content-Disposition: form-data; name="b"

3
------WebKitFormBoundaryJOYCopXkOqDBaqff--

请注意,请求正文不是键/值参数格式,例如a=2&b=3 因此ngx.req.get_post_args无法解析AJAX请求正文,而ngx.say(args[a])输出nil

<强>更新

对于流式阅读器和解析器,您可以尝试lua-resty-upload项目。