2017-07-28 43 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中,这是不明智的,因为这是安全风险。通过建立允许值的字典,您可以将自己与风险隔离开来。字典可以通过编程方式构建,因此每次查询模式发生变化时都不需要手动更改。