按参数排序到后端数据库

时间:2017-07-28 04:10:45

标签: sql rest

REST API中指定的排序逻辑通常如何由后端数据库处理?

假设REST API请求是

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

是否有一种更简单的方法来转换上面的rest api sortBy参数,而不必用逗号分隔字符串,然后检查第一个字符是否包含破折号以形成下面的sql请求?

SELECT * FROM students ORDER BY id ASC, name DESC

1 个答案:

答案 0 :(得分: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

这仍然在解析并寻找第一个破折号,这似乎是你不想要的。

如果您准备将所有允许的排序操作存储在字典中,那么它看起来会更简单:

//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并将其推入带有ASC后缀的sql中是不明智的,如果他们放入 - (我一直期待 - 是DESC),因为这是一个安全风险。通过构建允许值的字典,您可以将自己与风险区分开来。字典可以通过编程方式构建,因此每次查询模式更改时都不需要手动更改