我有ServiceStack建立了一个简单的REST服务。
如果我配置是这样的路线:
//register user-defined REST-ful urls
Routes
.Add<Contact>("/Contacts")
.Add<Contact>("/Contacts/{ContactId}")
该请求成功。
http://<server>:59557/Contacts?ContactId=9999 //Works
如果我配置这样的路由(业务分析师更倾向于生成的元数据)
//register user-defined REST-ful urls
Routes
.Add<UpdateContact>("/UpdateContact", "PUT")
.Add<CreateContact>("/CreateContact", "POST")
.Add<GetContact>("/Contacts/{ContactId}", "GET")
http://<server>:59557/Contacts/9999 //Works
http://<server>:59557/Contacts?ContactId=9999 //Fails, Handler for request not found
我怎样才能在第二样品中配置路由,这样的请求/联系人?使用ContactID = 9999会成功吗?
谢谢。
一些在路由ServiceStack是在解释你的第一个网站解释维基页面:
[Route("/hello/{Name}")]
仅匹配:
/hello/name
其中为:
[Route("/hello")]
火柴:
/hello?Name=XXX
注:查询字符串,FORMDATA和HTTP请求正文不是路线(即仅/路/信息是)的一部分,但它们都可以在除了每个Web服务调用被用来进一步填充请求DTO。
并利用具有通配符路径的路线,如:
[Route("/hello/{Name*}")]
火柴:
/hello
/hello/name
/hello/my/name/is/ServiceStack
另一个很好的用例何时使用通配符路线 。
因此,要匹配/Customers?Key=Value
和/Customers/{Id}
您需要注册为匹配这两个途径,例如路线:
Routes
.Add<GetContact>("/Contacts", "GET")
.Add<GetContact>("/Contacts/{ContactId}", "GET")
如何根据公约,自动注册路线为大家服务
也与此相关的是通过所述登记自动路由AddFromAssembly扩展方法,其中,该单一呼叫:
Routes.AddFromAssembly(typeof(MyService).Assembly)
经过和scands所有服务(在指定的组件)的基础上,你已经实现了所有HTTP方法和寄存器以公约为基础的路线。 例如,如果你的GetContact
和UpdateContact
服务有Id
的属性它会自动注册下列路线:
Routes
.Add<GetContact>("/Contacts", "GET")
.Add<GetContact>("/Contacts/{Id}", "GET")
.Add<UpdateContact>("/Contacts", "POST PUT")
.Add<UpdateContact>("/Contacts/{Id}", "POST PUT")
如果你只是有一个单一的Contacts
REST服务与所有的HTTP动词,将注册这些途径实现:
Routes
.Add<Contacts>("/Contacts", "GET POST PUT DELETE PATCH")
.Add<Contacts>("/Contacts/{Id}", "GET POST PUT DELETE PATCH")
路由解析顺序
这是更详细的描述在新的API设计维基但用于选择路径加权的依据是:
- 任何确切的文字比赛首次使用
- 精确匹配动词优于所有动词
- 路线中的多个变量的加权较少有
- 当路由具有相同的重量时,为了通过在服务或注册的顺序的行动(FIFO)的位置来确定
请参阅智能路由的维基示例部分。
很好的表现;很好的绩效
由于在MVC路由可能会很慢 ,当你有大量的航线,我认为这是值得指出ServiceStack的路由实现与哈希查询实现,因此不会受到你可能曾与MVC的线性性能回归问题。
继在其他的StackOverflow职位的答案 ,你可以尝试这条路线:
/Contacts/{Ids*}
并使用此请求类:
public class ContactRequest { public string Ids { get; set; } }
然后给出的URL <service>/Contacts?Id=1&Id=2&Id=3
ServiceStack将填充Ids
与下面的字符串请求对象的属性:
Id=1&Id=2&Id=3
然后你可以解析成的ID,如清单
public object Get(ContactRequest request)
{
var idPairs = request.Ids.Split("&");
var ids = new List<string>();
foreach (var idPair in idPairs)
{
ids.Add(idPair.Split("=")[1];
}
// ... do something with your ids now ...
// ... return results ...
}
当然,你可能还需要整个包住ID解析逻辑在try...catch
块来处理格式不正确的查询字符串。