Код можно скачать с моего репозитория GitHub .
Предпосылки для этого проекта:
-
Знание Spring Framework .
-
Знание JAX-RS .
-
Структура сообщения JSON .
-
Знание Затмения.
-
Также скачайте IBM Liberty для разработчиков.
Здесь я имею в виду только документацию Википедии. Очевидно, что вы можете продолжить исследование и прочитать любую документацию по всем вышеуказанным темам, которая, по вашему мнению, может быть более полезной для вас.
Цель этого небольшого проекта — помочь разработчикам / студентам разработать приложение веб-службы REST с платформами Spring и Jersey. Вы можете добавить любые комментарии или примеры в комментариях. На основании ваших советов я буду продолжать обновлять проект в будущем.
В этом примере мы используем обмен сообщениями JSON. Я разрабатываю этот проект в Eclipse.
1. Сначала создайте динамический веб-проект.
Нажмите далее и назовите его RESTExample1.
И нажмите «Готово».
Теперь вы увидите, что проект был создан, как показано ниже:
2. Разверните папку «WebContent» и добавьте нижеприведенные jar-файлы в папку lib проекта (вы можете загрузить эти jar-файлы онлайн). Просто введите скачать, а затем имя банки. Например, введите «загрузить abdera-core-1.1.jar» в Google. Лучше скачать их с сайта Maven (необязательно добавлять все эти файлы jar в папку lib. Вы можете развернуть эти файлы jar на своем сервере и добавить их все в путь к классам).
3. Теперь создайте пакет, описанный ниже, и добавьте интерфейс к проекту.
Щелкните правой кнопкой мыши по проекту RESTExample1 в окне, выделите новый, и, из подокна, выберите пакет, введите имя ниже и нажмите кнопку «Готово».
Теперь вы увидите пустой пакет, как показано ниже:
Теперь щелкните правой кнопкой мыши пакет «com.web.controller» и выберите «New», а затем в подокне выберите интерфейс и присвойте ему имя VehicleController.
Добавьте приведенный ниже код в пустой интерфейс (в файле интерфейса нажмите «Ctrl + A», скопируйте и вставьте приведенный ниже код — просто замените весь автоматически сгенерированный код на приведенный ниже код, но обязательно закомментируйте оба метода POST и его реализация в классе, пока вы не завершите тест вызова метода GET).
package com.web.controller;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.HeaderParam;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import com.rest.car.bean.CarDetailBean;
import com.rest.car.bean.CarInfoBean;
@Path("/v/vehicle")
public interface VehicleController {
//Below four different get examples
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getVehicles();
@GET @Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public Response getVehicleById(@PathParam("id") int id);
@GET @Path("/{id}/{id2}")
@Produces(MediaType.APPLICATION_JSON)
public Response getVehicleById(@Context UriInfo info, @PathParam("id") int id, @PathParam("id2") int id2);
@GET @Path("/{id}/car/{zone}")
@Produces(MediaType.APPLICATION_JSON)
public Response getVehicleById(@Context UriInfo info, @PathParam("id") int id, @PathParam("zone") String zone,@HeaderParam("user") String user);
//Below two different POST examples
//comment out below two methods for time being
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("/orders")
public Response registerCar(@Context UriInfo info, CarDetailBean carDetailBean, @HeaderParam("user") String user);
@POST
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
@Path("/orderlist/vehicle.json")
public Response placeCarOrder(@Context UriInfo info, CarInfoBean carInfoBean, @HeaderParam("user") String user);
}
Пожалуйста, посмотрите на различные @Path
объявления выше. Целью объявления здесь другого пути является объяснение различных примеров @Path
декларации, с помощью которой вы можете создавать свои собственные веб-службы REST в соответствии с вашими требованиями.
4. Создайте приведенный ниже класс контроллера и реализуйте вышеуказанный интерфейс (выполните описанные выше шаги и выберите класс на этот раз вместо интерфейса).
package com.web.controller.impl;
import java.io.StringWriter;
import java.io.Writer;
import java.util.List;
import net.minidev.json.JSONObject;
import org.codehaus.jackson.map.ObjectMapper;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.UriInfo;
import javax.ws.rs.core.Response.Status;
import com.web.data.Vehicle;
import com.web.data.VehicleStore;
import com.rest.car.bean.CarDetailBean;
import com.rest.car.bean.CarInfoBean;
import com.web.controller.VehicleController;
public class VehicleControllerImpl implements VehicleController{
ObjectMapper JSON_MAPPER = new ObjectMapper();
String result = null;
@Override
public Response getVehicles(){
System.out.println("In getVehicles()");
VehicleStore vehicleStore = VehicleStore.getStoreInstance();
List<Vehicle> listOfVehicles = vehicleStore.getVehicleList();
JSONObject obj=new JSONObject();
try{
obj.put("Vehicles", listOfVehicles);
}catch(Exception je){
je.printStackTrace();
return Response.status(Status.EXPECTATION_FAILED).entity(je.getMessage()).type(MediaType.APPLICATION_JSON).build();
}
System.out.println("Exit getVehicles()");
return Response.status(Status.OK).entity(obj).type(MediaType.APPLICATION_JSON).build();
}
@Override
public Response getVehicleById(int id){
System.out.println("In getVehicleById(int id)");
System.out.println("id :"+id);
VehicleStore vehicleStore = VehicleStore.getStoreInstance();
List<Vehicle> listOfVehicles = vehicleStore.getVehicleList();
JSONObject obj=new JSONObject();
for (Vehicle vehicle: listOfVehicles) {
if(vehicle.getId()==id){
try{
obj.put("Vehicle", vehicle);
return Response.status(Status.OK).entity(obj).type(MediaType.APPLICATION_JSON).build();
}catch(Exception je){
je.printStackTrace();
return Response.status(Status.EXPECTATION_FAILED).entity(je.getMessage()).type(MediaType.APPLICATION_JSON).build();
}
}
}
return Response.status(Status.EXPECTATION_FAILED).entity("No Data found").type(MediaType.APPLICATION_JSON).build();
}
@Override
public Response getVehicleById(UriInfo info, int id1, int id2){
System.out.println("In getVehicleById(UriInfo info, int id1, int id2)");
System.out.println("id1 :"+id1);
System.out.println("id2 :"+id2);
MultivaluedMap <String, String> parameters = info.getQueryParameters();
String userID = parameters.getFirst("user");
String srvcURL = info.getRequestUri().toString();
System.out.println("srvcURL : "+srvcURL);
VehicleStore vehicleStore = VehicleStore.getStoreInstance();
List<Vehicle> listOfVehicles = vehicleStore.getVehicleList();
JSONObject obj=new JSONObject();
boolean vehicleFound = false;
for (Vehicle vehicle: listOfVehicles) {
if(vehicle.getId()==id1 || vehicle.getId()==id2){
try{
obj.put("Vehicle"+vehicle.getId(), vehicle);
vehicleFound = true;
}catch(Exception e){
e.printStackTrace();
return Response.status(Status.EXPECTATION_FAILED).entity(e.getMessage()).type(MediaType.APPLICATION_JSON).build();
}
}
}
if(vehicleFound)
return Response.status(Status.OK).entity(obj).type(MediaType.APPLICATION_JSON).build();
return Response.status(Status.EXPECTATION_FAILED).entity("No Data found").type(MediaType.APPLICATION_JSON).build();
}
@Override
public Response getVehicleById(UriInfo info, int id,String zone,String user){
System.out.println("In getVehicleById(UriInfo info, int id,String zone,String user)");
System.out.println("id : "+id);
System.out.println("user : "+user);
System.out.println("Zone : "+zone);
VehicleStore vehicleStore = VehicleStore.getStoreInstance();
List<Vehicle> listOfVehicles = vehicleStore.getVehicleList();
JSONObject obj=new JSONObject();
for (Vehicle vehicle: listOfVehicles) {
if(vehicle.getId()==id){
try{
vehicle.setCountryName("Vehicle From :" + zone);
obj.put("Vehicle", vehicle);
Writer strWriter = new StringWriter();
JSON_MAPPER.writeValue(strWriter, vehicle);
result = JSON_MAPPER.writeValueAsString(strWriter);
return Response.status(Status.OK).entity(result).type(MediaType.APPLICATION_JSON).build();
}catch(Exception e){
e.printStackTrace();
return Response.status(Status.EXPECTATION_FAILED).entity(e.getMessage()).type(MediaType.APPLICATION_JSON).build();
}
}
}
return Response.status(Status.EXPECTATION_FAILED).entity("No Data found").type(MediaType.APPLICATION_JSON).build();
}
@Override
public Response registerCar(UriInfo info, CarDetailBean carDetailBean, String user) {
System.out.println("In registerCar(UriInfo info, CarDetailBean carDetailBean, String user)");
VehicleStore vehicleStore = VehicleStore.getStoreInstance();
List<Vehicle> listOfVehicles = vehicleStore.getVehicleList();
for (Vehicle vehicle: listOfVehicles) {
if(vehicle.getId()==carDetailBean.getCarId()){
return Response.status(Status.EXPECTATION_FAILED).entity("Car id already present. Please use different id").type(MediaType.APPLICATION_JSON).build();
}
}
System.out.println("In registerCar(UriInfo info, CarDetailBean carDetailBean, String user)2");
Vehicle newvehicle = new Vehicle(carDetailBean.getCarId(), carDetailBean.getCarInfo());
System.out.println("In registerCar(UriInfo info, CarDetailBean carDetailBean, String user)3");
vehicleStore.addVehicle(newvehicle);
System.out.println("In registerCar(UriInfo info, CarDetailBean carDetailBean, String user)4");
JSONObject obj=new JSONObject();
try{
obj.put("Vehicles", listOfVehicles);
}catch(Exception je){
je.printStackTrace();
return Response.status(Status.EXPECTATION_FAILED).entity(je.getMessage()).type(MediaType.APPLICATION_JSON).build();
}
System.out.println("Exit getVehicles()");
return Response.status(Status.OK).entity(obj).type(MediaType.APPLICATION_JSON).build();
}
@Override
public Response placeCarOrder(UriInfo info, CarInfoBean carInfoBean, String user) {
System.out.println("In placeCarOrder(UriInfo info, CarInfoBean carInfoBean, String user)");
JSONObject obj=new JSONObject();
obj.put("CarOrder", carInfoBean);
return Response.status(Status.OK).entity(obj).type(MediaType.APPLICATION_JSON).build();
}
}
5. Теперь добавьте / создайте класс bean, который называется, Vehicle
как показано ниже:
package com.web.data;
import java.io.Serializable;
import org.codehaus.jackson.annotate.JsonIgnoreProperties;
import org.codehaus.jackson.annotate.JsonProperty;
import org.codehaus.jackson.annotate.JsonPropertyOrder;
@JsonPropertyOrder({"id", "VehicleName"})
@JsonIgnoreProperties(ignoreUnknown = true)
public class Vehicle implements Serializable{
private static final long serialVersionUID = -3501772243949297054L;
@JsonProperty("id")
private int id;
@JsonProperty("vehicleName")
private String vehicleName;
@JsonProperty("countryName")
private String countryName;
public Vehicle(){};
public Vehicle(int i, String vehicleName){
super();
this.id = i;
this.vehicleName = vehicleName;
}
public int getId(){
return id;
}
public void setId(int id) {
this.id = id;
}
public String getVehicleName() {
return vehicleName;
}
public void setVehicleName(String vehicleName) {
this.vehicleName = vehicleName;
}
public String getCountryName() {
return countryName;
}
public void setCountryName(String countryName) {
this.countryName = countryName;
}
}
6. Теперь создайте одноэлементный класс, как показано ниже:
package com.web.data;
import java.util.ArrayList;
import java.util.List;
public class VehicleStore {
static VehicleStore vehicleStore = null;
List<Vehicle> _listOfVehicles = null;
private VehicleStore() {
_listOfVehicles = createVehicleList();
}
public static VehicleStore getStoreInstance() {
if(vehicleStore == null) {
vehicleStore = new VehicleStore();
}
return vehicleStore;
}
public void addVehicle(Vehicle vehicle) {
_listOfVehicles.add(vehicle);
}
public List<Vehicle> getVehicleList(){
return _listOfVehicles;
}
public List<Vehicle> createVehicleList(){
System.out.println("Creating Vehicle List");
Vehicle suzukiVehicle=new Vehicle(1, "Swif");
Vehicle bmwVehicle=new Vehicle(4, "BMW");
Vehicle volvoVehicle=new Vehicle(3, "Volvo");
Vehicle jeepVehicle=new Vehicle(2, "Jeep");
List<Vehicle> listOfVehicles = new ArrayList<Vehicle>();
listOfVehicles.add(suzukiVehicle);
listOfVehicles.add(bmwVehicle);
listOfVehicles.add(volvoVehicle);
listOfVehicles.add(jeepVehicle);
return listOfVehicles;
}
}
7. Теперь создайте два класса обработчиков, как описано ниже:
(Сначала создайте пакет ‘com.web.cxf.in.handler’ и добавьте класс CxfInPutHandler
)
Класс обработчика играет очень важную роль. Они перехватчики. Первый предназначен для всех входящих запросов, а второй — для всех исходящих ответов. Во время тестирования просто проверьте журналы или установите точку останова, чтобы проверить, как она работает. Обработчик ввода сначала получает все вызовы веб-службы, а затем перенаправляет его на фактический веб-метод для вызова. Следовательно, вы можете использовать этот класс для любых целей аутентификации или любых других действий, которые, по вашему мнению, должны быть выполнены в первую очередь, т. Е. До того, как элемент управления достигнет фактического метода веб-службы.
package com.web.cxf.in.handler;
import javax.servlet.http.HttpServletRequest;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.transport.http.AbstractHTTPDestination;
public class CxfInPutHandler extends AbstractPhaseInterceptor<Message> {
public CxfInPutHandler(){
super(Phase.PRE_STREAM);
}
@Override
public void handleMessage(final Message message) throws Fault {
try {
System.out.println("In in handleMessage() ");
String user = "";//header param
String pid = "";//header param
String pathInfo = "";
if (message.getExchange().getInMessage() != null) {
if (message.getExchange().getInMessage().get(AbstractHTTPDestination.HTTP_REQUEST) != null) {
HttpServletRequest req = (HttpServletRequest) message.getExchange().getInMessage().get(AbstractHTTPDestination.HTTP_REQUEST);
user = req.getHeader("user");
pid = req.getHeader("pid");
pathInfo = req.getPathInfo();
}
} else {
System.out.println("Fail to get the http request ");
}
}catch(Exception e){
e.printStackTrace();
}
}
}
И ниже у нас есть out-handler. Все ответы веб-службы (перед возвратом к вызывающей стороне) попадут в эту службу. Подумайте, какую бизнес-логику вы хотели бы реализовать здесь.
package com.web.cxf.out.handler;
import javax.servlet.http.HttpServletRequest;
import org.apache.cxf.interceptor.Fault;
import org.apache.cxf.message.Message;
import org.apache.cxf.phase.AbstractPhaseInterceptor;
import org.apache.cxf.phase.Phase;
import org.apache.cxf.transport.http.AbstractHTTPDestination;
public class CxfOutPutHandler extends AbstractPhaseInterceptor<Message> {
public CxfOutPutHandler() {
super(Phase.PRE_STREAM);
}
@Override
public void handleMessage(final Message message) throws Fault {
System.out.println("In out handleMessage() ");
if (message.getExchange().getInMessage() != null) {
if (message.getExchange().getInMessage().get(AbstractHTTPDestination.HTTP_REQUEST) != null) {
HttpServletRequest req = (HttpServletRequest) message.getExchange().getInMessage().get(AbstractHTTPDestination.HTTP_REQUEST);
//origin = req.getHeader("Origin");
}
} else {
System.out.println("Fail to get the http request ");
}
}
}
Во время тестирования проверьте информацию журнала, чтобы понять, как элемент управления проходит через код. Смотрите ниже информацию журнала:
In handleMessage() (hit in handler interceptor before calling getVehicles)
In getVehicles()
Creating Vehicle List
Exit getVehicles()
In Out handleMessage() (finally hit out interceptor )
Теперь мы собираемся ввести один фильтр здесь. Элемент управления сначала ударит по фильтру, даже до обработчика ввода. Он работает так же, как обработчик.
Просто выполните предыдущие шаги и добавьте класс фильтра ниже:
package com.web.filter;
/*
* A filter is typically used to perform a particular piece of functionality
either before or after the primary functionality of a web application is
performed. As an example, if a request is made for a particular resource such
as a servlet and a filter is used, the filter code may execute and then pass
the user on to the servlet. As a further example, the filter might determine
that the user does not have permissions to access a particular servlet, and it might
send the user to an error page rather than to the requested resource.
*/
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
public class UserFilter implements Filter{
@Override
public void destroy() {
}
/*
* Here I am just setting a header field before control goes to the servlet.
* We can also authenticate a user here before re-directing to a servlet
*/
@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
System.out.println("Im in UserFilter");
HttpServletRequest req = (HttpServletRequest) request;
HeaderRequestWrapper requestWrapper = new HeaderRequestWrapper(req);
requestWrapper.addHeader("user", "Test1234");
chain.doFilter(requestWrapper, response);
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
public class HeaderRequestWrapper extends HttpServletRequestWrapper {
public HeaderRequestWrapper(HttpServletRequest request) {
super(request);
}
private Map<String, String> headerMap = new HashMap<String, String>();
public void addHeader(String name, String value) {
headerMap.put(name, value);
}
@Override
public String getHeader(String name) {
String headerValue = super.getHeader(name);
if (headerMap.containsKey(name)) {
headerValue = headerMap.get(name);
}
return headerValue;
}
}
}
Для фильтра вы должны добавить приведенное ниже определение в файл web.xml.
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.web.filter.UserFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
8. Теперь создайте файл определения Spring Bean ‘spring-beans.xml’, как показано ниже под WEB-INF.
<?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:cxf="http://cxf.apache.org/core"
xmlns:jaxrs="http://cxf.apache.org/jaxrs" xmlns:context="http://www.springframework.org/schema/context"
xmlns:cache="http://www.springframework.org/schema/cache" xmlns:p="http://www.springframework.org/schema/p"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://cxf.apache.org/jaxrs http://cxf.apache.org/schemas/jaxrs.xsd
http://cxf.apache.org/core http://cxf.apache.org/schemas/core.xsd
http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<jaxrs:server id="vehicleservice" address="/rest/example">
<jaxrs:serviceBeans>
<ref bean="vehicleController" />
</jaxrs:serviceBeans>
<jaxrs:providers>
<ref bean="jsonProvider" />
</jaxrs:providers>
</jaxrs:server>
<bean id="vehicleController" class="com.web.controller.impl.VehicleControllerImpl">
<description>
This Bean contains REST methods.
</description>
</bean>
<bean id="jsonProvider" class="org.codehaus.jackson.jaxrs.JacksonJsonProvider">
<description>
This Bean contains implementation to serilized json object.
</description>
</bean>
<bean id="cxfOutPutHandler" class="com.web.cxf.out.handler.CxfOutPutHandler">
<description>
This Bean implements Interceptor for all out going responses
</description>
</bean>
<bean id="cxfInputHandler" class="com.web.cxf.in.handler.CxfInPutHandler" >
<description>
This Bean implements Interceptor for all in coming request
</description>
</bean>
<cxf:bus>
<cxf:outInterceptors>
<ref bean="cxfOutPutHandler" />
</cxf:outInterceptors>
<cxf:inInterceptors>
<ref bean="cxfInputHandler" />
</cxf:inInterceptors>
</cxf:bus>
</beans>
9. Теперь поместите ссылку в файл веб-развертывания, web.xml.
Щелкните правой кнопкой мыши по проекту и перейдите в Инструменты Java EE и в подокне выберите «Создать заглушку дескриптора развертывания». Он сгенерирует файл web.xml и в этом файле после строки «</ welcome-file-list>» добавит строки ниже и сохранит файл.
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>CXFServlet</servlet-name>
<servlet-class>org.apache.cxf.transport.servlet.CXFServlet</servlet-class>
<init-param>
<param-name>disable-address-updates</param-name>
<param-value>true</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>CXFServlet</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/spring-beans.xml
</param-value>
</context-param>
<filter>
<filter-name>MyFilter</filter-name>
<filter-class>com.web.filter.UserFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Теперь вы готовы протестировать все вызовы веб-службы GET.
Вы можете использовать два подхода здесь. Один из них — создать пакет war или ear и развернуть его на своем веб-сервере. Второй подход заключается в том, чтобы просто щелкнуть правой кнопкой мыши по проекту и выбрать «Запуск от имени», а затем «Выполнить на сервере». Убедитесь, что вы уже добавили сервер в свой проект Eclipse. Если нет, посмотрите онлайн-материалы, чтобы узнать, как добавить сервер в Eclipse. Вы можете добавить Apache Tomcat или IBM Liberty для тестирования.
После успешного развертывания скопируйте и вставьте приведенный ниже URL-адрес в адресную строку любого браузера и просмотрите ответ:
http://host:port/RESTService1
Для меня ответом является: http://localhost:9080/RESTService1
Теперь вы можете увидеть следующий вывод в вашем браузере:
Теперь просто перейдите по указанному выше URL-адресу, чтобы увидеть все доступные в нем веб-службы:
<?xml version="1.0"?>
<application xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns="http://wadl.dev.java.net/2009/02">
<grammars />
<resources base="http://localhost:9080/RESTService1/rest/example">
<resource path="/v/vehicle">
<method name="GET">
<response>
<representation mediaType="application/json" />
</response>
</method>
<resource path="/orderlist/vehicle.json">
<method name="POST">
<request>
<representation mediaType="application/json" />
<param name="user" type="xs:string" />
</request>
<response>
<representation mediaType="application/json" />
</response>
</method>
</resource>
<resource path="/orders">
<method name="POST">
<request>
<representation mediaType="application/json" />
<param name="user" type="xs:string" />
</request>
<response>
<representation mediaType="application/json" />
</response>
</method>
</resource>
<resource path="/{id}">
<param name="id" type="xs:int" />
<method name="GET">
<request />
<response>
<representation mediaType="application/json" />
</response>
</method>
</resource>
<resource path="/{id}/vehicle/{zone}">
<param name="id" type="xs:int" />
<param name="zone" type="xs:string" />
<method name="GET">
<request>
<param name="user" type="xs:string" />
</request>
<response>
<representation mediaType="application/json" />
</response>
</method>
</resource>
<resource path="/{id}/{id2}">
<param name="id" type="xs:int" />
<param name="id2" type="xs:int" />
<method name="GET">
<request />
<response>
<representation mediaType="application/json" />
</response>
</method>
</resource>
</resource>
</resources>
</application>
Теперь давайте проверим все вызовы GET REST (закомментируйте обе веб-службы POST, чтобы избежать ошибки компиляции):
http://localhost:9080/RESTService1/rest/example/v/vehicle
В некоторых веб-браузерах это позволит вам загрузить файл JSON вместо отображения сообщения в самом браузере. Загрузите файл JSON и откройте его.
Проверьте REST каждого из этих файлов:
http://localhost:9080/RESTService1/rest/example/v/vehicle/1
(2, 3 и 4)
http://localhost:9080/RESTService1/rest/example/v/vehicle/1/3
(используйте другую комбинацию цифр от 1 до 4)
http://localhost:9080/RESTService1/rest/example/v/vehicle/1/car/India
Давайте попробуем наши сервисные вызовы POST REST
Во-первых, раскомментируйте первый метод POST и добавьте приведенный ниже компонент в ваш проект, включая пакеты.
(Если вы не знаете, как тестировать GET и POST по отдельности, сначала напишите весь код для вызовов GET и POST, скомпилируйте и протестируйте оба одновременно.)
package com.rest.car.bean;
import org.codehaus.jackson.annotate.JsonProperty;
public class CarDetailBean {
@JsonProperty("carId")
private int carId;
@JsonProperty("carInfo")
private String carInfo;
public int getCarId() {
return carId;
}
public void setCarId(int carId) {
this.carId = carId;
}
public String getCarInfo() {
return carInfo;
}
public void setCarInfo(String carInfo) {
this.carInfo = carInfo;
}
}
Теперь скомпилируйте код и разверните его на своем веб-сервере или щелкните правой кнопкой мыши по проекту и выберите «запустить как», затем «запустить на сервере» и выберите развернутый сервер из списка.
Для вызова веб-служб POST нельзя использовать браузер. Для этого теста лучше всего использовать инструмент SOAP UI или создать собственное клиентское приложение. Чтобы протестировать инструменты SOAP, перейдите к концу этого урока.
Теперь используйте приведенный ниже URL и тело сообщения JSON, чтобы протестировать первый вызов POST:
http://localhost:9080/RESTService1/rest/example/v/vehicle/orders
{
"carId": 5,
"carInfo": "Safary"
}
Вышеупомянутое тело JSON будет внедрено в класс bean, объявленный выше инфраструктурой JSON.
Давайте реализуем второй вызов POST и протестируем его.
Сначала добавьте все нижеуказанные компоненты в ваш проект. Это немного сложно. Причина использования этой сложной архитектуры состоит в том, чтобы помочь вам понять, как вы можете управлять различными сложными проектами в соответствии с вашими требованиями. Здесь, в каждом бине, я реализую список вместе с объектом. В первом бине, CarInfoBean, я использую один объект с именем CustomerRequestInfo
. Там будет более одного CustomerRequestInfo
, поэтому мы используем список для его хранения.
Теперь о втором бобе CustomerRequestInfo
. Здесь я также объявляю еще один вызов объекта OrderDetail
. Намерение очень ясно, так что вы можете даже разработать более сложные вызовы в соответствии с вашими требованиями.
package com.rest.car.bean;
import java.util.List;
import org.codehaus.jackson.annotate.JsonProperty;
public class CarInfoBean {
@JsonProperty("userId")
private String userId;
@JsonProperty("passWord")
private String passWord;
@JsonProperty("customerRequestInfo")
private List<CustomerRequestInfo> customerRequestInfo;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getPassWord() {
return passWord;
}
public void setPassWord(String passWord) {
this.passWord = passWord;
}
public List<CustomerRequestInfo> getCustomerRequestInfo() {
return customerRequestInfo;
}
public void setCustomerRequestInfo(List<CustomerRequestInfo> customerRequestInfo) {
this.customerRequestInfo = customerRequestInfo;
}
}
package com.rest.car.bean;
import java.util.List;
import org.codehaus.jackson.annotate.JsonProperty;
public class CustomerRequestInfo {
@JsonProperty("requestId")
private String requestId;
@JsonProperty("orderDetail")
private List<OrderDetail> orderDetail;
public String getRequestId() {
return requestId;
}
public void setRequestId(String requestId) {
this.requestId = requestId;
}
public List<OrderDetail> getOrderDetail() {
return orderDetail;
}
public void setOrderDetail(List<OrderDetail> orderDetail) {
this.orderDetail = orderDetail;
}
}
И, наконец, OrderDetail
боб:
package com.rest.car.bean;
import org.codehaus.jackson.annotate.JsonProperty;
public class OrderDetail {
@JsonProperty("carID")
private String carID;
@JsonProperty("carModule")
private String carModule;
@JsonProperty("carColor")
private String carColor;
@JsonProperty("customerComment")
private String customerComment;
public String getCarID() {
return carID;
}
public void setCarID(String carID) {
this.carID = carID;
}
public String getCarModule() {
return carModule;
}
public void setCarModule(String carModule) {
this.carModule = carModule;
}
public String getCarColor() {
return carColor;
}
public void setCarColor(String carColor) {
this.carColor = carColor;
}
public String getCustomerComment() {
return customerComment;
}
public void setCustomerComment(String customerComment) {
this.customerComment = customerComment;
}
}
Теперь используйте приведенный ниже URL и тело JSON для проверки этого вызова POST. Кроме того, внимательно посмотрите, как платформа внедряет значения в соответствующие поля.
HTTP: // локальный: 9080 / RESTService1 / отдых / пример / v / транспортное средство / Orderlist / vehicle.json
{
"userId" : "97912345",
"passWord":"Xlcb#11",
"customerRequestInfo":[
{
"requestId":"12345",
"orderDetail":[
{
"carID":"1",
"carModule":"IM3",
"carColor":"RED",
"customerComment":"Should be a right hand car"
},
{
"carID":"7",
"carModule":"BM3",
"carColor":"BLUE",
"customerComment":"Should be a Left hand car"
},
{
"carID":"5",
"carModule":"MM3",
"carColor":"PINK",
"customerComment":"Should be a Left hand car"
}
]
},
{
"requestId":"12346",
"orderDetail":[
{
"carID":"2",
"carModule":"XB1",
"carColor":"RED",
"customerComment":"Should be a right hand car"
},
{
"carID":"3",
"carModule":"XM3",
"carColor":"BLUE",
"customerComment":"Should be a Left hand car"
},
{
"carID":"4",
"carModule":"XX2",
"carColor":"PINK",
"customerComment":"Should be a Left hand car"
}
]
}
]
}
Мой совет — поиграться с кодом, чтобы вы могли лучше понять код. Попробуйте извлечь различные значения из carInfoBean
объекта и распечатать его.
1. Сначала загрузите SoapUI по указанному ниже URL-адресу и установите его на свой компьютер.
https://www.soapui.org/downloads/latest-release.html
2. Откройте приложение и в меню «Файл» выберите новый проект службы REST и в окне после вашего URL-адреса (первый пример вызова веб-службы GET):
И нажмите «ОК».
3. Теперь в окне проводника проекта дважды щелкните «Запрос1»:
И нажмите зеленую стрелку с левой стороны:
Если вам нужно установить некоторые параметры заголовка для вашего теста, вы можете сделать это, как я показал ниже:
Выберите заголовок:
Теперь нажмите на кнопку плюс:
Теперь добавьте ваш параметр заголовка, как показано ниже:
И нажмите кнопку «ОК».
Теперь вы можете видеть, что параметр заголовка ‘userId’ был добавлен в ваш проект, и вы можете добавлять значения к нему.