Я обсуждал мою предыдущую статью об архитектурном подходе << ссылка >>, чтобы стать системой RESTful в распределенной среде, пригодной для использования моей системой / машинами В этой статье мы собираемся обсудить, как создавать веб-сервисы на основе архитектуры REST. В этом руководстве объясняется, как разрабатывать веб-службы RESTful на Java с помощью эталонной реализации JAX-RS (JSR 311) для Tomcat 6, Eclipse и Jersey.
В двух словах, веб-сервис RESTful — это связь между компьютерами, использующими принципы HTTP на REST, которые имеют следующие ключевые моменты:
- Каждый ресурс представляет уникальный URI для связи по протоколам HTTP
- Каждая операция ресурса поддерживается методами HTTP (POST, GET, PUT и DELETE)
- Запрос и ответ поддерживаются JSON, XML и различными типами MIME, такими как изображение, поток байтов и т. Д.
JAX-RS
JAX-RS — это API на основе аннотаций для реализации веб-сервисов RESTful, основанных на HTTP, в Java. По сути, классы и методы снабжены информацией, которая позволяет среде выполнения представлять их как ресурсы. Среда выполнения, реализующая JAX-RS, является посредником между протоколом HTTP и классами Java с учетом URI, запрошенных и принятых типов контента и методов HTTP.
В структуре Джерси реализованы эталонные API JSR-RS (JSR-311). В дополнение к Джерси доступны различные другие реализации, такие как Retlet, JBOSS RESTeasy, Apache CXF и т. Д.
Джерси:
Джерси содержит следующие основные части:
- Базовый сервер: для создания веб-сервисов RESTful на основе аннотации включают ключевые библиотеки, такие как: jersey-core.jar, jersey-server.jar, jsr311-api.jar, asm.jar
- Базовый клиент: клиентский API Джерси помогает вам легко общаться с сервисами REST, включая libabry ersey-client.jar
- Поддержка JAXB: (используется в расширенном примере) jaxb-impl.jar, jaxb-api.jar, активации.jar, stax-api.jar, wstx-asl.jar
- Поддержка JSON: (используется в расширенном примере) jersey-json.jar
- Интеграция: Джерси также предоставляет библиотеки, которые могут легко интегрироваться с Spring, Guice, Apache Abdera и так далее.
Получение инструментов
| Программного обеспечения | Скачать |
| Java JDK-6 | http://www.oracle.com/ |
| Затмение — Индико | http://www.eclipse.org/ |
| Tomcat Apache -6 | http://tomcat.apache.org/ |
| H2-Database | http://www.h2database.com/ |
Примечание . Вы можете загрузить полное демонстрационное приложение, включая библиотеки H2 и Jersey, здесь <link>
Реализация веб-сервиса RESTful с использованием Jersey
Мы создадим небольшое приложение для управления пользователями, чтобы управлять CRUD-операциями над пользователем. Затем мы создадим небольшую таблицу User с колонкой username и password и выполним операцию CRUD, используя операцию представления класса POJO для веб-сервисов, используя аннотацию Jersey.
Далее следует рассмотрение проекта перед началом разработки веб-службы RESTful.
- Ресурсы: Пользователь с атрибутами username и password
- Класс ресурса: UsersResource.java
- URI: http: // localhost: 8080 / UserManagement / users
- Представление: XML
Структура папок для разработки приложений
Структура каталогов нашего приложения выглядит следующим образом:
Ниже приведен список необходимых библиотек приложений:
Конфигурация приложения:
Перед началом разработки нам нужно добавить сервлет Jersey в web.xml, чтобы направить весь запрос в jersey для идентификации ресурсов и процессов работы (POST, GET, PUT и DELETE).
После включения джерси сервлета, Web.xml будет выглядеть как показано ниже
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>UserManagement</display-name> <servlet> <servlet-name>Jersey REST Service</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> <init-param> <param-name>com.sun.jersey.config.property.packages</param-name> <param-value>resource.com.users.java</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Jersey REST Service</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping></web-app> |
Ресурсы
Ресурсы — это все, что можно адресовать и манипулировать через Интернет. Ресурсы Джерси представляют собой простой Java-объект (POJO) с аннотацией @Path и будут обрабатываться методами HTTP POST, GET, PUT и DELETE. Ресурс также имеет подресурсы. В примере приложения UsersResource для пользователей java bean — это Ресурсы. Пользователи простой POJO с атрибутами name и password
|
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
UsersResource.java@Path("/users")public class UsersResource implements IUsersResource{@ContextUriInfo uriInfo;@GET@Produces ("application/xml")public List<User> getUsersAll() {List<User> als=null;try {als= UserService.getInstance().getUserAll();} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return als;}@POST@Consumes ("application/xml")@Produces ("application/xml")public User createUser(User user){URI uri = uriInfo.getAbsolutePathBuilder().path(user.getUserName()).build();Response res=Response.created(uri).build();try {UserService.getInstance().CreateUser(user);} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SQLException e) {// TODO Auto-generated catch blocke.printStackTrace();}return user;}@Path("/user/{username}")@GET@Produces ("application/xml")public List<User> getUser(@PathParam("username") String username) {List<User> asl=null;try {asl= UserService.getInstance().getUser(username);} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();} catch (SQLException e) {e.printStackTrace();}return asl;} |
Ниже кратко поясняются пояснения к аннотации JAX-RS.
- @Path: путь в сочетании с корневым путем предоставляет URI для идентификации ресурса. Например, в данном примере URI будет http: // localhost: 8080 / UserManagement / users
- @Path («/ user / {username}»): мы также можем указать дополнительный путь к методу для предоставления дополнительных ресурсов. В этом примере URI будет http: // localhost: 8080 / UserManagement / users / user / john
- @Context: контекст используется для добавления контекстных объектов, таких как запрос, ответ, UriInfo, ServletContext и т. Д.
- @PathParam: эта аннотация используется вместе с @Path и в сочетании с GET, POST, PUT и DELETE. Другие доступные аннотации — @FormParam, @QueryParam и т. Д.
- @Produces («application / xml»): для ответов поддерживается несколько типов MIME. В этом случае application / xml будет типом MIME по умолчанию.
- @Consumes («application / xml»): полезные данные запроса ввода будут отправлены в формате xml.
- @GET: ресурсы, управляемые одним из методов GET, POST, PUT и DELET, передаются по заголовку HTTP
JAXB — Java POJO XML Binding
Джерси поддерживает JAXB, который занимается обработкой преобразования POJO в XML и наоборот. Чтобы квалифицировать POJO для поддержки XML, мы должны объявить аннотацию @XmlRootElement следующим образом:
Не забудьте добавить пустой конструктор, как это требуется при конвертации.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
@XmlRootElementpublic class User {private String userName;private String userPasswd;public User(String userName, String userPasswd) {this.userName = userName;this.userPasswd = userPasswd;}public User() {super();}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public String getUserPasswd() {return userPasswd;}public void setUserPasswd(String userPasswd) {this.userPasswd = userPasswd;}} |
Мы создадим классы обслуживания, которые выполняют операции CRUD в таблице User в базе данных H2.
|
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
|
UserService.javapublic class UserService{public static UserService userService = new UserService();public static final String GET_USER="SELECT * FROM USER";public static final String INSERT_USER="Insert into user ";public List<User> getUserAll() throws ClassNotFoundException, SQLException {List<User> ls = new ArrayList();ls=DataServiceHelper.getInstance().executeQuery(GET_USER);return ls;}public List<User> getUser(String name) throws ClassNotFoundException, SQLException{String SQL_WHERE_CAS=" where name='"+name+"'";List<User> als=DataServiceHelper.getInstance().executeQuery(GET_USER+SQL_WHERE_CAS);return als;}public void CreateUser(User user) throws SQLException, ClassNotFoundException {String SQL_WHERE_CASE=" VALUES('" + user.getUserName() + "','" + user.getUserPasswd() + "')";DataServiceHelper.getInstance().executeUpdateQuery(INSERT_USER+SQL_WHERE_CASE);}public static UserService getInstance() {return userService;}} |
Вспомогательные классы
Нам нужно создать еще пару классов для взаимодействия с БД (в нашем случае H2) и выполнить операцию CRUD.
|
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
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
|
DaraServiceHelper.javapublic class DataServiceHelper {public static DataServiceHelper dataServiceHelper = null;private Connection con = null;DataSource dataSource = null;InitialContext initialContext = null;public static final String DB_URL = "jdbc:h2:tcp://localhost/~/test";public static final String DRIVER_NAME = "org.h2.Driver";/*** This method is used to create an object for the given DAO class name.*/public Connection getConnection() throws ClassNotFoundException,SQLException {Class.forName(DRIVER_NAME);con = DriverManager.getConnection(DB_URL, "sa", "");return con;}public void closeConnection() throws SQLException {if (isConnectionOpen()) {con.close();con = null;}}public boolean isConnectionOpen() {return (con != null);}public static DataServiceHelper getInstance() {if (dataServiceHelper == null) {dataServiceHelper = new DataServiceHelper();}return dataServiceHelper;}public void executeUpdateQuery(String query) throws SQLException,ClassNotFoundException {Connection con = getConnection();Statement stmt = con.createStatement();stmt.execute(query);closeConnection();}public List<User> executeQuery(String query) throws ClassNotFoundException,SQLException {Connection con = getConnection();Statement stmt = con.createStatement();ResultSet rs = stmt.executeQuery(query);List<User> als = convertPojoList(rs);closeConnection();return als;}private List<User> convertPojoList(ResultSet rs) throws SQLException {List<User> asl = new ArrayList<User>();while (rs.next()) {User user = new User(rs.getString("name"), rs.getString("password"));asl.add(user);}return asl;}public static void main(String[] args) throws ClassNotFoundException,SQLException {String query = "Select * from user where name='nitin'";List<User> als = DataServiceHelper.getInstance().executeQuery(query);System.out.println("List==>" + als);}} |
Примечание: для простоты я включил весь код в один класс
Тестирование клиентов на Джерси
Jersey предоставляет клиенту для тестирования веб-сервисов RESTful, которые помогают общаться с сервером и тестируют сервисы Библиотека является общей реализацией, которая может взаимодействовать с любым веб-сервисом на основе HTTP / HTTPS.
|
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
28
29
30
31
|
public class UserResourceSample {public String testGetUsersAll() {ClientConfig config = new DefaultClientConfig();Client client = Client.create(config);WebResource resource = client.resource(ForumConstant.USER_URI);ClientResponse response = resource.type(MediaType.APPLICATION_XML).get(ClientResponse.class);String en = response.getEntity(String.class);return en;}public String testGetUsers() {ClientConfig config = new DefaultClientConfig();Client client = Client.create(config);WebResource resource = client.resource(ForumConstant.USER_URI);ClientResponse response = resource.type(MediaType.APPLICATION_XML).get(ClientResponse.class);String en = response.getEntity(String.class);return en;}public User testCreateUser() {User user = new User("John", "john@");Client client = Client.create();WebResource r = client.resource(ForumConstant.USER_URI);ClientResponse response = r.accept(MediaType.APPLICATION_XML).post(ClientResponse.class, user);return user;}} |
Запустить с помощью браузера
Запустите ваше веб-приложение в Eclipse и проверьте доступность службы REST по адресу: « http: // localhost: 8080 / UserManagement / users & # 8221 ; Вы должны увидеть XML-представление ваших пользовательских элементов:
Для подресурса:
Примечание : перед запуском приложения не забудьте запустить базу данных H2 и вставить запись в таблицу User
Вывод:
В этом примере рассказывается об основных видах использования Джерси с Apache tomcat. Мы обсудим некоторые позже о предварительном использовании JAX-RS. Вы также можете скачать полный код ниже по этой ссылке <>



