2017-07-15 96 views
2

我需要进行下面的调用,以开放的API(https://www.openfigi.com/apiServiceStack包装器彭博OpenFIGI

卷曲实施例:

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请求DTO,我怎么做一个RequestDto实现调用上述第三方服务端点。

回答

2

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

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

我在这里使用了[DataMember]属性,因为它可以独立于Json序列化配置工作。您不需要为Response 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的集合,e.g:

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

Gistlyn会告诉你通过点击它在监视窗口中每个变量的一个很好的人类可读的预览。或者如果你是C#单元测试的话,你可以很快看到填充的DTO:

response.PrintDump(); 
+1

爱生活gistlyn的例子! –