Chr*_*ris 9 rest ravendb servicestack
我有一个ID为的实体
public string ID {get;set;}
activities/1
Run Code Online (Sandbox Code Playgroud)
(来自RavenDB).
我在ServiceStack AppHost中注册了以下路由
Routes
.Add<Activity>("/activities")
.Add<Activity("/activities/{id}");
Run Code Online (Sandbox Code Playgroud)
我正在使用骨干应用程序POST和PUT到我的REST服务.
开箱即用的事情:
我知道的选项:
两者都有缺点,我要么在我的API中丢失RESTful,这是不可取的,或者我不遵循RavenDb约定,这通常是明智的狐狸.另外,我个人喜欢使用斜杠.
所以我想知道在servicestack中是否还有其他选项我可以用来解决这个涉及较少妥协的问题?无论是Serialiser定制还是通配路由都在我脑海中......
Mat*_*int 10
我对ASP.Net WebAPI也有同样的问题,所以我认为这不是一个ServiceStack问题,而是在REST URL上处理Raven样式id的一般问题.
例如,假设我查询GET: /api/users并返回如下结果:
[{
Id:"users/1",
Name:"John"
},
{
Id:"users/2",
Name:"Mary"
}]
Run Code Online (Sandbox Code Playgroud)
现在我想得到一个特定的用户.如果我遵循纯REST方法,将从该文档中收集Id,然后我将其传递给url的id部分.这里的问题是,这最终看起来 GET: /api/users/users/1不仅令人困惑,而且斜杠阻碍了WebAPI(和ServiceStack)如何将url参数路由到action方法.
我做的妥协是仅从URL的角度将id视为整数.所以客户端调用GET: /api/users/1,我将我的方法定义为public User Get(int id).
很酷的部分是Raven的session.Load(id)重载可以是完整的字符串形式,也可以是整数形式,所以你不必在大部分时间翻译.
如果您发现自己需要翻译id,可以使用此扩展方法:
public static string GetStringIdFor<T>(this IDocumentSession session, int id)
{
var c = session.Advanced.DocumentStore.Conventions;
return c.FindFullDocumentKeyFromNonStringIdentifier(id, typeof (T), false);
}
Run Code Online (Sandbox Code Playgroud)
调用它很简单session.GetStringIdFor<User>(id).我通常只需要手动翻译,如果我正在使用id而不是立即加载文档.
我理解通过翻译这样的ID,我打破了一些REST纯粹主义惯例,但我认为这是合情合理的.我会对任何人提出的替代方法感兴趣.
| 归档时间: |
|
| 查看次数: |
523 次 |
| 最近记录: |