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
@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ızcurl 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ız.
Bu ö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
şöyleprivate 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);
}
}