In this article we will check out how query a REST Service running with Quarkus with a minimal Ajax and jQuery client.
Quarkus applications can be quickly bootstrapped using the Maven or Gradle plugin available. The plugin will generate a minimal project structure with a sample REST Endpoint and the Quarkus’s Maven dependencies included in the configuration file. Let’s assume you are using Maven:
mvn io.quarkus:quarkus-maven-plugin:0.16.1:create -DprojectGroupId=com.sample -DprojectArtifactId=hello-quarkus -DclassName="com.sample.DemoEndpoint" -Dpath="/persons"
Within our DemoEndpoint class, let’s add methods to perform CRUD Operations:
import javax.enterprise.context.ApplicationScoped; import javax.inject.Inject; import javax.ws.rs.*; import javax.ws.rs.core.Response; import java.util.List; @Path("persons") @ApplicationScoped @Produces("application/json") @Consumes("application/json") public class DemoEndpoint { @Inject DemoRepository demoRepository; @GET public List<Person> getAll() { return demoRepository.findAll(); } @POST public Response create(Person p) { demoRepository.createPerson(p); return Response.status(201).build(); } @PUT public Response update(Person p) { demoRepository.updatePerson(p); return Response.status(204).build(); } @DELETE public Response delete(@QueryParam("id") Integer id) { demoRepository.deletePerson(id); return Response.status(204).build(); } }
The Repository class uses a plain memory structure to store your objects:
package com.packt.quarkus.chapter4; import javax.enterprise.context.ApplicationScoped; import java.util.ArrayList; import java.util.List; @ApplicationScoped public class DemoRepository { List<Person> list = new ArrayList(); int counter; public int getNextCustomerId() { return counter++; } public List<Person> findAll() { return list; } public Person findPersonById(Integer id) { for (Person c: list) { if (c.getId().equals(id)) { return c; } } throw new RuntimeException("Person not found!"); } public void updatePerson(Person person) { Person personToUpdate = findPersonById(person.getId()); personToUpdate.setName(person.getName()); personToUpdate.setSurname(person.getSurname()); } public void createPerson(Person person) { person.setId(getNextCustomerId()); findAll().add(person); } public void deletePerson(Integer id) { Person c = findPersonById(id); findAll().remove(c); } }
Then, here is the POJO Class named Person:
public class Person { private Integer id; private String name; private String surname; @Override public String toString() { return "Person{" + "id='" + id + '\'' + ", name='" + name + '\'' + ", surname='" + surname + '\'' + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } }
Done with the server side. Now let’s add an index.hml page to display the List of Person in an HTML Table:
<html> <head> <!-- little bit of css to beutify the table --> <link rel="stylesheet" type="text/css" href="stylesheet.css" media="screen" /> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script> <script type="text/javascript"> $(document).ready(function () { $.getJSON("http://localhost:8080/persons", function (json) { var tr; for (var i = 0; i < json.length; i++) { tr = $('<tr/>'); tr.append("<td>" + json[i].id + "</td>"); tr.append("<td>" + json[i].name + "</td>"); tr.append("<td>" + json[i].surname + "</td>"); $('table').append(tr); } }); }); </script> </head> <body> <div align="left" style="margin-top: 10%;"> <fieldset style="border: none;"> <legend><strong>Users List</strong></legend> <!-- table to show data --> <table class="greyGridTable"> <thead> <tr> <th>ID</th> <th>Name</th> <th>Surname</th> </tr> </thead> <tbody> </tbody> </table> </fieldset> </div> </body> </html>
Some CSS style has been included in the file stylesheet.css:
table.greyGridTable { border: 2px solid #FFFFFF; width: 100%; text-align: center; border-collapse: collapse; } table.greyGridTable td, table.greyGridTable th { border: 1px solid #FFFFFF; padding: 3px 4px; } table.greyGridTable tbody td { font-size: 13px; } table.greyGridTable td:nth-child(even) { background: #EBEBEB; } table.greyGridTable thead { background: #FFFFFF; border-bottom: 4px solid #333333; } table.greyGridTable thead th { font-size: 15px; font-weight: bold; color: #333333; text-align: center; border-left: 2px solid #333333; } table.greyGridTable thead th:first-child { border-left: none; } table.greyGridTable tfoot td { font-size: 14px; }
That’s all. Make sure the following dependencies are included in your pom.xml file:
<dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-resteasy-jsonb</artifactId> </dependency> <dependency> <groupId>io.quarkus</groupId> <artifactId>quarkus-resteasy</artifactId> </dependency>
Run the application with
$ mvn compile quarkus:dev
Now we can try adding some data with cURL:
$ curl -d '{"name":"john", "surname":"black"}' -H "Content-Type: application/json" -X POST http://127.0.0.1:8080/persons $ curl -d '{"name":"victor", "surname":"frankenstein"}' -H "Content-Type: application/json" -X POST http://127.0.0.1:8080/persons
Let’s surf to localhost:8080 to check that Data is listed in our table:
Great. We could see how easily JSON data can be parsed with some help from jQuery and Ajax!