ServiceStack以正确的方式访问路由并避免标记

时间:2013-05-03 11:20:47

标签: asp.net web-services servicestack

我认为这个问题更多的是关于Web服务的最佳实践,并不一定仅限于ServiceStack。根据我在这里和SS维基上所读到的,实现父子实体的“推荐”方法是通过路由将其分解。

例如:

/Users/{UserID}
/Users/{UserID}/Entities

用户是登录用户,实体是他/她的项目。我正在实现jqueryui自动完成,这里我怀疑我做的不对。

在脚本中,路径需要Userid,因此我必须在浏览器中手动渲染它,使其显示为:

type: "GET",
url: "svc/users/**8**/entities",
data: { "SearchTerm": request.term, "Format": 'json' },

这对我来说有点不对劲。我有会话中的UserID,我可以这样做。所以我想知道是否有更好的方法来访问这些对象而不必将数据直接呈现到标记中?

我这样做错了吗?

旁注:我知道我可以将这些数据放在一个隐藏的字段中并通过脚本等访问它,我只是好奇是否有更好的/推荐的方法通过会话这样做,同时保持路由不变。

1 个答案:

答案 0 :(得分:2)

通常,这是通过另一个端点完成的,例如Facebook使用/my/,但您可以随心所欲地执行任务。

原因是,您很可能会为用户返回与他人分享的不同信息,而不是与其他人分享该用户。

让我们假装/user/{UserId}/books返回用户最喜欢的书籍。如果我想知道某人最喜欢的书是什么,我可能会对标题和简短的描述感兴趣,但如果我想查看(并可能管理)我最喜欢的书籍列表,那么我可能想要更多的信息,比如当天我添加了最喜欢的书,或者我的朋友,也喜欢这本书。

所以/user/{UserId}/books返回:

{
    "books":[
         { "title":"Hary Potter", "desc":"A boy who is magic..." }
    ]
}

然而/my/books会返回:

{
    "books":[
         {
              "title":"Harry Potter",
              "desc":"A boy who is magic...",
              "friensWhoLikeBook":[
                  { "id":1234, "name":"Bob" }
              ],
              "personalCommentsAboutBookNotToBeShared":"This book changed my life..."
          }
     ]
 }