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
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