自定义ServiceStack Route中的参数拆分

时间:2019-02-13 14:16:44

标签: c# routing servicestack

我有一个REST端点,该端点使客户端可以获取一个或多个变量的值。我正在使用ServiceStack来实现这一目标。问题是由ServiceStack如何解析多个变量引起的。似乎默认行为是拆分“ Variables”参数字符串(请参见下面的“请求DTO VariableRequest”),它只是将字符串拆分为逗号。问题是我的一些变量是多维数组,我们允许用户指定该数组的索引,但要这样做,用户必须用逗号分隔索引。这意味着ServiceStack将我的一些变量分成两半。

例如,以下是此端点的两个可能的URL:

  1. localhost:8080 / get / t_f1,t_f2
  2. localhost:8080 / get / t_f1,array(1,2)

第一个适当地拆分为:

{“ t_f1”,“ t_f2”}

第二个拆分为:

{“ t_f1”,“ array(1”,“ 2)”}

但我希望将其拆分为:

{“ t_f1”,“ array(1,2)”}

我正在尝试避免两种可能的解决方案(尽管它们可能不可避免):

  1. 处理Variables字符串数组(由ServiceStack生成)并修复不正确的拆分。 (这对我来说太客气了)
  2. 更改URL端点。例如,用引号修饰参数。 (高级用户可以通过直接在浏览器中输入url直接查询此服务,所以我喜欢当前端点结构的简单性)

我的理想解决方案是以某种方式自定义ServiceStack如何直接拆分这些参数。不过,我在ServiceStack的文档中找不到解决方案(为了公平起见,我可能会遗漏某些东西或误解了如何应用urlfilters之类的东西)。

有什么想法吗?

[Route("/get/{Variables}"]
public class VariableRequest{
    public string[] Variables {get; set;}
}

1 个答案:

答案 0 :(得分:0)

如果您需要custom route parsing,则需要自己使用Wildcard path进行操作,例如:

[Route("/get/{Variables*}"]
public class VariableRequest
{
    public string Variables {get; set;}
}

然后在您的请求中,您可以自己解析原始的request.Variables字符串。

尽管我会避免在/path/info中包含任何复杂类型,而应通过QueryString传递它们。因此,在这种情况下,我将从路径/ path / info中删除Variables

[Route("/get"]
public class VariableRequest
{
    public string Variables {get; set;}
}

然后,您将使用/get?Variables=....致电您的服务。

IMO /get对于具有REST功能的终结点来说不是一个很好的选择,我个人会这样定义该路由:

[Route("/vars"]
public class GetVariables : IReturn<GetVariablesResponse>
{
    public string Symbols { get; set; }
}

因此可以使用/vars?symbols=...来调用服务。有关设计API的更多信息,请参见: