Статьи

RESTful веб-сервисы с Джерси

Я обсуждал мою предыдущую статью об архитектурном подходе << ссылка >>, чтобы стать системой 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.

Структура папок для разработки приложений

Структура каталогов нашего приложения выглядит следующим образом:

сброс-WS-фальцевально-струк

Ниже приведен список необходимых библиотек приложений:

сброс-WS-папка Пб

Конфигурация приложения:

Перед началом разработки нам нужно добавить сервлет 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"?>
 <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{
@Context
UriInfo 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 block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.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 block
e.printStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.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 block
e.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
@XmlRootElement
public 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.java
 
public 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.java
 
public 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 static final String USER_URI="http://localhost:8080/UserManagement/users";
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-представление ваших пользовательских элементов:

успокоительный-веб-services_testbrow1

Для подресурса:

успокоительный-веб-services_testbrow2

Примечание : перед запуском приложения не забудьте запустить базу данных H2 и вставить запись в таблицу User

Вывод:

В этом примере рассказывается об основных видах использования Джерси с Apache tomcat. Мы обсудим некоторые позже о предварительном использовании JAX-RS. Вы также можете скачать полный код ниже по этой ссылке <>

Ресурсы:

Ссылка: RESTful Webservices с Джерси от нашего партнера JCG Нитина Кумара в блоге Tech My Talk .