簡體   English   中英

API Rest 中的過濾

[英]API Filtering in Rest

我有一個要求,用戶希望通過 REST API(GET 調用)過濾表(API 過濾應該允許使用括號來定義操作優先級並使用可用字段的任何組合。支持的操作應該包括或,和,等式(等於), ne (不等於), gt (大於), lt (小於), in, like)

用例示例:

考慮具有列 user_id,first_name,last_name,food_intake_calories,created_at 的表

查詢應支持 (created_at eq '2016-05-01') AND ((food_intake_calories gt 20) OR (food_intake_calories lt 10))。

我首先想到將輸入替換為“=”,將 ne 替換為“.=”,然后直接將 append 這個到 sql 的 where 子句並運行查詢,但這將再次邀請 Z9778840A0100CB30C982876741B0B5A2 注入。 我不知道如何處理這個問題。 我正在使用 java 和 dropwizard 作為后端服務器。

我的建議是使用Jexl表達式解析器來形式化這個解析。

可以替換一些大括號並使用自定義代碼來處理請求,但需求會慢慢發生變化,您會得到一個復雜的代碼來解析 REST 請求。

OData 將是 go 的正確方法。 它具有為用戶用例設計的規范。 使用這種標准的數據表示方式的好處是,只要遵循標准的 OData 查詢,每個人都可以使用您的 API。

結帳: https://www.odata.org/

希望這可以幫助 !!

只要您先檢查它,我認為將完整表達式解析到 sql 的責任傳遞給它不一定有問題。 你可以 devise 一組規則:

  • 用空替換括號
  • 在 AND 和 OR 上拆分
  • 剩下的語句集必須是column operator 'value'的形式
  • 列必須在已知列集中
  • 運算符必須在已知運算符的集合中
  • value 必須以 ' 開頭和結尾,並且之間的所有內容都將被視為一個值
  • 將實際value替換為 db 參數占位符並將給定的數據值放入該參數的值中 - 將這些值放入 hash map 鍵集以對它們進行重復數據刪除,然后將它們替換為原始 Z8A5DA52ED1201A 參數,添加它們 247D359E7A 參數到你的 db 命令,就像你 go
  • 你現在最終得到一個 state 查詢適合在沒有注入風險的情況下針對數據庫運行 - 列和運算符位於已知集合中,並且值已參數化
  • 如果謂詞形式如此自由,您可能需要考慮限制可能用於這些查詢的結果或執行次數/數據庫時間量

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM