Есть много способов представить конечную точку 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