2015-02-25 4 views
1

Я пытаюсь написать интерфейс REST с помощью nginx и lua. Я хотел бы знать, что лучший способ проверить метод запроса? Если это GET, мне нужно запросить db. Если это POST или DELETE, мне нужно запустить другой скрипт lua для обновления базы данных. До сих пор, это то, что мой код выглядит следующим образом, чтобы проверить, что метод запроса:правильный способ проверить метод запроса в nginx_lua

#curl -i -X GET 'http://localhost/widgets/widget?name=testname&loc=20000' -H "Accept:application/json" 
    location /widgets/widget { 
      default_type "text/pain"; 
      #ifisEvil... unless done inside lua 
      content_by_lua ' 
        ngx.say("request is:",ngx.var.request_method) 
        ngx.say("the constant is:",ngx.HTTP_GET) 
        --ngx.say("the type is: ", type(ngx.HTTP_GET) 

        if ngx.var.request_method == ngx.HTTP_GET then 
          local args = ngx.req.get_uri_args() 
          for key, val in pairs(args) do 
            if type(val) == "table" then 
              ngx.say(key, ": ", table.concat(val, ", ")) 
            else 
              ngx.say(key, ": ", val) 
            end 
          end 
        end 
      '; 

    } 

Результат выглядит следующим образом:

mytestdevbox2:/var/www/nsps2# curl -i -X GET 'http://localhost/widgets/widget?name=testname&loc=20000' -H "Accept:application/json" 
HTTP/1.1 200 OK 
Server: nginx/1.6.2 
Date: Wed, 25 Feb 2015 13:44:11 GMT 
Content-Type: text/pain 
Transfer-Encoding: chunked 
Connection: keep-alive 

request is:GET 
the constant is:2 
mytestdevbox2:/var/www/nsps2# 

выше выход объясняет, почему если оператор не удается. .. потому что я сравниваю «GET» с 2. Я бы предпочел не составлять свой собственный список констант, если они уже доступны, и я просто что-то пропустил здесь.

Я знаю, что существует переменная nginx, называемая «$ request_method», но я бы предпочел не использовать ее, потому что я хочу сохранить всю свою логику в lua. Из того, что я читал до сих пор, использование инструкции «if» в nginx - evil!
Так что я пытаюсь придерживаться кода lua для подобных вещей.

Любые советы о том, где я, возможно, испортил код моей lua?

+0

Просто сравните с строкой '' GET''. «Если» - зло, но иногда все еще лучше, чем что-либо еще. У вас довольно неестественный пример. Что вы действительно хотите сделать? –

+0

Что неестественно? можете ли вы расширить? Я все уши, потому что я только новичок в nginx. код прямо сейчас - это всего лишь тестовый код, но, сказав, что проверка типа запроса - это что-то совершенно нормальное нет? И тогда единственная другая логика, которую я имею, - это синтаксический анализ ввода – Happydevdays

+0

@AlexeyTen. Я знаю, что могу просто сравнить его с строкой GET, но я думаю, мне было интересно, есть ли другой способ, например, использовать существующую константу, с которой я просто не знаком. – Happydevdays

ответ

1

Константы метода Lua, такие как ngx.HTTP_GET, соответствуют их документации, mainly for ngx.location* calls.

Таким образом, нет лучшего способа проверки вашего метода в Lua, чем сравнение его с GET и остальными строками метода.


Однако я бы серьезно подумал об использовании "evil" if, чтобы разделить ваши запросы на основе метода на уровне nginx.

Это дает вам возможность настроить отдельное ведение журнала, обработку ошибок и т. Д. Для каждого метода.

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