2016-03-16 2 views
1

Я использую последнюю версию OpenResty для выполнения некоторых манипуляций с данными запроса POST с использованием Nginx Lua. Мой тест Lua скрипт, вызывается через rewrite_by_lua_file вызов простоЗапрос POST Обработка данных формы с помощью Nginx 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> 

Нажатие кнопки POST дает ожидаемые результаты, - говорит окно предупреждения " 2' .

Нажмите кнопку AJAX, которая отправляет форму OTH, возвращает d=nil.

Я не уверен, что здесь происходит. Я подозреваю, что проблема здесь связана с тем, как отправляются данные о многостраничной форме. Кажется, что Lua/Nginx отсутствует при анализе данных формы на многочастных границах. Однако не ясно, что я должен сделать с этим в конце Lua. Я бы очень признателен за помощь

ответ

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.

UPDATE

Для потокового читателя и синтаксического анализа, вы можете попробовать lua-resty-upload проект.

+0

Спасибо - это как я подозревал, и вполне разумно, что Nginx не может «найти» сообщения args + data. Тем не менее, есть ли какие-либо внутренние методы в API Nginx (которые я еще не нашел), которые можно использовать для анализа таких данных с множественной формой или мне нужно будет что-то переделать? – DroidOS

+1

@DroidOS Возможно, вы сможете попробовать этот проект: https://github.com/openresty/lua-resty-upload. – xiaochen

+0

@DroidOS Я знаю, что в модуле lua-resty-upload есть парсер данных с несколькими частями. Но я не использовал его в своем проекте. Я не уверен, можете ли вы использовать его напрямую. Ответ обновлен. – xiaochen

Смежные вопросы