23 Aralık 2020 Çarşamba

Camel RestDefinition Sınıfı

Giriş
1. İsteğe kendimiz cevap verebiliriz.
2. İsteği başka bir bileşene gönderebiliriz.

Örnek - get İsteğine Enpoint İçinde Cevap Verebiliriz
Şöyle yaparız
@Component
public class Router extends RouteBuilder {
  private static final String NAME_TAG = "name";
  @Override
  public void configure() throws Exception {
    restConfiguration()
      .bindingMode(RestBindingMode.json);
    rest("hello")
      .get()
      .route()
       .choice()
        .when(isNull(header(NAME_TAG)))
          .setProperty(NAME_TAG, constant("world"))
        .otherwise()
          .setProperty(NAME_TAG, header(NAME_TAG))
        .end()
        .setBody(simple(String.format("Hello, ${property.%s}!", NAME_TAG)));
  }
}
Örnek - get ile Aynı Sınıftaki Route Tetiklemek
Şöyle yaparız. Bu örnekte istek endpoint'ten from () ile tanımlanan Route'a yönlendiriliyor.
rest()
  .get("hello").route().to("direct:say-hi").endRest()
  .get("bye").route().to("direct:say-bye").endRest()
;
from("direct:say-hi")
  .choice()
    .when(isNull(header(NAME_TAG)))
      .setProperty(NAME_TAG, constant("world"))
    .otherwise()
      .setProperty(NAME_TAG, header(NAME_TAG))
    .end()
    .setBody(simple(String.format("Hello, ${property.%s}!", NAME_TAG)))
;
from("direct:say-bye")
  .setBody(simple("Bye, see you soon!"))
;
Örnek - get ile Başka Sınıftaki Route Tetiklemek
Şöyle yaparız. Bu örnekte istek endpoint'ten from () ile tanımlanan Route'a yönlendiriliyor. Route ise .process(...) aracılığıyla isteği işliyor
@Component
public class RestConfig extends RouteBuilder{

  @Override
  public void configure() throws Exception {
    rest("/convert")

      .get("/celsius/to/fahrenheit/{num}")
        .consumes("text/plain").produces("text/plain")
        .description("Convert a temperature in Celsius to Fahrenheit")
        .param().name("num").type(RestParamType.path)
          .description("Temperature in Celsius")
          .dataType("int").endParam()
        .to("direct:celsius-to-fahrenheit")

      .get("/fahrenheit/to/celsius/{num}")
        .consumes("text/plain").produces("text/plain")
.description("Convert a temperature in Fahrenheit to Celsius")
.param().name("num").type(RestParamType.path)
          .description("Temperature in Fahrenheit")
          .dataType("int").endParam()
.to("direct:fahrenheit-to-celsius");
  }
}
Bu rest noktasını tetiklemek için şöyle yaparız
curl localhost:9090/convert/celcius/to/fahrenheit/50
Parametreye karşı bileşende erişmek için şöyle yaparız
@Component
public class Soap2Rest extends RouteBuilder{

  @Override
  public void configure() throws Exception {

    from("direct:celsius-to-fahrenheit")
      .removeHeaders("CamelHttp*")
      .process(new Processor() {
        @Override
        public void process(Exchange exchange) throws Exception {
          Double.valueOf(exchange.getIn().getHeader("num"));
          ...
        }
      })
      ...
  }
}
Örnek - get ile Aynı Sınıftaki Route Tetiklemek
Şöyle yaparızBu örnekte istek endpoint'ten from () ile tanımlanan Route'a yönlendiriliyor. Route ise .bean(...) metoduyla isteği işliyor
@Component
public class BookRoute extends RouteBuilder {

    private final Environment env;

    public BookRoute(Environment env) {
        this.env = env;
    }

  public void configure() throws Exception {

    restConfiguration()
      .contextPath(env.getProperty("camel.component.servlet.mapping.contextPath", "/rest/*"))
      .apiContextPath("/api-doc")
      .apiProperty("api.title", "Spring Boot Camel Postgres Rest API.")
      .apiProperty("api.version", "1.0")
      .apiProperty("cors", "true")
      .apiContextRouteId("doc-api")
      .port(env.getProperty("server.port", "8080"))
      .bindingMode(RestBindingMode.json);

    rest("/book")
      .consumes(MediaType.APPLICATION_JSON_VALUE)
      .produces(MediaType.APPLICATION_JSON_VALUE)
      .get("/{name}").route()
       .to("{{route.findBookByName}}")
      .endRest()
      .get("/").route()
       .to("{{route.findAllBooks}}")
      .endRest()
      .post("/").route()
       .marshal().json()
       .unmarshal(getJacksonDataFormat(Book.class))
       .to("{{route.saveBook}}")
      .endRest()
      .delete("/{bookId}").route()
        .to("{{route.removeBook}}")
      .end();

      from("{{route.findBookByName}}")
        .log("Received header : ${header.name}")
        .bean(BookService.class, "findBookByName(${header.name})");

    from("{{route.findAllBooks}}")
      .bean(BookService.class, "findAllBooks");


    from("{{route.saveBook}}")
     .log("Received Body ${body}")
     .bean(BookService.class, "addBook(${body})");


    from("{{route.removeBook}}")
      .log("Received header : ${header.bookId}")
     .bean(BookService.class, "removeBook(${header.bookId})");
  }

  private JacksonDataFormat getJacksonDataFormat(Class<?> unmarshalType) {
    JacksonDataFormat format = new JacksonDataFormat();
    format.setUnmarshalType(unmarshalType);
    return format;
  }
}
Örnek - get ile Harici Bir Servise Get Yapmak
Şöyle yaparız. toD() ile bir başka servise çağrı yapıyoruz.
from(CamelConstants.WEATHER_ROUTE)
    .setProperty(CITY_TAG, header(CITY_TAG))
    .removeHeaders("*")
    .setHeader(Exchange.HTTP_METHOD, constant(HttpMethods.GET))
    .toD(generateServiceUrl())
    .unmarshal().json(JsonLibrary.Jackson, WeatherResponse.class)
    .process(weatherAdviserProcessor)
toD() ile kullanılan metod şöyle
private static final String WEATHER_SERVICE_URL =
"http://api.weatherstack.com/current?access_key=%s&query=%s&units=m";

@Value(value = "${api.key}")
private String apiKey;

private String generateServiceUrl() {
  return String.format(WEATHER_SERVICE_URL, apiKey,
String.format("${property.%s}", CITY_TAG));
}
Gelen cevabı işleyip çeviren processor şöyle
@Component
public class WeatherAdviserProcessor implements Processor {
  @Override
  public void process(Exchange exchange) throws Exception {
    WeatherResponse weatherResponse = exchange.getIn().getBody(WeatherResponse.class);
    ...
    String advice = "...";
    exchange.getOut().setBody(advice);
  }
}

Hiç yorum yok:

Yorum Gönder