2017-07-28 68 views
0

REST API中指定的排序邏輯如何通常由後端數據庫處理?按參數對後端數據庫進行排序

假設的REST API請求是

https://<<some api>>/?sortBy=-id,name 

有轉換上述REST API SortBy參數,而不必做一些正則表達式來單獨用逗號字符串的一個更簡單的方法,然後檢查第一個字符包含一個破折號來形成下面的sql請求?

SELECT * FROM students ORDER BY id ASC, name DESC 

回答

1

逗號分隔字符串不必通過正則表達式拆分..下面的C#將做到這一點,例如:

string sort = Request["sortBy"]; 
if(sort != null){ 
    foreach(string s in sort.Split(',')){ 
    string direction = "DESC"; 
    if(s[0] == '-') 
     direction = "ASC"; 
    if(permittedColumnsList.Contains(s.Replace("-", "")) 
     sql = sql + s.Replace("-", "") + " " + direction + ","; 
} 
sql = sql.Remove(sql.Length - 1); // drop last comma 

這仍然是分析和尋找第一個破折號不過,你似乎不想要的東西。

如果你準備好所有允許的排序OPS存儲在它變得更簡單找一本字典:

//column dictionary mapping acceptable parameters to the sql that 
//implements them 
colDict["-id"]="id ASC,"; 
colDict["id"]="id DESC,"; 
colDict["-name"]="name ASC,"; 
colDict["name"]="name DESC,"; 

string sort = Request["sortBy"]; 
if(sort != null){ 
    foreach(string s in sort.Split(',')){ 
    if(colDict.ContainsKey(s)) 
     sql = sql + colDict[s]; 
} 
sql = sql.Remove(sql.Length - 1); // drop last comma 

我認爲僅此而已,你應該在尋找簡化的東西去那裏的。盲目地接受用戶輸入到URL中的內容並不明智,並且如果他們把 - (我一直期待 - 是DESC)放在帶有ASC後綴的sql中,這是不明智的,因爲這是安全風險。通過建立允許值的字典,您可以將自己與風險隔離開來。字典可以通過編程方式構建,因此每次查詢模式發生變化時都不需要手動更改。