servicestack,C#,Routing,servicestack" /> servicestack,C#,Routing,servicestack" />

C# 自定义ServiceStack路由中的参数拆分

C# 自定义ServiceStack路由中的参数拆分,c#,routing,servicestack,C#,Routing,servicestack,我有一个REST端点,它允许客户端获取一个或多个变量的值。我正在使用ServiceStack来实现这一点。问题源于ServiceStack如何解析多个变量。似乎默认行为是拆分“Variables”参数字符串(请参见下面的Request DTO VariableRequest),它只是拆分逗号上的字符串。问题是我的一些变量是多维数组,我们允许用户指定该数组的索引,但要做到这一点,用户必须用逗号分隔索引。这意味着ServiceStack将我的一些变量一分为二 例如,以下是此端点的两个可能URL: 本

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

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

  • 本地主机:8080/get/t\u f1,t\u f2
  • localhost:8080/get/t_f1,数组(1,2)
  • 第一个适当拆分为:

    {“t_f1”,“t_f2”}

    第二个拆分为:

    {“t_f1”,“数组(1”,“2)”}

    但我想把它分成:

    {“t_f1”,“数组(1,2)”}

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

  • 处理变量字符串数组(由ServiceStack生成)并修复不正确的拆分。(这对我来说太刺耳了)
  • 更改url端点。例如,用引号修饰参数。(超级用户将通过直接在浏览器中输入URL直接查询此服务,因此我喜欢当前端点结构的简单性)
  • 我的理想解决方案是以某种方式自定义ServiceStack如何直接拆分这些参数。不过,我在ServiceStack的文档中找不到解决方案(公平地说,我可能错过了一些东西,或者误解了如何应用urlfilters之类的东西)

    有什么想法吗

    [Route("/get/{Variables}"]
    public class VariableRequest{
        public string[] Variables {get; set;}
    }
    
    如果您需要,您需要自己使用,例如:

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

    尽管我会避免在
    /path/info
    中包含任何复杂类型,而是通过QueryString传递它们。因此,在本例中,我将从Route/path/info中删除
    变量

    [Route("/get"]
    public class VariableRequest
    {
        public string Variables {get; set;}
    }
    
    这将允许您使用
    /get?变量=…
    调用您的服务

    IMO
    /get
    对于REST-ful端点来说不是一个很好的选择,我个人将此路由定义为:

    [Route("/vars"]
    public class GetVariables : IReturn<GetVariablesResponse>
    {
        public string Symbols { get; set; }
    }
    
    [路由(“/vars”]
    公共类GetVariables:IReturn
    {
    公共字符串符号{get;set;}
    }
    
    因此,可以使用
    /vars?symbols=…
    调用该服务。有关设计API的更多信息,请参阅:

    如果您需要,您需要自己使用,例如:

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

    虽然我会避免在
    /path/info
    中包含任何复杂类型,而是通过QueryString传递它们。因此,在这种情况下,我会从Route/path/info中删除
    变量

    [Route("/get"]
    public class VariableRequest
    {
        public string Variables {get; set;}
    }
    
    这将允许您使用
    /get?变量=…
    调用您的服务

    IMO
    /get
    对于REST-ful端点来说不是一个很好的选择,我个人将此路由定义为:

    [Route("/vars"]
    public class GetVariables : IReturn<GetVariablesResponse>
    {
        public string Symbols { get; set; }
    }
    
    [路由(“/vars”]
    公共类GetVariables:IReturn
    {
    公共字符串符号{get;set;}
    }
    
    因此,可以使用
    /vars?symbols=…
    调用该服务。有关设计API的更多信息,请参阅: