Передача заголовка http-запроса в RestAPI из SpringXD с использованием процессора http-client

Я пытаюсь использовать API-интерфейс отдыха из моего модуля процессора http-client. Я хотел бы знать, как я могу отправить заголовок запроса на URL-адрес, который я пытаюсь нажать. Без заголовка запроса я получаю 500 Internal Server Error.

Будет ли полезна опция mappedRequestHeaders для передачи заголовков, может кто-нибудь привести пример, пожалуйста.

Ниже показано, как выглядит мой поток:

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

person Ashish C    schedule 23.01.2015    source источник


Ответы (2)


Да, если ваш заголовок x-foo, установите для свойства mappedRequestHeaders процессора http-client значение "HTTP_REQUEST_HEADERS, x-foo".

Затем, если входящее сообщение JMS имеет заголовок x-foo=bar, оно будет отображено в файле http-client.

Это предполагает, что вы используете локальную или кроличью шину сообщений; для redis вам нужно будет настроить шину для передачи вашего заголовка.

Если входящее сообщение JMS не имеет заголовка, вам потребуется специальный процессор (или настроенный http-client), чтобы использовать <header-enricher/> для добавления заголовка.

ИЗМЕНИТЬ:

Вы можете использовать redis, но вам нужно добавить имя заголовка в конфигурацию server.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" />
person Gary Russell    schedule 26.01.2015
comment
Спасибо большое. В моем случае сообщение jms будет иметь только текст и не будет заголовка JMS. Текст, который содержит это сообщение jms, будет иметь фактический заголовок, необходимый для вызова REST API по URL-адресу, который я использую в процессоре http-client (это что-то вроде: {"User-Agent": "Shred","Accept": "application/json"}. x-foo=bar в вашем ответе означает заголовок JMS? Я думаю, в моем случай, когда мне нужно создать собственный http-клиент, как вы предложили, чтобы добавить заголовок.Также я использовал Redis, поэтому теперь я перешел к использованию локальной шины сообщений, как вы предложили. - person Ashish C; 26.01.2015
comment
Я добавил еще некоторые детали. - person Gary Russell; 27.01.2015
comment
Я пробовал вещи, как показано ниже, но все еще не мог передать заголовки в свой API. Не могли бы вы помочь? - person Ashish C; 30.01.2015
comment
У вас есть два подписчика на input; http-шлюз и обогатитель заголовков. Вам нужно подключить их в порядке input->enricher->gateway->output (используйте новый канал в канале вывода обогатителя и канале запроса шлюза). - person Gary Russell; 31.01.2015
comment
В очередной раз благодарим за помощь. Я исправил xml, указав обогащающий заголовок и исходящий шлюз, но заголовки не достигают моего RESTApi. Если вы посмотрите на скрипт groovy, о котором я упоминал ниже, я передаю из него те же заголовки, что и из этого http-клиентского процессора, и они, кажется, работают с groovy. Я нахожусь на одном узле, поэтому Redis не работает при удалении заголовков. Требуется ли дополнительная настройка в http-клиенте, чтобы он мог передавать заголовки? - person Ashish C; 03.02.2015
comment
Благодаря тонну!! . Мне удалось успешно позвонить в мой RestAPI, передав заголовки. Я боролся за последние несколько дней, но понял действительно глупую ошибку. Я не изменил outbound-gateway, чтобы иметь header-mapper="mapper". Еще раз большое спасибо!! - person Ashish C; 11.02.2015

@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, я создал отличный скрипт для вызова вышеуказанного URL-адреса с заголовком, и я смог это сделать. Может кому пригодится, так что выложу. Крутой скрипт:

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-клиента.

person Ashish C    schedule 30.01.2015