Web服务 – ServiceStack客户端和不明确的路由

Web服务 – ServiceStack客户端和不明确的路由,第1张

概述我有一个服务堆栈服务,我们称之为具有标准GET路由的订单 > / orders – 获取所有客户 > / orders / {Ids} – 获取特定客户 这一切都很好,花花公子,但我想我会添加另一条路线 > / orders / customers / {CustomerId} – 获取具有特定客户ID的订单 这可以在浏览器中找到路由时找到,但是当我使用ServiceStack Client时,我 我有一个服务堆栈服务,我们称之为具有标准GET路由的订单

> / orders – 获取所有客户
> / orders / {IDs} – 获取特定客户

这一切都很好,花花公子,但我想我会添加另一条路线

> / orders / customers / {CustomerID} – 获取具有特定客户ID的订单

这可以在浏览器中找到路由时找到,但是当我使用ServiceStack ClIEnt时,我得到了不明确的路由异常,并列出了三条路由.

我不太清楚这是最好的方法是什么……我正在做的不是正确的REST方式吗?

我知道我可以简单地手动输入路径到JsonServiceClIEnt之类的

clIEnt.Get<列表与LT;订单>&GT( “/命令/客户/ 7”)

这会有效,但我更愿意按照打字方式进行…即

clIEnt.Get(new OrdersRequest {CustomerID = 7});

这是我正在使用的RequestDTO示例

public class OrdersRequest : IReturn<List<Orders>>{   public int[] IDs {get; set;}   public CustomerID {get; set;}   public OrdersRequest(params int[] IDs)   {        this.IDs = IDs;   }}

我是否必须使用不同的Dtos或……?

任何有关此方法的样本的任何帮助或指针,或者更好的方式来创建服务将不胜感激.

谢谢

解决方法 我的建议是你没有正确使用REST.有 a good answer about how to best structure a ServiceStack REST service.开始时这是一个常见的问题,我也有这样的问题.

了解您的用例:

在你的特定情况下,如果我们看一下/ orders / customers / 7,这会更好用你是这样想的:

/customers/7/orders

你这样做的原因:

>它解决了您的路线模糊问题
>背景很清楚.我们可以看到我们正在与客户7合作,而无需浏览长网址
>我们可以看到’与客户7’我们想要他们的订单

想想这样的路由:

/orders                   Everybody's Orders/orders/1                 Order 1 (without being aware of the customer it belongs to)/customers                All Customers/customers/7              Customer 7's details/customers/7/orders       All Customer 7's orders/customers/7/orders/3     Customer 7's order number 3

这样做的好处是对数据的 *** 作是一致的.所以你想找到所有被取消的订单:

/orders/cancelled

您想通过它的orderID取消特定订单

/orders/4/cancel

您想列出特定客户的未结订单

/customers/6/orders/open

您想列出客户6的已取消订单

/customers/6/orders/cancelled

您想要取消您正在查看的客户6的订单

/customers/6/orders/2/cancel

显然这些只是场景,你的路线会有所不同.

简化动作处理程序:

您可能希望定义 *** 作处理程序,以便它们可以应对来自多个路径的 *** 作.我的意思是,一个动作处理程序将负责列表订单

/orders/customers/6/orders

我这样做是:

[Route("/orders","GET")][Route("/customers/{CustomerID}/orders","GET")]public class ListOrdersRequest : IReturn<List<Order>>{    public int? CustomerID { get; set; }}

所以你可以看到两个订单列表路由进来.如果他们使用/ orders,那么我们的customerID将没有值,但另一个路由将.所以在我们的动作处理程序中,我们可以简单地测试:

public List<Order> Get(ListOrdersRequest request){    // Use `CustomerID` to narrow down your search scope    if(request.CustomerID.HasValue){        // Find customer specific orders    } else {        // Find all orders    }    return orders;}

客户端问题:

因此,要解决您使用’打字’客户关注的问题.使用上述方法创建路径和 *** 作处理程序将允许您执行以下 *** 作:

clIEnt.Get(new ListOrdersRequest { CustomerID = 7 }); // To get customer 7's ordersclIEnt.Get(new ListOrdersRequest()); // All orders

因此,为您提供清单订单的清晰方法.

最后的想法:

显然这意味着你将不得不重做你所拥有的可能会带来痛苦的东西,但这是最好的方法,非常值得付出努力.

我希望这有助于您了解最佳结构.

更新:

@ stefan2410要求我解决Kyle在GET请求的路由中使用int []的问题:

如果要在GET请求中使用int [],则必须考虑在URL中传输期间更改它,以便可以RESTful使用它.

所以你可以这样做:

class OrdersRequest{    public string IDs { get; set; }    public OrdersRequest(int[] IDs)    {        IDs = string.Join(",",Array.ConvertAll(ints,item => item.ToString()));    }}clIEnt.Get(new OrdersRequest(new [] {1,2,3}));

创建路线/订单/ 1,3并匹配/ orders / {IDs}.这样做的问题是为了在服务器端使用ID,你必须将字符串“1,3”转换回int [].

在请求中处理int []的更好方法是使用POST.所以你可以这样做:

class OrdersRequest{    public int[] IDs { get; set; }    public OrdersRequest(int[] IDs)    {        IDs = IDs;    }}    clIEnt.Post(new OrdersRequest(new[] {1,3}));

创建路线/订单并匹配路线/订单.

总结

以上是内存溢出为你收集整理的Web服务 – ServiceStack客户端和不明确的路由全部内容,希望文章能够帮你解决Web服务 – ServiceStack客户端和不明确的路由所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/1133524.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-30
下一篇2022-05-30

发表评论

登录后才能评论

评论列表(0条)

    保存