2014-04-01 26 views
7

Tôi đang làm bằng chứng về khái niệm để minh họa cách chúng tôi có thể triển khai 3scale trong ngăn xếp của chúng tôi. Trong một ví dụ, tôi muốn thực hiện một số POST yêu cầu thao tác cơ thể để tạo mặt tiền API để ánh xạ những gì có thể là định dạng API cũ sang định dạng nội bộ mới. Ví dụ. thay đổi một cái gì đó giống nhưLàm cách nào để thao tác với phần thân JSON của yêu cầu POST bằng Nginx và Lua?

{ "foo" : "bar" , "deprecated" : true } 

vào

{ "FOO" : "bar" } 

Các Lua module docs for content_by_lua, mà có vẻ như phương pháp thích hợp nói

Không sử dụng chỉ thị này, chỉ thị xử lý những nội dung khác trong cùng một vị trí. Ví dụ: chỉ thị này và chỉ thị proxy_pass không được sử dụng ở cùng một vị trí.

Hiểu biết của tôi là content_by_lua là trình xử lý nội dung như proxy_pass, chỉ một trong số đó có thể được sử dụng cho mỗi vị trí.

Tôi không nghĩ rằng có cách nào để loại bỏ proxy_pass như đó là cơ sở của cách thức hoạt động proxy, như vậy là nó có thể chụp theo yêu cầu ở một vị trí riêng biệt, sử dụng content_by_lua, sau đó vượt qua đến địa điểm thực hiện proxy_pass hoặc có phương pháp khác như rewrite_by_lua thích hợp hơn không?


Nếu nó giúp bất cứ ai khác, tôi đã thêm hàm sau (bit đầu tiên của tôi về Lua) mà loại bỏ các tham số user_key mà 3scale đòi hỏi cho phép nhưng không hợp lệ cho API của chúng tôi nếu chuyển về:

function remove_user_key() 
    ngx.req.read_body() 
    -- log the original body so we can compare to the new one later 
    local oldbody = ngx.req.get_body_data() 
    log(oldbody) 
    -- grab the POST parameters as a table 
    local params = ngx.req.get_post_args() 

    -- build up the new JSON string 
    local newbody = "{" 

    for k,v in pairs(params) do 
    -- add all the params we want to keep 
    if k ~= "user_key" then 
     log("adding"..k.." as "..v) 
     newbody = newbody..'"'..k..'":"'..v..'",' 
    else 
     log("not adding user_key") 
    end 
    end 
    --remove the last trailing comma before closing this off 
    newbody = string.sub(newbody, 0, #newbody-1) 
    newbody = newbody.."}" 

    ngx.req.set_body_data(newbody) 
    log(newbody) 
end 

if ngx.req.get_method() == "POST" then 
    remove_user_key() 
end 

Trả lời

4

tôi sẽ đề nghị bạn sử dụng access_by_lua
trong nginx.conf

 
location/{ 
       #host and port to fastcgi server 
       default_type text/html; 
       set $URL "http://$http_host$request_uri"; 
       access_by_lua_file /home/lua/cache.lua; 
       proxy_pass http://$target; 
       ------- 
       --------- 

trong tập tin cache.lua bạn có thể làm một cái gì đó như:

 
if ngx.req.get_method() == "POST" then 
    -- check if request method is POST 
    -- implement your logic 
    return 
end 
4

Thêm vào những gì Prashant đã đề cập: khi bạn tải về các file cấu hình Nginx của bạn từ 3scale bạn sẽ nhận thấy rằng có một tập tin Lua bao gồm. Tệp này đã được gọi từ access_by_lua_file.

Tệp đó sẽ là ý kiến ​​của tôi nơi tốt nhất để thêm mã thao tác cơ thể của bạn. Nó sẽ được thực hiện cho mọi yêu cầu trước khi proxy_pass đến máy chủ API của bạn được gửi.

Ngoài ra, đây là một thực sự tốt trong bài viết chuyên sâu blog về làm thế nào để thực hiện chuyển đổi khác nhau để yêu cầu của bạn sử dụng Lua bên Nginx: http://tech.3scale.net/2013/01/09/augment-your-api-without-touching-it/

+0

Cảm ơn, tôi đã thực sự thêm mã tôi đã đăng ở trên vào cuối tệp mà bạn đã đề cập khi tôi nhận thấy 'access_by_lua_file' đã được gọi. – Jesse

1

Gần đây tôi đã phải thao tác ngược dòng dựa trên giá trị JSON trong bài yêu cầu và tôi hữu ích: NGINX LUA and JSON

Đây là cấu hình cơ bản nhưng đưa ra ý tưởng về cách thực hiện.

+4

liên kết không hoạt động nữa – w00t

Các vấn đề liên quan