【问题标题】:How to pass list of complex types in query string?如何在查询字符串中传递复杂类型的列表?
【发布时间】:2012-02-24 11:26:16
【问题描述】:

如何在 ServiceStack 中传递复杂类型的列表?例如,我的请求 DTO 如下所示:

//Request DTO
public class Test
{
    public IList<Fund> Funds { get; set; }
}

public class Fund
{
    public string Key { get; set; }
    public int Percent { get; set; }
}

如何通过 HTTP get 传递序列化对象?

http://localhost:49490/api/funds={ ?? }

KeyValueDataContractDeserializer:转换为类型时出错:类型定义应以“{”开头,期望序列化类型“Fund”,字符串以:asdf 开头

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    ServiceStack 使用 JSV Format 解析 queryString,这基本上是带有 CSV 样式引号的 JSON(即,仅当您的值具有转义字符时才需要引号)。

    虽然您没有在此处定义自定义路由,但在大多数情况下,您的自定义路由与您的请求 DTO 相同,在这种情况下是 Test 而不是 /funds .

    因此假设自定义路由如下所示:

    Routes.Add<Test>("/test");
    

    您可以通过如下查询字符串调用您的服务:

    http://localhost:49490/api/test?Funds=[{Key:Key1,Percent:1},{Key:Key2,Percent:2}]

    附带说明,DTO 上的接口通常不是一个好主意,您应该考虑始终避免(至少限制)它的使用。

    【讨论】:

    • 谢谢,完美! “DTO 上的接口通常是个坏主意”到底是什么意思?在这种情况下,您将如何传递/设计它?
    • 我会将 I 从 IList 中取出 - 即只有 List。如果您不提供具体类型,那么实际上支持接口的少数序列化程序必须在线路上发出动态类型信息,从而不必要地使有效负载膨胀并将格式耦合到序列化程序 impl。在 DTO 上使用接口也没有好的/有效的理由。
    猜你喜欢
    • 2018-06-04
    • 2021-11-22
    • 1970-01-01
    • 2018-12-17
    • 2012-07-03
    • 2019-11-18
    • 2020-11-29
    • 2013-02-21
    • 1970-01-01
    相关资源
    最近更新 更多