Есть много способов представить конечную точку HTTP в Camel : jetty, tomcat, servlet, cxfrs и restlet. Два из этих компонентов — cxfrs и restlet также поддерживают семантику REST с помощью всего лишь нескольких строк кода. Этот простой пример демонстрирует, как выполнять CRUD-операции с camel-restlet и camel-jdbc. Четыре HTTP-глагола выполняют разные операции и отображаются на следующий единственный шаблон URI:
- POST — создать нового пользователя: / user
- GET — запросить текущее состояние пользователя, указанного в URI: / user / {userId}
- PUT — обновить пользователя по указанному URI с новой информацией: / user / {userId}
- УДАЛИТЬ — удалить пользователя, идентифицируемого данным URI: / user / {userId}
Существует также URI / users, который возвращает всех пользователей независимо от используемого метода HTTP. Создать такое приложение с помощью Camel просто. После добавления всех необходимых зависимостей (restlet, spring, jdbc…) настройте web.xml для загрузки контекста Camel:
1
2
3
4
5
6
7
8
|
< context-param > < param-name >contextConfigLocation</ param-name > < param-value >classpath:camel-config.xml</ param-value > </ context-param > < listener > < listener-class >org.springframework.web.context.ContextLoaderListener </ listener-class > </ listener > |
и сопоставьте сервлет Restlet
01
02
03
04
05
06
07
08
09
10
11
12
|
< servlet > < servlet-name >RestletServlet</ servlet-name > < servlet-class >org.restlet.ext.spring.SpringServerServlet</ servlet-class > < init-param > < param-name >org.restlet.component</ param-name > < param-value >RestletComponent</ param-value > </ init-param > </ servlet > < servlet-mapping > < servlet-name >RestletServlet</ servlet-name > < url-pattern >/rs/*</ url-pattern > </ servlet-mapping > |
В контексте Spring есть немного больше Restlet и код установки источника данных в памяти:
1
2
3
4
5
6
7
8
9
|
< bean id = "RestletComponent" class = "org.restlet.Component" /> < bean id = "RestletComponentService" class = "org.apache.camel.component.restlet.RestletComponent" > < constructor-arg index = "0" > < ref bean = "RestletComponent" /> </ constructor-arg > </ bean > < jdbc:embedded-database id = "dataSource" type = "HSQL" > < jdbc:script location = "classpath:sql/init.sql" /> </ jdbc:embedded-database > |
После того, как все настройки выполнены, следующим шагом будет создание маршрутов Camel, которые будут обрабатывать HTTP-запросы и выполнять соответствующие операции CRUD. Первый — это маршрут createUser, который выполняет команду SQL-вставки с параметрами только из запросов POST и возвращает вновь созданного пользователя в теле ответа:
01
02
03
04
05
06
07
08
09
10
11
|
< route id = "createUser" > < from uri = "restlet:/user?restletMethod=POST" /> < setBody > < simple >insert into user(firstName, lastName) values('${header.firstName}','${header.lastName}'); </ simple > </ setBody > < to uri = "jdbc:dataSource" /> < setBody > < simple >select * from user ORDER BY id desc LIMIT 1</ simple > </ setBody > < to uri = "jdbc:dataSource" /> </ route > |
Маршрут ‘управляет пользователем’ обрабатывает методы HTTP GET, PUT и DELETE, но в зависимости от используемого метода выполняет различные команды SQL:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
< route id = "manipulateUser" > < from uri = "restlet:/user/{userId}?restletMethods=GET,PUT,DELETE" /> < choice > < when > < simple >${header.CamelHttpMethod} == 'GET'</ simple > < setBody > < simple >select * from user where id = ${header.userId}</ simple > </ setBody > </ when > < when > < simple >${header.CamelHttpMethod} == 'PUT'</ simple > < setBody > < simple >update user set firstName='${header.firstName}', lastName='${header.lastName}' where id = ${header.userId}</ simple > </ setBody > </ when > < when > < simple >${header.CamelHttpMethod} == 'DELETE'</ simple > < setBody > < simple >delete from user where id = ${header.userId}</ simple > </ setBody > </ when > < otherwise > < stop /> </ otherwise > </ choice > < to uri = "jdbc:dataSource" /> </ route > |
И последний путь для перечисления всех пользователей не требует пояснений:
1
2
3
4
5
6
7
|
< route id = "listUsers" > < from uri = "restlet:/users" /> < setBody > < constant >select * from user</ constant > </ setBody > < to uri = "jdbc:dataSource" /> </ route > |
Если вы хотите увидеть приложение в действии, извлеките исходный код из github и запустите его с помощью встроенного плагина maven-jetty, набрав: mvn jetty: run. Вы даже можете попробовать несколько быстрых запросов, если у вас установлен curl:
Чтобы создать пользователя, выполните запрос HTTP POST с параметрами firstName и lastName.
1
|
curl -d 'firstName=test&lastName=user' http: //localhost :8080 /rs/user/ |
Чтобы обновить существующего пользователя, выполните запрос HTTP PUT с параметрами firstName и lastName.
1
|
curl -X PUT -d 'firstName=updated&lastName=user' http: //localhost :8080 /rs/user/2 |
Чтобы получить существующего пользователя, выполните http GET-запрос с userId как частью URL-адреса.
1
|
curl -X GET http: //localhost :8080 /rs/user/2 |
Чтобы удалить существующего пользователя, сделайте запрос http DELETE с userId как частью URL
1
|
curl -X DELETE http: //localhost :8080 /rs/user/2 |
Чтобы получить всех существующих пользователей, сделайте http GET-запрос для пользователей URL
1
|
curl -X GET http: //localhost :8080 /rs/users |
Ссылка: ОТДЫХ с Apache Camel от нашего партнера JCG Билгина Ибряма в блоге OFBIZian