Bloomberg OpenFIGI 的 ServiceStack 包装器

标签 servicestack

我需要对开放 API ( https://www.openfigi.com/api ) 进行以下调用

curl 示例:

curl -v -X POST 'https://api.openfigi.com/v1/mapping'   \
     --header 'Content-Type: text/json'             \
     --data '[{"idType":"ID_WERTPAPIER","idValue":"851399","exchCode":"US"}]'

请求格式 请求通过 HTTP 请求正文传入。唯一受支持的 HTTP 动词是 POST。以下是对 API 的请求示例:

[
  {"idType":"ID_ISIN","idValue":"US4592001014"},
  {"idType":"ID_WERTPAPIER","idValue":"851399","exchCode":"US"},
  {"idType":"ID_BB_UNIQUE","idValue":"EQ0010080100001000","currency": "USD"},
  {"idType":"ID_SEDOL","idValue":"2005973","micCode":"EDGX", "currency":"USD"}
]

使用ServiceStack Request DTO,如何制作RequestDto来实现对上述第三方服务端点的调用。

最佳答案

这只是创建与您想要输出的 JSON 和您想要接收的 JSON 的形状相匹配的 DTO 的练习。要发出准确的 JSON 属性名称,您可以在请求 DTO 上使用 [DataMember] ,或使用 JsConfig.EmitCamelCaseNames = true 告诉 ServiceStack 以驼峰命名法序列化属性,或者您可以使用JsConfig.With() to create a Custom Scope .

我创建了一个 Live example of this in Gistlyn您可以使用它来针对 Bloomberg 的 API 进行实验。

我在这里使用了 [DataMember] 属性,因为它将独立于您的 Json 序列化配置工作。您不需要对响应 DTO 执行此操作,因为 ServiceStack 序列化程序不区分大小写。

因此,要发送与您可以使用的 JSON 形状匹配的请求:

[DataContract]
public class Mapping
{
    [DataMember(Name="idType")]
    public string IdType { get; set; }
    [DataMember(Name="idValue")]
    public string IdValue { get; set; }
    [DataMember(Name="exchCode")]
    public string ExchCode { get; set; }
    [DataMember(Name="currency")]
    public string Currency { get; set; }
    [DataMember(Name="micCode")]
    public string MicCode { get; set; }
}

您可以使用ServiceStack的HTTP Utils轻松向第三方 API 发送请求,例如:

var url = "https://api.openfigi.com/v1/mapping";

var json = url.PostJsonToUrl(new[]{
    new Mapping { IdType = "ID_ISIN", IdValue = "US4592001014" },
    new Mapping { IdType = "ID_WERTPAPIER", IdValue = "851399", ExchCode = "US" },
    new Mapping { IdType = "ID_BB_UNIQUE", IdValue = "EQ0010080100001000", Currency = "USD" },
    new Mapping { IdType = "ID_SEDOL", IdValue = "2005973", MicCode = "EDGX", Currency = "USD" },
});

然后,要接收响应,您需要创建与 JSON 响应的形状相匹配的 DTO,如下所示:

public class BloombertResult
{
    public string Figi { get; set; }
    public string SecurityType { get; set; }
    public string MarketSector { get; set; }
    public string Ticker { get; set; }
    public string Name { get; set; }
    public string UniqueId { get; set; }
    public string ExchCode { get; set; }
    public string ShareClassFIGI { get; set; }
    public string CompositeFIGI { get; set; }
    public string SecurityType2 { get; set; }
    public string SecurityDescription { get; set; }
    public string UniqueIdFutOpt { get; set; }
}

public class BloombergResponse
{
    public List<BloombertResult> Data { get; set; }
    public string Error { get; set; }
}

您可以将其反序列化为 BloombergResponse 的集合,例如:

var response = json.FromJson<BloombergResponse[]>();

GiSTLyn 将通过在监 window 口中单击每个变量来向您显示每个变量的可读预览。或者,如果您在 C# 单元测试中,您可以快速查看填充的 DTO:

response.PrintDump();

关于Bloomberg OpenFIGI 的 ServiceStack 包装器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45118966/

相关文章:

servicestack - 如何在不使用 Route 属性的情况下创建摘要/注释

wpf - ServiceStack 作为 MVC、WPF、WP7-8 的服务层

json - 如何将 F# Union 类型与 Servicestack JSON 序列化结合使用?

c# - 使用自定义序列化/反序列化对服务堆栈服务进行单元测试

servicestack - 使用 ServiceStack 广播 rabbitMq 消息

c# - 在 ServiceStack 中使用 IRestClient 发出 HEAD 请求

c# - .Net 框架 Web 项目中使用 DotNetStandard 服务模型的 ServiceStack

c# - ServiceStack - 验证和数据库访问

c# - 在 asp.net MVC4 应用程序中重新连接到 Servicestack session

inversion-of-control - 在 ServiceStack 中,获取容器的正确方法是什么