RESTFul java веб-сервис. Пример Hello World example
Пример Java web-service с использованием технологии REST.
Используемые технологии и библиотеки
- Apache CXF 3.1.6
- Spring MVC 4.3.0.Release
1. Описание задачи
Создать простейший веб-сервис с использованием технологии REST. Написать простой класс веб-сервиса на стороне сервера и обратиться к нему с помощью кода клиентской части.
2. Структура проекта
Создан один класс, описывающий REST веб-сервис (HelloRest). Для демонстрации вывода Java объекта в xml-формате используются два класса (Goods, Document). Клиентская часть находится в классе JavaStudyWS и запускается в методе main.
3. pom.xml
Для реализации веб-сервиса используется библиотека Apache CXF.
1 2 3 4 5 6 7 8 9 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 73 74 75 |
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>ru.javastudy</groupId> <artifactId>javastudy_webservices</artifactId> <version>1.0</version> <properties> <java.version>1.8</java.version> <spring-framework.version>4.3.0.RELEASE</spring-framework.version> <cxf-rt-frontend-jaxrs.version>3.1.6</cxf-rt-frontend-jaxrs.version> </properties> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-framework-bom</artifactId> <version>${spring-framework.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <dependencies> <!-- Spring MVC --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> </dependency> <dependency> <groupId>org.apache.cxf</groupId> <artifactId>cxf-rt-frontend-jaxrs</artifactId> <version>${cxf-rt-frontend-jaxrs.version}</version> </dependency> <!--For HTTP client--> <dependency> <groupId>commons-httpclient</groupId> <artifactId>commons-httpclient</artifactId> <version>3.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <groupId>org.apache.maven.plugins</groupId> <version>3.3</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <compilerArgument>-Xlint:all</compilerArgument> <showWarnings>true</showWarnings> <showDeprecation>true</showDeprecation> </configuration> </plugin> </plugins> </build> </project> |
4. web.xml
Для удобства запуска была добавлена зависимость для Spring. Файл с настройками application-context.xml (в нем находится описание RESTful веб-сервиса) добавлен дескриптор развертывания. Так же был добавлен mvc-config.xml (не используется) в параметры инициализации init-param диспетчера сервлетов, чтобы приложение не ругалось на отсутствие файла с настройками (dispatcher-servlet.xml).
web.xml:
1 2 3 4 5 6 7 8 9 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 |
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>dispatcher</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/config/mvc-config.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcher</servlet-name> <url-pattern>*.form</url-pattern> </servlet-mapping> <servlet> <servlet-name>CXFServlet</servlet-name> <servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class> <load-on-startup>2</load-on-startup> </servlet> <servlet-mapping> <servlet-name>CXFServlet</servlet-name> <url-pattern>/rest/*</url-pattern> </servlet-mapping> </web-app> |
Для реализации веб-сервиса используется реализация Jax-RS API — Apache CXF. Создан сервлет и задан шаблон URL по которому он будет срабатывать (/rest/*).
5. application-context.xml
Настройки Spring были добавлены лишь для удобства быстрого описания веб-сервиса. Это не обязательно и веб-сервис можно задавать другими способами.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jaxrs="http://cxf.apache.org/jaxrs" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd"> <!--load cxf spring bus--> <import resource="classpath:META-INF/cxf/cxf.xml" /> <import resource="classpath:META-INF/cxf/cxf-servlet.xml" /> <bean id="helloRestBean" class="ru.javastudy.ws.webservices.rest.HelloRest"/> <!--http://localhost:8080/rest/helloRestService/*--> <jaxrs:server id="helloRestService" address="/helloRestService"> <jaxrs:serviceBeans> <ref bean="helloRestBean"/> </jaxrs:serviceBeans> </jaxrs:server> </beans> |
Здесь прописан веб-сервис с id = helloRestService. Он будет доступен по ссылке, которая формируется из пути сервера + маппинг сервлета + адреса обработки сервиса (в данном случае совпадает с id).
6. Rest сервис
Был создан простейший веб-сервис по технологии REST.
1 2 3 4 5 6 7 8 9 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 |
package ru.javastudy.ws.webservices.rest; import ru.javastudy.ws.model.Document; import ru.javastudy.ws.model.Goods; import javax.ws.rs.*; import java.util.ArrayList; import java.util.List; /** * Created for JavaStudy.ru on 11.06.2016. */ public class HelloRest { public HelloRest() {} @GET @Path("/getgoods") @Produces("application/xml") public Goods getGoods() { Goods goods = new Goods(); goods.setName("Some Goods name"); goods.setId(1); return goods; } @GET @Path("/getdoc") @Produces("application/xml") public Document getDocument() { List<Goods> goodsList = new ArrayList<>(); goodsList.add(new Goods(1, "goods1")); goodsList.add(new Goods(2, "goods2")); goodsList.add(new Goods(3, "goods3")); return new Document(777, "firstDocument", goodsList); } } |
В аннотациях к методам описан HTTP-метод, по которому они будут срабатывать (в данном случае — GET), путь (маппинг) и в каком виде будет предоставлен ответ (xml).
7. Модель данных
Созданы два демонстрационных класса, которые будут преобразовываться в xml-формат и передаваться клиенту. У классов задана аннотация @XmlRootElement, с помощью которой присваивается имя для корневого xml элемента в ответе (см. далее запуск приложения).
Goods:
1 2 3 4 5 6 7 8 9 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 |
package ru.javastudy.ws.model; import javax.xml.bind.annotation.XmlRootElement; import java.io.Serializable; /** * Created for JavaStudy.ru on 11.06.2016. */ @XmlRootElement(name = "goods") public class Goods implements Serializable { private int id; private String name; public Goods() { } public Goods(int id, String name) { this.id = id; this.name = name; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "Goods{" + "id=" + id + ", name='" + name + '\'' + '}'; } } |
Document:
1 2 3 4 5 6 7 8 9 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 |
package ru.javastudy.ws.model; import javax.xml.bind.annotation.XmlRootElement; import java.util.List; /** * Created for JavaStudy.ru on 12.06.2016. */ @XmlRootElement(name = "document") public class Document { private int id; private String name; private List<Goods> goodsList; public Document() { } public Document(int id, String name, List<Goods> goodsList) { this.id = id; this.name = name; this.goodsList = goodsList; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public List<Goods> getGoodsList() { return goodsList; } public void setGoodsList(List<Goods> goodsList) { this.goodsList = goodsList; } } |
8. Rest клиент
Для тестирования нашего сервиса был создан код, имитирующий клиентскую сторону.
JavaStudyWS:
1 2 3 4 5 6 7 8 9 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 |
package ru.javastudy.ws.main; import org.apache.commons.httpclient.Header; import org.apache.commons.httpclient.HttpClient; import org.apache.commons.httpclient.methods.GetMethod; import java.io.IOException; /** * Created for JavaStudy.ru on 09.06.2016. */ public class JavaStudyWS { public static void main(String[] args) throws IOException { String restServiceUrl = "http://localhost:8080/rest/helloRestService/getdoc"; HttpClient httpClient = new HttpClient(); GetMethod getMethod = new GetMethod(restServiceUrl); Header mtHeader = new Header(); mtHeader.setName("content-type"); mtHeader.setValue("application/x-www-form-urlencoded"); getMethod.addRequestHeader(mtHeader); mtHeader = new Header(); mtHeader.setName("accept"); mtHeader.setValue("application/xml"); getMethod.addRequestHeader(mtHeader); httpClient.executeMethod(getMethod); String output = getMethod.getResponseBodyAsString(); System.out.println(output); } } |
Здесь создается экземпляр веб-сервиса, задается адрес и параметры HTTP-заголовка. Далее вызывается один из методов, который соответствует значению из restServiceUrl (в этом случае — метод getDocument()).
9. Запуск веб-сервиса
После запуска веб-сервиса его можно вызвать прямо в браузере. Например, метод getDocument() вызывается по ссылке http://localhost:8080/rest/helloRestService/getdoc.
Аналогично для метода getGoods().
Если запустить метод main класса JavaStudyWS, то мы увидим ответ веб-сервиса в консоли.
1 |
<?xml version="1.0" encoding="UTF-8" standalone="yes"?><document><goodsList><id>1</id><name>goods1</name></goodsList><goodsList><id>2</id><name>goods2</name></goodsList><goodsList><id>3</id><name>goods3</name></goodsList><id>777</id><name>firstDocument</name></document> |
Таким образом можно создать простейший RESTful веб-сервис java.
Исходный код
92 thoughts on “RESTFul java веб-сервис. Пример Hello World example”
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.
Спасибо большое за пример, но было бы круто так же описать деплой веб-сервиса — или в коротком виде как сделать через идею (фасеты, модули etc) или в полном виде. Спасибо большое.
Спасибо за статью, но к сожалению приложение не запускается.
INFO: Retrying requestINFO: Retrying requestException in thread «main» java.net.ConnectException: Connection refused: connect at java.net.DualStackPlainSocketImpl.connect0(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:589) at java.net.Socket.connect(Socket.java:538) at java.net.Socket.<init>(Socket.java:434) at java.net.Socket.<init>(Socket.java:286) at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:80) at org.apache.commons.httpclient.protocol.DefaultProtocolSocketFactory.createSocket(DefaultProtocolSocketFactory.java:122) at org.apache.commons.httpclient.HttpConnection.open(HttpConnection.java:707) at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:387) at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171) at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397) at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:323) at ru.javastudy.ws.main.JavaStudyWS.main(JavaStudyWS.java:32)