Статьи

Проект веб-службы RESTful в Java JAX-RS с использованием Spring и Apache CXF

Код можно скачать с моего репозитория GitHub .

Предпосылки для этого проекта:

  1. Знание Spring Framework .

  2. Знание JAX-RS .

  3. Структура сообщения JSON .

  4. Знание Затмения.

  5. Также скачайте 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’ был добавлен в ваш проект, и вы можете добавлять значения к нему.