Отправить POST запрос с помощью Apache Camel

Мне удалось отправить запрос GET с использованием Apache Camel в службу REST, и теперь я пытаюсь отправить запрос POST с телом JSON с использованием Apache Camel. Я не смог понять, как добавить тело JSON и отправить запрос. Как добавить тело JSON, отправить запрос и получить код ответа?

2 ответа

Ниже вы можете найти пример маршрута, который отправляет (каждые 2 секунды) json, используя метод POST, на сервер, в примере это localhost:8080/ приветствие. Есть также способ получить ответ:

from("timer://test?period=2000")
    .process(exchange -> exchange.getIn().setBody("{\"title\": \"The title\", \"content\": \"The content\"}"))
    .setHeader(Exchange.HTTP_METHOD, constant("POST"))
    .setHeader(Exchange.CONTENT_TYPE, constant("application/json"))
    .to("http://localhost:8080/greeting")
    .process(exchange -> log.info("The response code is: {}", exchange.getIn().getHeader(Exchange.HTTP_RESPONSE_CODE)));

Обычно не стоит готовить JSON вручную. Вы можете использовать, например,

<dependency>
    <groupId>org.apache.camel</groupId>
    <artifactId>camel-gson</artifactId>
</dependency>

выполнить сортировку для вас. Предполагая, что у вас определен класс Greeting, вы можете изменить маршрут, удалив первый процессор и используя вместо этого следующий код:

.process(exchange -> exchange.getIn().setBody(new Greeting("The title2", "The content2")))
.marshal().json(JsonLibrary.Gson)

Дополнительная информация: http://camel.apache.org/http.html Стоит отметить, что есть также компонент http4 (они используют другую версию Apache HttpClient под капотом).

Вот как вы можете это сделать:

from("direct:start")
 .setHeader(Exchange.HTTP_METHOD, constant("POST"))
 .to("http://www.google.com");

Тело текущей Camel Exchange будет помещено в конечную точку URL.

Обратите внимание, что, хотя вы можете предпочесть явно указать метод HTTP, это не обязательно. Следующее взято из документации http-компонента Camel:

КАКОЙ СПОСОБ HTTP БУДЕТ ИСПОЛЬЗОВАН

Для определения того, какой метод HTTP следует использовать, используется следующий алгоритм:

  1. Используйте метод, указанный в качестве конфигурации конечной точки (httpMethod).
  2. Используйте метод, указанный в заголовке (Exchange.HTTP_METHOD).
  3. GET, если в заголовке указана строка запроса.
  4. GET, если конечная точка настроена со строкой запроса.
  5. POST, если есть данные для отправки (тело не пустое).
  6. ПОЛУЧИТЬ иначе.

Другими словами, если у вас есть тело / данные и условия 1–4 не применяются, по умолчанию выполняется POST. Это работает над маршрутами, которые я реализовал.

//This code is for sending post request and getting response
public static void main(String[] args) throws Exception {
    CamelContext c=new DefaultCamelContext();       
    c.addRoutes(new RouteBuilder() {
        @Override
        public void configure() throws Exception {          
            from("direct:start")
            .process(new Processor() {
                public void process(Exchange exchange) throws Exception {
                System.out.println("i am worlds fastest flagship processor ");
                exchange.getIn().setHeader("CamelHttpMethod", "POST");
                exchange.getIn().setHeader("Content-Type", "application/json");
                exchange.getIn().setHeader("accept", "application/json");
                }
                })
              // to the http uri
                .to("https://www.google.com")
       // to the consumer
                .to("seda:end");
        }
    });



    c.start();
    ProducerTemplate pt = c.createProducerTemplate();
      // for sending request 
    pt.sendBody("direct:start","{\"userID\": \"678\",\"password\": \"password\", 
  \"ID\": \"123\"  }");
    ConsumerTemplate ct = c.createConsumerTemplate();
    String m = ct.receiveBody("seda:end",String.class);
    System.out.println(m);
}
Другие вопросы по тегам