Spring Integration http:outbound-gateway using json subparts



我希望标题很清楚。我正在使用弹簧集成,我想做以下事情。我想使用以下 API 来丰富有效负载:https://min-api.cryptocompare.com/data/pricemultifull?fsyms=BTC&tsyms=USD

如您所见,它有一个类似于 RAW/BTC/USD/的结构,然后是属性。我只对几个属性值感兴趣。

我的出站网关如下所示,到目前为止可以工作:

<int:chain input-channel="internal.cryptocompare.coin.market.enrich.channel">
<int-http:outbound-gateway id="cryptocompareHttpGateway.marketData" 
url="https://min-api.cryptocompare.com/data/pricemultifull?fsyms={fsym}&amp;tsyms={tsyms}"
http-method="GET" 
reply-timeout="10000" 
charset="UTF-8"
>
<int-http:uri-variable name="fsym" expression="payload.symbol" />
<int-http:uri-variable name="tsyms" expression="'USD'" />
</int-http:outbound-gateway>
</int:chain>

然后我得到一个ResponseEntity,我想获得属性,例如价格。

相反,有一个ResponseEntity我也会有一个值对象,我也可以使用它,但字段没有丰富:

<int:enricher id="coinMarketEnricher"
input-channel="internal.cryptocompare.coin.price.enriched.income.channel"
request-channel="internal.cryptocompare.coin.market.enrich.channel"
output-channel="cryptocompare.income.channel"
error-channel="cryptocompare.error.channel"
>
<int:property name="volume24hUSD" expression="payload.volume24hUSD"/>
<int:property name="marketCapUSD" expression="payload.marketCapUSD"/>
<int:property name="availableSupply" expression="payload.availableSupply"/>
<int:property name="changePercent24h" expression="payload.changePercent24h"/>
<int:property name="lastUpdateEpoch" expression="payload.lastUpdateEpoch"/>
<int:property name="marketName" expression="payload.marketName"/>
</int:enricher>
<int:channel id="internal.cryptocompare.coin.market.enrich.channel" />
<int:chain input-channel="internal.cryptocompare.coin.market.enrich.channel">
<int-http:outbound-gateway id="cryptocompareHttpGateway.marketData" 
url="https://min-api.cryptocompare.com/data/pricemultifull?fsyms={fsym}&amp;tsyms={tsyms}"
http-method="GET" 
reply-timeout="10000" 
charset="UTF-8"
expected-response-type="net.hemisoft.ccm.porter.cryptocompare.Coin"
>
<int-http:uri-variable name="fsym" expression="payload.symbol" />
<int-http:uri-variable name="tsyms" expression="'USD'" />
</int-http:outbound-gateway>
</int:chain>
@ToString
class Coin {
@JsonProperty("Id")                 String  coinId
@JsonProperty("CoinName")           String  name
@JsonProperty("Name")               String  symbol
@JsonProperty("SortOrder")          Integer rank
@JsonProperty("USD")                Double  priceUSD
@JsonProperty("BTC")                Double  priceBTC
@JsonProperty("VOLUME24HOUR")       Double  volume24hUSD
@JsonProperty("MKTCAP")             Double  marketCapUSD
@JsonProperty("SUPPLY")             Double  availableSupply
@JsonProperty("CHANGEPCT24HOUR")    Double  changePercent24h
@JsonProperty("LASTUPDATE")         Long    lastUpdateEpoch
@JsonProperty("LASTMARKET")         String  marketName
}

我更喜欢使用Coin_Class而不是响应实体。 非常感谢您的意见。

为此,您需要添加以下内容:

expected-response-type="Coin"

进入<int-http:outbound-gateway>定义:https://docs.spring.io/spring-integration/docs/5.0.4.RELEASE/reference/html/http.html#_httprequestexecutingmessagehandler

除了上面关于空响应正文的说明之外,如果响应确实包含正文,则必须提供适当的expected-response-type属性,否则,您将只收到一个没有正文的ResponseEntity

更新

由于您获得的 JSON 不直接适合您的Coin模型,您可以像这样操作:

  • new Coin发送到internal.cryptocompare.coin.price.enriched.income.channel
  • request-channel="internal.cryptocompare.coin.market.enrich.channel"将执行 HTTP 请求
  • 那里而不是expected-response-type="net.hemisoft.ccm.porter.cryptocompare.Coin",你应该使用expected-response-type="java.lang.String"
  • 然后在这些映射<int:property>中,您需要执行#jsonPath()以提取所需的值,例如<int:property name="volume24hUSD" expression="#jsonPath(payload, '$..VOLUME24HOUR[1]')"/>

在此处查看更多信息:https://docs.spring.io/spring-integration/docs/5.0.4.RELEASE/reference/html/spel.html 和此处:https://github.com/json-path/JsonPath

最新更新