使用来自SpringXD传递HTTP请求头到RESTAPI HTTP客户端处理器(Passing h

2019-10-21 16:53发布

我想打从我的HTTP客户端处理器模块一个REST API。 我想知道我怎么可以发送请求头的URL我想打。 如果没有请求头,我得到500内部服务器错误。

将mappedRequestHeaders选项是有用的,通过标题,有人可以举一个例子吧。

下面是我流的样子:

jms --destination= | http-client --url='''https://hostname:11210/cards/accounts?eName=John%20Smith&caFSix=426600&caLF=1234''' --httpMethod=GET | log

Answer 1:

是的,假设你的头是x-foo ,设置mappedRequestHeaders的财产http-client处理器"HTTP_REQUEST_HEADERS, x-foo"

然后,如果入站JMS消息具有报头x-foo=bar ,它将在所映射的http-client

这是假设你使用的是本地或兔消息总线; 对Redis的你就必须配置总线来传递你的头。

如果入站JMS消息不具有报头,则需要定制处理器(或定制的http-client )使用<header-enricher/>添加的报头。

编辑

您可以使用Redis的,但你需要,如果你想让他们穿越巴士到你的头名添加到servers.yml配置为Redis的:

xd:
  messagebus:
    redis:
      headers:   

但是,如果您直接在您的自定义HTTP客户端添加页眉,富集,他们将不再需要越过总线。

您可以使用JSON路径来提取您的JMS消息的内容。 如果您还需要改变有效载荷,你会发现它更容易使用自定义的变压器来创建消息。

Message<?> transform(Message<String> msg) {

   return MessageBuilder.withPayload(newPayload)
             .copyHeaders(msg)
             .setHeader("accept", "...")
             .setHeader(...)
             . ...
             .build();
}

编辑#2:

我只是测试它,它为我工作得很好...

<header-enricher input-channel="input" output-channel="toHttp">
    <header name="foo" value="bar" />
</header-enricher>

<channel id="toHttp" />

<int-http:outbound-gateway id='http-client'
    request-channel='toHttp' url-expression="${url}" http-method="${httpMethod}"
    expected-response-type='java.lang.String' charset='${charset}'
    reply-timeout='${replyTimeout}' reply-channel='output'
    mapped-request-headers="${mappedRequestHeaders}"
    mapped-response-headers="${mappedResponseHeaders}">
</int-http:outbound-gateway>

<channel id="output" />
<channel id="input" />

有了这个流定义...

xd:>stream create ticktock --definition "time --fixedDelay=5 | http-client --url='''http://localhost:8080/http/receiveGateway''' --mappedRequestHeaders=HTTP_REQUEST_HEADERS,foo | log --expression=#root" --deploy

......这些结果...

18:02:20,284  INFO task-scheduler-3 sink.ticktock - GenericMessage [payload=2015-02-02 18:02:20 from the other side, headers={Server=Apache-Coyote/1.1, foo=bar, connection=keep-alive, id=8a444177-b96d-70c3-58e7-d92067d6b18e, Content-Length=39, contentType=text/plain, http_statusCode=200, Date=1422918140000, timestamp=1422918140284}]
18:02:25,292  INFO task-scheduler-3 sink.ticktock - GenericMessage [payload=2015-02-02 18:02:25 from the other side, headers={Server=Apache-Coyote/1.1, foo=bar, connection=keep-alive, id=d62b46ed-dcc7-6dd0-35ea-b7b988c4f2f1, Content-Length=39, contentType=text/plain, http_statusCode=200, Date=1422918145000, timestamp=1422918145292}]

正如你所看到的, foo=bar出现在最终的消息中。

现在,在HTTP消息,默认情况下,该用户定义的报头得到由前缀X-所以foo报头显示为X-foo: bar在HTTP。

为了抑制X-你需要另外的调整到http-client ...

<header-enricher input-channel="input" output-channel="toHttp">
    <header name="foo" value="bar" />
</header-enricher>

<channel id="toHttp" />

<int-http:outbound-gateway id='http-client'
    request-channel='toHttp' url-expression="${url}" http-method="${httpMethod}"
    expected-response-type='java.lang.String' charset='${charset}'
    reply-timeout='${replyTimeout}' reply-channel='output'
    header-mapper="mapper">
</int-http:outbound-gateway>

<beans:bean id="mapper" class="org.springframework.integration.http.support.DefaultHttpHeaderMapper">
    <beans:property name="userDefinedHeaderPrefix" value="" />
    <beans:property name="outboundHeaderNames" value="${mappedRequestHeaders}" />
    <beans:property name="inboundHeaderNames" value="${mappedResponseHeaders}" />
</beans:bean>

<channel id="output" />
<channel id="input" />


Answer 2:

@Gary正如你所说,我没有创建一个自定义的HTTP客户端头,富集如下:

<int-http:outbound-gateway id='http-client'
            request-channel='headerenricheroutput' url-expression="${url}" http-method="${httpMethod}"
            expected-response-type='java.lang.String' charset='${charset}'
            reply-timeout='${replyTimeout}' reply-channel='output'
            mapped-request-headers="${mappedRequestHeaders}"
            mapped-response-headers="${mappedResponseHeaders}">
    </int-http:outbound-gateway>
    <channel id="output" />
    <channel id="headerenricheroutput" />
    <header-enricher input-channel="input" output-channel="headerenricheroutput">
            <header name="User-Agent" value="Shred"/>
            <header name="Api-Key" value="AbCdEFg1HiJ23klMnopQrS4U"/>
            <header name="Accept" value="application/json"/>
    </header-enricher>

    <channel id="input" />

我创建了一个流为: stream create --name abc--definition "jms --destination=myQueue| http-client --url='''https://host:port/cards/accounts?eName=John%20Smith&cardFS=426600&cardLF=1234''' --mappedRequestHeaders=HTTP_REQUEST_HEADERS,User-Agent,Api-Key,Accept --httpMethod=GET | log" --deploy

但我还是过不了头的URL。 能否请你点我到正确方向。

与此同时,只是为了让从我的API回复的缘故,我创建了一个Groovy脚本调用与头上面的网址,我能做到这一点。 也许有人会发现它很有用,这样张贴。 Groovy的脚本是:

def json = "https://host:11210/credit/accounts?eName=John%20Smith&cardFS=426600&cardLF=1234".toURL().getText(requestProperties:['User-Agent': 'Shred', 'Api-Key': 'abc', Accept: 'application/json'])

流是这样的:

jms --destination=tiki | transform --script=transform.groovy | log

我仍然无法弄清楚需要准确地完成对HTTP客户端的东西。



文章来源: Passing http request header to RestAPI from SpringXD using http-client processor