JAX-RS Handling QueryString (@QueryParam,@DefaultValue,UriInfo)

This tutorial shows us how to capture Query parameters using @QueryParam and UriInfo and the role of @DefaultValue annotation.

Example Scenario :

We have a rest service which is like a car inventory and has cars of different models and years. For the sake of simplicity, let’s say it has only Honda cars. We want to retrieve one or more cars from the inventory based on different query parameters passed in the request URI.


Project artifacts:

1. Technologies used –

a. Eclipse IDE for Java EE developer 4.5.0.20150621-1200 (Mars)
b. Preinstalled Maven with Eclipse Mars
c. Tomcat 7.0.64
d. RESTEasy 3.0.4.Final
e. Java 1.8

Jars used –

javax.ws.rs-api-2.0.jar
resteasy-jaxrs-3.0.4.Final.jar
jaxrs-api-3.0.4.Final.jar
slf4j-simple-1.5.8.jar
slf4j-api-1.5.8.jar
scannotation-1.0.3.jar
javassist-3.12.1.GA.jar
jboss-annotations-api_1.1_spec-1.0.1.Final.jar
activation-1.1.jar
httpclient-4.2.1.jar
httpcore-4.2.1.jar
commons-logging-1.1.1.jar
commons-codec-1.6.jar
commons-io-2.1.jar
jcip-annotations-1.0.jar

2. Eclipse project folder structure:

JAX-RS QueryParamDirectory Struc

3. Web Project

Create a standard web project in Eclipse by following the below link.

Create a Maven Web Project

4. Maven Dependencies

file:pom.xml. Maven unit of work to declare project dependencies, compile code and build war file for deployment in Tomcat.

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.javanbeyond</groupId>
    <artifactId>WorkingWithQueryParam</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>Restful Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jaxrs</artifactId>
            <version>3.0.4.Final</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>WorkingWithQueryParam</finalName>
    </build>
</project>

 5. POJO

file: Car.java. A POJO which is stored as car in Car Inventory web service and data of which is sent to client based on request URI.

package com.javanbeyond.data;

// A simple POJO
public class Car {
  private int id;
  private String make;
  private String model;
  private String exteriorColor;
  private String interiorColor;
  private int year;

  public int getId() {
    return id;
  }

  public void setId(int id) {
    this.id = id;
  }

  public String getMake() {
    return make;
  }

  public void setMake(String make) {
    this.make = make;
  }

  public String getModel() {
    return model;
  }

  public void setModel(String model) {
    this.model = model;
  }

  public String getExteriorColor() {
    return exteriorColor;
  }

  public void setExteriorColor(String exteriorColor) {
    this.exteriorColor = exteriorColor;
  }

  public String getInteriorColor() {
    return interiorColor;
  }

  public void setInteriorColor(String interiorColor) {
    this.interiorColor = interiorColor;
  }

  public int getYear() {
    return year;
  }

  public void setYear(int year) {
    this.year = year;
  }

}

6. Application class

file: MyApplication.java. The Class that registers the resource class OrderReceiver with JAX-RS runtime. It has two sets.
Our resource class should be added to the singleton set.

package com.javanbeyond.service;

import javax.ws.rs.core.Application;
import java.util.HashSet;
import java.util.Set;

// regular application class
public class MyApplication extends Application {
  private Set<Object> singletons = new HashSet<Object>();
  private Set<Class<?>> empty = new HashSet<Class<?>>();

  public MyApplication() {
    singletons.add(new OrderReceiver());
  }

  @Override
  public Set<Class<?>> getClasses() {
    return empty;
  }

  @Override
  public Set<Object> getSingletons() {
    return singletons;
  }
}

7. Resource class

file: OrderReceiver.java . In JAX-RS, we use @QueryParam annotation to capture information provided in the query string of URI and pass it to methods as parameters. The “/cars/{make}” @Path value  before the class, brings the URI “http://localhost:8080/rest/cars/honda” to this class. {make} is mapped to “honda”. The part after this decides which method will be called at runtime.

If you need more information about query string, please refer Http Query String.

Case 1: Getting Query Strings with @QueryParam

The method getCarByQueryParam receives the URI  “/cars/honda/getCarByQueryParam?model=civic&year=1991″ with the values of queries, model and year mapped  to the same name parameters of the method by @QueryParam. The method returns a car with model as Civic and year as 1991.

// Request match : /cars/honda/getCarByQueryParam?model=civic&year=1991
  // Needed a car with year as 1991 and model as civic. Simple query parameter
  // matching
  @GET
  @Path("getCarByQueryParam")
  @Produces(MediaType.APPLICATION_XML)
  public StreamingOutput getCarByQueryParam(@QueryParam("model"String model,
      @QueryParam("year"int year) {
    System.out.println("in getCarByQueryParam");
    for (Entry<Integer, Car> carEntry : carInventory.entrySet()) {
      final Car car = carEntry.getValue();
      if (car.getModel().equalsIgnoreCase(model)
          && car.getYear() == year) {
        return new StreamingOutput() {
          public void write(OutputStream outputStream)
              throws IOException, WebApplicationException {
            outputRequestedItem(outputStream, car);
          }
        };
      }
    }
    return null;

  }

Case 2 : Query String from UriInfo

In the method getCarByQueryInfo , query strings are extracted using UriInfo class which is injected by @Context annotation. This method tackles URI “/cars/honda/getCarByQueryInfo?model=civic&year=1991″  and returns a car with model as Civic and year as 1991.

// Request match : /cars/honda/getCarByQueryInfo?model=civic&year=1991
  // Using UriInfo

  @GET
  @Path("getCarByQueryInfo")
  @Produces(MediaType.APPLICATION_XML)
  public StreamingOutput getCarByQueryInfo(@Context UriInfo uriInfo) {
    System.out.println("in getCarByQueryInfo");
    int year = Integer
        .valueOf(uriInfo.getQueryParameters().getFirst("year"));
    String model = uriInfo.getQueryParameters().getFirst("model");
    for (Entry<Integer, Car> carEntry : carInventory.entrySet()) {
      final Car car = carEntry.getValue();
      if (car.getModel().equalsIgnoreCase(model)
          && car.getYear() == year) {
        return new StreamingOutput() {
          public void write(OutputStream outputStream)
              throws IOException, WebApplicationException {
            outputRequestedItem(outputStream, car);
          }
        };
      }
    }
    return null;

  }

Case 3: Missing query string and @DefaultValue annotation

When the URI “/cars/honda/getCarByDefaultValue?color=white” hits the service, the missing query string ‘year’ is given a default value 2000 provided by @DefaultValue annotation. This annotation helps resolving optional query parameters. Please note that default value provided will be used only if the value is missing.In the below case, though default value is provided for both the parameters, only missing ‘year’ query parameter will be given a default value.

// Request match : /cars/honda/getCarByDefaultValue?color=white
  // Using @Default annotation

  @GET
  @Path("getCarByDefaultValue")
  @Produces(MediaType.APPLICATION_XML)
  public StreamingOutput getCarByDefaultValue(
      @DefaultValue("2000"@QueryParam("year"int year,
      @DefaultValue("white"@QueryParam("color"String color) {
    System.out.println("in getCarByDefaultValue");
    for (Entry<Integer, Car> carEntry : carInventory.entrySet()) {
      final Car car = carEntry.getValue();
      if (car.getInteriorColor().equalsIgnoreCase(color)
          && car.getYear() == year) {
        return new StreamingOutput() {
          public void write(OutputStream outputStream)
              throws IOException, WebApplicationException {
            outputRequestedItem(outputStream, car);
          }
        };
      }
    }
    return null;

  }

8. Deployment descriptor

file: web.xml . Deployment descriptor file for mapping URIs to servlet. Application class is registered by setting as init param to the servlet.

<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_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
    <display-name>Archetype Created Web Application</display-name>
    <context-param>
        <param-name>resteasy.servlet.mapping.prefix</param-name>
        <param-value>/rest</param-value>
    </context-param>
    <servlet>
        <servlet-name>rest</servlet-name>
        <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.javanbeyond.service.MyApplication</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>rest</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>client.html</welcome-file>
    </welcome-file-list>
</web-app>

 

Example Execution:

1. Deploy the application in Tomcat.

2. Open your favorite browser and type the url – “http://localhost:8080/WorkingWithQueryParam/rest/cars/honda/getCarByQueryParam?model=civic&year=1991” and press Enter. You will get an XML response of a car of Civic model and year 1991.

JAX-RS Query Parameter Response

3. Type the url  “http://localhost:8080/WorkingWithQueryParam/rest/cars/honda/getCarByQueryInfo?model=civic&year=1991” and press enter. You will get the below response:

JAX-RS UriInfo REST

4. Type the url “http://localhost:8080/WorkingWithQueryParam/rest/cars/honda/getCarByDefaultValue?color=white” and press Enter.

JAX-RS DefaultValue Example

 

Create a Maven Web Project

In this tutorial, we will learn about creating a simple Maven web project using Eclipse and Command line.

Using Eclipse:

Technologies used –

a. Eclipse IDE for Java EE developer 4.5.0.20150621-1200 (Mars)
b. Preinstalled Maven with Eclipse Mars
c. Java 1.8

Steps:

1. Go to File > New > Maven Project

CreateMavenProject-1

2. Click on Next

3. Choose the artifact as shown below:

CreateMavenProject-2

4. Fill out the details of group id and artifact id. Values in the snapshot are just samples. You can fill out values of your choice.

CreateMavenProject-4

5. Click on Finish.

A maven based web project is ready now.

CreateMavenProject-5


Using command line in Mac:

Technologies used –
a.  Apache maven 3.3.3
b. Java 1.8

Steps:

  1. Download maven from Maven 3.3.3
  2. Unzip the folder in your favorite directory.
  3. In your Home directory, open the file .bash_profile.
  4. Make the following entry :
export M2_HOME=~/Development/apache-maven-3.3.3
export PATH=$PATH:$M2_HOME/bin
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home

Note: Please note that ~(tilde) used is my home directory since I downloaded maven in my home directory. Also, version of java used may be different for you and so is your java installation directory. Please make changes accordingly.

    5.  Open command line and type the below command.

mvn archetype:generate -DarchetypeGroupId=org.apache.maven.archetypes  -DarchetypeArtifactId=maven-archetype-webapp  -DarchetypeVersion=1.0 -DgroupId=com.javanbeyond -DartifactId=QuickCrashCourse  -Dversion=1.0-SNAPSHOT -DinteractiveMode=false

Please make sure your current directory should be the directory where you want your project to be created.

6. Press Enter and wait for the process to complete.

7. A folder with the name of your artifact Id should get created. Folder structure inside QuickCrashCourse folder.

./pom.xml
./src
./src/main
./src/main/resources
./src/main/webapp
./src/main/webapp/index.jsp
./src/main/webapp/WEB-INF
./src/main/webapp/WEB-INF/web.xml

A Quick Overview on REST (JAX-RS) webservice

This tutorial uses RESTEasy, a popular JAX-RS implementation to give a brief introduction of a REST aware web service using Maven.

Example Scenario:

Let’s say we have to build a shopping cart as REST web service. In this shopping cart, we should be able to add an item, update an item, delete an item or just retrieve the item. We would be doing these operations by hitting the web service with a client on different http methods and accordingly, get a response.


Project artifacts:

1. Technologies used –

a. Eclipse IDE for Java EE developer 4.5.0.20150621-1200 (Mars)
b. Preinstalled Maven with Eclipse Mars
c. Tomcat 7.0.64
d. RESTEasy 3.0.4.Final
e. Java 1.8

Jars used –

junit-3.8.1.jar
javax.ws.rs-api-2.0.jar
resteasy-jaxrs-3.0.4.Final.jar
jaxrs-api-3.0.4.Final.jar
slf4j-simple-1.5.8.jar
slf4j-api-1.5.8.jar
scannotation-1.0.3.jar
javassist-3.12.1.GA.jar
jboss-annotations-api_1.1_spec-1.0.1.Final.jar
activation-1.1.jar
httpclient-4.2.1.jar
httpcore-4.2.1.jar
commons-logging-1.1.1.jar
commons-codec-1.6.jar
commons-io-2.1.jar
jcip-annotations-1.0.jar

2. Eclipse project folder structure:

Maven Web application directory structure

3. Web Project

Create a standard web project in Eclipse by following the below link.

Create a Maven Web Project

4. Maven Dependencies

file:pom.xml. Maven unit of work to declare project dependencies, compile code and build war file for deployment in Tomcat.

<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/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.javanbeyond</groupId>
    <artifactId>QuickCrashCourseREST</artifactId>
    <packaging>war</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <name>Restful Maven Webapp</name>
    <url>http://maven.apache.org</url>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>3.8.1</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>javax.ws.rs</groupId>
            <artifactId>javax.ws.rs-api</artifactId>
            <version>2.0</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.resteasy</groupId>
            <artifactId>resteasy-jaxrs</artifactId>
            <version>3.0.4.Final</version>
        </dependency>
    </dependencies>
    <build>
        <finalName>QuickCrashCourseREST</finalName>
    </build>
</project>

5. POJO

file: ShoppingItem.java. A POJO which the incoming request from client to web service will be converted to and stored.

package com.javanbeyond.data;

// A normal POJO
public class ShoppingItem {
  private int id;
  private String name;
  private String price;
  private String quantity;

  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 String getPrice() {
    return price;
  }

  public void setPrice(String price) {
    this.price = price;
  }

  public String getQuantity() {
    return quantity;
  }

  public void setQuantity(String quantity) {
    this.quantity = quantity;
  }
}

6. Application class

file: MyApplication.java. The Class that registers the resource class OrderReceiver with JAX-RS runtime. It has two sets.
Our resource class should be added to the singleton set.

package com.javanbeyond.service;

import javax.ws.rs.core.Application;
import java.util.HashSet;
import java.util.Set;
// Application class to register our resource class Order Receiver
public class MyApplication extends Application {
   private Set<Object> singletons = new HashSet<Object>();
   private Set<Class<?>> empty = new HashSet<Class<?>>();
   public MyApplication() {
     // Registers resource class as singletons. The 
     // annotations present in this class will be resolved at Runtime 
      singletons.add(new OrderReceiver());
   }
   @Override
   public Set<Class<?>> getClasses() {
      return empty;
   }
   @Override
   public Set<Object> getSingletons() {
      return singletons;
   }
}

7. Resource class

file: OrderReceiver.java . Resource class that contains the actual business logic and Http method related JAX-RS annotations. It is called by JAX-RS implementation at runtime based on request URI.

package com.javanbeyond.service;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintStream;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicInteger;

import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.StreamingOutput;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

import com.javanbeyond.data.ShoppingItem;

// Our actual resource class
// if url contains the below pattern, this class will be initialized and its
// methods are called.
@Path("/orders")
public class OrderReceiver {
  private Map<Integer, ShoppingItem> shoppingCart = new ConcurrentHashMap<Integer, ShoppingItem>();
  private AtomicInteger idCounter = new AtomicInteger();

  public OrderReceiver() {
  }

  // This maps to http post request. Its used to add a new item
  @POST
  // Defines the content type it can accept
  @Consumes(MediaType.APPLICATION_XML)
  public Response addItem(InputStream is) {
    final ShoppingItem item = readRequest(is);
    item.setId(idCounter.incrementAndGet());
    shoppingCart.put(item.getId(), item);
    System.out.println("Created cart item " + item.getId());
    // returns a status code of 200 with the below message
    return Response.status(200)
        .entity("item with id " + item.getId() " created").build();
  }

  // This maps to http get request. Its used to get an item
  @GET
  // it recognizes a pattern like orders/2 where the value 2 is given to
  // id and passed as an argument to the method
  @Path("{id}")
  // Defines the content type it returns
  @Produces(MediaType.APPLICATION_XML)
  public StreamingOutput getItem(@PathParam("id"int id) {
    final ShoppingItem item = shoppingCart.get(id);
    if (item == null) {
      // Writing response in case of incorrect input
      return new StreamingOutput() {
        public void write(OutputStream outputStream)
            throws IOException, WebApplicationException {
          PrintStream writer = new PrintStream(outputStream);
          writer.println(
              "<item>" + Response.Status.NOT_FOUND + "</item>");
        }
      };
    }
    System.out.println("Getting cart item " + item.getId());
    // Writing response
    return new StreamingOutput() {
      public void write(OutputStream outputStream)
          throws IOException, WebApplicationException {
        outputRequestedItem(outputStream, item);
      }
    };
  }

  // This maps to http put request. Its used to update an item
  @PUT
  @Path("{id}")
  @Consumes(MediaType.APPLICATION_XML)
  public Response updateItem(@PathParam("id"int id, InputStream is) {
    ShoppingItem itemToUpdate = readRequest(is);
    final ShoppingItem currentItem = shoppingCart.get(id);
    if (currentItem == null)
      return Response.status(200)
          .entity("<item>" + Response.Status.NOT_FOUND + "</item>")
          .build();
    System.out.println("Updating cart item " + currentItem.getId());
    currentItem.setName(itemToUpdate.getName());
    currentItem.setPrice(itemToUpdate.getPrice());
    currentItem.setQuantity(itemToUpdate.getQuantity());
    return Response.status(200)
        .entity("item with id " + currentItem.getId() " updated")
        .build();

  }

  // This maps to http delete request. It is used to delete an item
  @DELETE
  @Path("{id}")
  @Consumes(MediaType.APPLICATION_XML)
  public StreamingOutput deleteItem(@PathParam("id"int id, InputStream is) {
    final ShoppingItem currentItem = shoppingCart.get(id);
    if (currentItem == null)
      return new StreamingOutput() {
        public void write(OutputStream outputStream)
            throws IOException, WebApplicationException {
          PrintStream writer = new PrintStream(outputStream);
          writer.println(
              "<item>" + Response.Status.NOT_FOUND + "</item>");
        }
      };
    else {
      shoppingCart.remove(currentItem.getId());
      System.out.println("Removed cart item " + currentItem.getId());
    }
    return new StreamingOutput() {
      public void write(OutputStream outputStream)
          throws IOException, WebApplicationException {
        outputRequestedItem(outputStream, currentItem);
      }
    };
  }

  protected void outputRequestedItem(OutputStream os, ShoppingItem item)
      throws IOException {
    PrintStream writer = new PrintStream(os);
    writer.println("<item id=\"" + item.getId() "\">");
    writer.println("   <name>" + item.getName() "</name>");
    writer.println("   <price>" + item.getPrice() "</price>");
    writer.println("   <quantity>" + item.getQuantity() "</quantity>");
    writer.println("</item>");
  }

  // utility method to convert input stream to java object
  protected ShoppingItem readRequest(InputStream is) {
    try {
      DocumentBuilder builder = DocumentBuilderFactory.newInstance()
          .newDocumentBuilder();
      Document doc = builder.parse(is);
      Element root = doc.getDocumentElement();
      ShoppingItem item = new ShoppingItem();
      if (root.getAttribute("id"!= null
          && !root.getAttribute("id").trim().equals(""))
        item.setId(Integer.valueOf(root.getAttribute("id")));
      NodeList nodes = root.getChildNodes();
      ;
      for (int i = 0; i < nodes.getLength(); i++) {
        Node element = (Nodenodes.item(i);
        if (element.getNodeName().equals("name")) {
          item.setName(element.getTextContent());
        else if (element.getNodeName().equals("price")) {
          item.setPrice(element.getTextContent());
        else if (element.getNodeName().equals("quantity")) {
          item.setQuantity(element.getTextContent());
        }
      }
      return item;
    catch (Exception e) {
      e.printStackTrace(System.out);
      throw new WebApplicationException(e, Response.Status.BAD_REQUEST);
    }
  }
}

8. Deployment descriptor

file: web.xml . Deployment descriptor file for mapping URIs to servlet. Application class is registered by setting as init param to the servlet.

<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_3_0.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
    <display-name>Archetype Created Web Application</display-name>
    <context-param>
        <param-name>resteasy.servlet.mapping.prefix</param-name>
        <param-value>/rest</param-value>
    </context-param>
    <servlet>
        <servlet-name>rest</servlet-name>
        <servlet-class>org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher</servlet-class>
        <!-- Registers the Application class to JAX-RS runtime -->
        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>com.javanbeyond.service.MyApplication</param-value>
        </init-param>
    </servlet>
    <servlet-mapping>
        <servlet-name>rest</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>
    <welcome-file-list>
        <welcome-file>client.html</welcome-file>
    </welcome-file-list>
</web-app>

 


Example Execution:

  1. Deploy the application in Tomcat and type http://localhost:8080/QuickCrashCourseREST/ in browser.
  2. You should get a client.html like below. This is the client to interact with our web service. Each button corresponds to an Http method.

RESTful webservice client

3. Click on POST button to add an item to cart.

RESTful webservice client POST request

4. Get the created item by clicking GET and providing the id in the url.

RESTful webservice client GET request

5. Update the item by making quantity as 5 and clicking PUT button.

RESTful webservice client PUT request

6. Now, delete the item from cart by clicking on DELETE button and providing the id in the url. The deleted item will be the response. We can see the response as updated value from PUT request.

RESful webservice client DELETE request

Back to Top