关于restful 查询API设计问题

14-06-28 bingyang
    

[Rout("/user/find/{userId}"),"GET"]
[Rout("/user/find/{barthday}","GET")]
[Rout("/user/find/{loginId}"),"GET"]
[Rout("/user/find/{Addtime,endTime}"),"GET"]
[Rout("/user/......."),"POST"] //省略其他的
public class User
{
public int UserId{ge;set;}
public DateTime BarthDay{get;set;}
public string LoginId{get;set;}
public DateTime AddTime{get;set;}
}
这个对User资源设计是NET中的RSET风格,java中应该也有类似的模式,这里且先不说这个资源是否设计的是否合理,我们把问题聚焦在“一个资源多条件查询”场景下(所谓的Query filter),由于服务端对应User资源查询就一个GET方法,比如:
public object Get(User request)
{
//TODO:完成查询
}
,那么如何来识别这些多条件查询而组成对应的SQL语句呢?
if(....)
sql ="";
//或者是 return findByUserId(userId)
else
sql =""
//或者是 return findByLoginId(LoginId)
....
吗?感觉很别扭,且会出现很多分流的分支,而传统的RPC接口对这些多条件查询,会产生多个方法与之对应,比如, findByUserID...(userId),findByLoginId(loginId)这样子,好不好不说,但至少语义很清楚。没有分支条件。

那么在RestFul 这个模式下,这中场景该如何设计?板桥大叔,指点啊
[该贴被bingyang于2014-06-28 15:27修改过]
[该贴被bingyang于2014-06-28 15:29修改过]

    

gameboyLV
2014-06-28 23:38

把查询条件放在HTTP header里面传过去就行了,不管什么查询条件,你请求的都是userlist

banq
2014-06-29 10:28

RESTful后面是微服务,和RPC有些类似,只不过接口不一样罢了,都是同步的。对应多个方法放入一个微服务中。

http://www.jdon.com/soa/10-best-practices-for-better-restful-api.html

bingyang
2014-07-14 23:14

2014-06-28 23:38 "@gameboyLV"的内容
把查询条件放在HTTP header里面传过去就行了 ...


这是个办法,我看到有人把Linq 序列化后转到服务端,客户端变形linq 语句,类似 (userid=>userid ==10).ToLinqNode
服务端 xx.Parse(LinqNode)这样子

其实,我觉得可以自定义一套查询语法 什么[x,y] ,in ,not 之类的,这样比较麻烦,很难全面覆盖查询条件,到服务端后还要解析成SQL,有重复发明轮子嫌疑啊。
[该贴被bingyang于2014-07-14 23:29修改过]

bingyang
2014-07-14 23:23

2014-06-29 10:28 "@banq"的内容
都是同步的。对应多个方法放入一个微服务中 ...


我们是这样的,client agent ->restful(crud) -> appservice ,对于查询条件 在 get 里面做了分支处理 ,每个分支调用app service 处理业务;
有同事 client agent ->restful (mvc)-> appservice ,mvc 对于多个查询可以映射到多个方法的,(和SOA很像啊,一堆的方法),这两种方式,板桥大叔,觉得怎么样啊?
[该贴被bingyang于2014-07-14 23:23修改过]

2Go 1 2 下一页