package is.project3.rest; import java.util.ArrayList; import java.util.List; import javax.ws.rs.GET; import javax.ws.rs.POST; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.core.MediaType; @Path("/students") public class StudentsKeeper { //XXX: we have several threads... private static List<String> students = new ArrayList<>(); @POST public void addStudent(String student) { System.out.println("Called post addStudent with parameter: " + student); System.out.println("Thread = " + Thread.currentThread().getName()); students.add(student); } @GET @Produces(MediaType.APPLICATION_JSON) public List<String> getAllStudents() { System.out.println("Called getAllStudents"); System.out.println("Thread = " + Thread.currentThread().getName()); return students; } @Path("xpto") @GET @Produces(MediaType.APPLICATION_JSON) public String getAllStudents2() { System.out.println("Called getAllStudents 2"); System.out.println("Thread = " + Thread.currentThread().getName()); return "test"; } }
The server is surprisingly simple:
package is.project3.rest; import java.net.URI; import javax.ws.rs.core.UriBuilder; import org.glassfish.jersey.jdkhttp.JdkHttpServerFactory; import org.glassfish.jersey.server.ResourceConfig; public class MyRESTServer { private final static int port = 9998; private final static String host="http://localhost/"; public static void main(String[] args) { URI baseUri = UriBuilder.fromUri(host).port(port).build(); ResourceConfig config = new ResourceConfig(StudentsKeeper.class); JdkHttpServerFactory.createHttpServer(baseUri, config); } }
You just need to make it run and it will immediately be serving a REST web service on port 9998. More about this ahead. The troubling part was to get Maven right, considering that it had to transparently convert a List of Strings to JSON.
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>is</groupId> <artifactId>project3</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>project3</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>10</java.version> </properties> <dependencies> <!-- https://mvnrepository.com/artifact/junit/junit --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> <!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api --> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency> <!-- https://mvnrepository.com/artifact/com.sun.xml.bind/jaxb-core --> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-core</artifactId> <version>2.3.0.1</version> </dependency> <dependency> <groupId>com.sun.xml.bind</groupId> <artifactId>jaxb-impl</artifactId> <version>2.3.0.1</version> </dependency> <dependency> <groupId>javax.activation</groupId> <artifactId>activation</artifactId> <version>1.1.1</version> </dependency> <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.media/jersey-media-json-jackson --> <dependency> <groupId>org.glassfish.jersey.media</groupId> <artifactId>jersey-media-json-jackson</artifactId> <version>2.27</version> </dependency> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-grizzly2-http</artifactId> <version>2.27</version> </dependency> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-grizzly2-servlet</artifactId> <version>2.27</version> </dependency> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-jdk-http</artifactId> <version>2.27</version> </dependency> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-simple-http</artifactId> <version>2.27</version> </dependency> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-jetty-http</artifactId> <version>2.27</version> </dependency> <dependency> <groupId>org.glassfish.jersey.containers</groupId> <artifactId>jersey-container-jetty-servlet</artifactId> <version>2.27</version> </dependency> <!-- https://mvnrepository.com/artifact/org.glassfish.jersey.inject/jersey-hk2 --> <dependency> <groupId>org.glassfish.jersey.inject</groupId> <artifactId>jersey-hk2</artifactId> <version>2.27</version> </dependency> <!-- https://mvnrepository.com/artifact/javax.ws.rs/javax.ws.rs-api --> <dependency> <groupId>javax.ws.rs</groupId> <artifactId>javax.ws.rs-api</artifactId> <version>2.1.1</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.8.0</version> <configuration> <release>${java.version}</release> </configuration> </plugin> </plugins> </build> </project>
We can use curl to post new students and to get the results back. To post new students, we can do as follows on the command line with curl. If you don't have Curl in the command line you may just skip this step:
curl -d "Joao" -X POST http://localhost:9998/students
curl -d "Joana" -X POST http://localhost:9998/students
curl -X GET http://localhost:9998/students/
and the result is:
["Joao","Joana"]
Now, let's build a client that is able to do a post into and get from a service as well.
package is.project3.rest; import java.util.List; import javax.ws.rs.client.Client; import javax.ws.rs.client.ClientBuilder; import javax.ws.rs.client.Entity; import javax.ws.rs.client.Invocation; import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.MediaType; public class MyRESTClient { public static void main(String[] args) { Client client = ClientBuilder.newClient(); WebTarget webTarget = client.target("http://localhost:9998/students"); webTarget.request().post(Entity.entity("Jose", MediaType.TEXT_PLAIN)); Invocation.Builder invocationBuilder = webTarget.request(MediaType.APPLICATION_JSON); @SuppressWarnings("unchecked") List<String> response = invocationBuilder.get(List.class); response.forEach(System.out::println); } }
And we get our final result:
Joao
Joana
Jose
That's it!
No comments:
Post a Comment