Preface What this book covers What you need for this book Who this book is for Conventions Reader feedback Customer support Downloading the example code Errata Piracy Questions Introducing the REST Architectural Style The REST architectural style Introducing HTTP HTTP versions Understanding the HTTP request-response model Uniform resource identifier Understating the HTTP request methods Representing content types using HTTP header fields HTTP status codes The evolution of RESTful web services The core architectural elements of a RESTful system Data elements Resources URI The representation of resources Generic interaction semantics for REST resources The HTTP GET method The HTTP POST method The HTTP PUT method The HTTP DELETE method Hypermedia as the Engine of Application State Connectors Components The description and discovery of RESTful web services Java tools and frameworks for building RESTful web services Summary Java APIs for JSON Processing A brief overview of JSON Understanding the JSON data syntax Basic data types available with JSON Sample JSON file representing employee objects Processing JSON data Using JSR 353 – Java API for processing JSON Processing JSON with JSR 353 object model APIs Generating the object model from the JSON representation JSON value types Generating the JSON representation from the object model Processing JSON with JSR 353 streaming APIs Using streaming APIs to parse JSON data Using streaming APIs to generate JSON Using the Jackson API for processing JSON Processing JSON with Jackson tree model APIs Using Jackson tree model APIs to query and update data Processing JSON with Jackson data binding APIs Simple Jackson data binding with generalized objects Full Jackson data binding with specialized objects Processing JSON with Jackson streaming APIs Using Jackson streaming APIs to parse JSON data Using Jackson streaming APIs to generate JSON Using the Gson API for processing JSON Processing JSON with object model APIs in Gson Generating the object model from the JSON representation Generating the parameterized Java collection from the JSON representation Generating the JSON representation from the object model Processing JSON with Gson streaming APIs Reading JSON data with Gson streaming APIs Writing JSON data with Gson streaming APIs Java EE 8 enhancements for processing JSON Using the JSR 374 – Java API for JSON Processing 1.1 Understanding the JSON Pointer Processing JSON using JSON Pointer Understanding the JSON Patch Processing JSON using JSON Patch Using the JSR 367 – Java API for JSON Binding Processing JSON using JSON-B Summary Introducing the JAX-RS API An overview of JAX-RS JAX-RS annotations Specifying the dependency of the JAX-RS API Using JAX-RS annotations to build RESTful web services Annotations for defining a RESTful resource @Path Annotations for specifying request-response media types @Produces @Consumes Annotations for processing HTTP request methods @GET @PUT @POST @DELETE @HEAD @OPTIONS Annotations for accessing request parameters @PathParam @QueryParam @MatrixParam @HeaderParam @CookieParam @FormParam @DefaultValue @Context @BeanParam @Encoded Annotation inheritance Returning additional metadata with responses Understanding data binding rules in JAX-RS Mapping the path variable with Java types Mapping the request and response entity body with Java types Using JAXB to manage the mapping of the request and response entity body to Java objects Building your first RESTful web service with JAX-RS Setting up the environment Building a simple RESTful web service application using the NetBeans IDE Adding CRUD operations on the REST resource class Client APIs for accessing RESTful web services Specifying a dependency of the JAX-RS client API Calling REST APIs using the JAX-RS client Simplified client APIs for accessing REST APIs Summary Advanced Features in the JAX-RS APIs Understanding subresources and subresource locators in JAX-RS Subresources in JAX-RS Subresource locators in JAX-RS Dynamic dispatching Request matching JAX-RS response builder explained Exception handling in JAX-RS Reporting errors using ResponseBuilder Reporting errors using WebApplicationException Reporting errors using application exceptions Mapping exceptions to a response message using ExceptionMapper Introducing validations in JAX-RS applications A brief introduction to Bean Validation Building custom validation constraints What happens when Bean Validation fails in a JAX-RS application? Supporting custom request-response message formats Building custom entity provider Marshaling Java objects to the CSV representation with MessageBodyWriter Marshaling CSV representation to Java objects with MessageBodyReader Asynchronous RESTful web services Asynchronous RESTful web service client Server-sent events Managing an HTTP cache in a RESTful web service Using the Expires header to control the validity of the HTTP cache Using Cache-Control directives to manage the HTTP cache Conditional request processing with the Last-Modified HTTP response header Conditional request processing with the ETag HTTP response header Conditional data update in RESTful web services Understanding filters and interceptors in JAX-RS Modifying request and response parameters with JAX-RS filters Implementing server-side request message filters Postmatching server-side request message filters Prematching server-side request message filters Implementing server-side response message filters Implementing client-side request message filters Implementing client-side response message filters Modifying request and response message bodies with JAX-RS interceptors Implementing request message body interceptors Implementing response message body interceptors Managing the order of execution for filters and interceptors Selectively applying filters and interceptors on REST resources by using @NameBinding Dynamically applying filters and interceptors on REST resources using DynamicFeature Understanding the JAX-RS resource life cycle Summary Introducing JAX-RS Implementation Framework Extensions Jersey framework extensions Dynamically configuring JAX-RS resources during deployment A quick look at the static resource configurations Modifying JAX-RS resources during deployment using ModelProcessor What is the Jersey model processor and how it works? A brief look at the ModelProcessor interface Building Hypermedia As The Engine Of Application State (HATEOAS) APIs Programmatically building entity body links using JAX-RS APIs Programmatically building header links using JAX-RS APIs Declaratively building links using Jersey annotations Specifying the dependency to use Jersey declarative linking Enabling the Jersey declarative linking feature for the application Declaratively adding links to the resource representation Grouping multiple links using @InjectLinks Declaratively building HTTP link headers using @InjectLinks Reading and writing large binary objects using Jersey APIs Building RESTful web services for storing images Building RESTful web service for reading images Generating a chunked output using Jersey APIs Jersey client API for reading chunked input Supporting server-sent events in RESTful web services Understanding the Jersey server-side configuration properties Monitoring RESTful web services using Jersey APIs RESTEasy framework extensions Caching using RESTEasy Cache-control annotations Client-side caching GZIP compression/decompression Multipart content handling Summary Securing RESTful Web Services Securing and authenticating web services HTTP basic authentication Building JAX-RS clients with basic authentication Securing JAX-RS services with basic authentication Configuring the basic authentication Defining groups and users in the GlassFish server HTTP digest authentication JWT authentication JSON Web Token (JWT) overview Using JWT to secure RESTful services Securing RESTful web services with OAuth Understanding the OAuth 1.0 protocol Building the OAuth 1.0 client using Jersey APIs Understanding the OAuth 2.0 protocol Understanding the grant types in OAuth 2.0 Building the OAuth 2.0 client using Jersey APIs Authorizing the RESTful web service accesses via the security APIs Using SecurityContext APIs to control access Using the javax.annotation.security annotations to control access Using Jersey's role-based entity data filtering Input validation Key considerations for securing RESTful services Summary Description and Discovery of RESTful Web Services The need for an interface contract Web Application Description Language Overview of the WADL structure Generating WADL from JAX-RS Generating a Java client from WADL Market adoption of WADL RESTful API Modeling Language Overview of the RAML structure Generating RAML from JAX-RS Generating RAML from JAX-RS via CLI Generating JAX-RS from RAML Generating JAX-RS from RAML via CLI A glance at the market adoption of RAML Swagger A quick overview of the Swagger structure An overview of Swagger APIs Generating Swagger from JAX-RS Specifying dependency to Swagger Configuring the Swagger definition Adding a Swagger annotation on a JAX-RS resource class Generating a Java client from Swagger A glance at the market adoption of Swagger Revisiting the features offered in WADL, RAML, and Swagger Summary RESTful API Design Guidelines Designing RESTful web APIs Identifying resources in a problem domain Transforming operations to HTTP methods Understanding the difference between PUT and POST Naming RESTful web resources Using HATEOAS in response representation Hypertext Application Language RFC 5988 - web linking Fine-grained and coarse-grained resource APIs Using header parameters for content negotiation Multilingual RESTful web API resources Representing date and time in RESTful web resources Implementing partial response Implementing partial update Returning modified resources to the caller Paging a resource collection Implementing search and sort operations Versioning RESTful web APIs Including the version in the resource URI – URI versioning Including the version in a custom HTTP request header – HTTP header versioning Including the version in the HTTP Accept header – media type versioning Hybrid approach for versioning APIs Caching RESTful web API results HTTP Cache-Control directive HTTP conditional requests Using HTTP status codes in RESTful web APIs Overriding HTTP methods Documenting RESTful web APIs Asynchronous execution of RESTful web APIs Microservice architecture style for RESTful web application A quick recap Summary The Role of RESTful APIs in Emerging Technologies Cloud services Cloud characteristics Cloud offering models RESTful API Role in cloud services Provisioning IT resources using RESTful APIs Locating the REST API endpoint Generating an authentication cookie Provisioning a virtual machine instance Internet of things IoT platform IoT benefits RESTful API role in the IoT Modern web applications Single-page applications RESTFul API role in single-page applications Social media Social media platforms Social media benefits RESTful API role in social media Using Open Data Protocol with RESTful web APIs A quick look at OData URI convention for OData-based REST APIs Reading resources Querying data Modifying data Relationship operations Summary Useful Features and Techniques Tools for building a JAX-RS application Integration testing of JAX-RS resources with Arquillian Adding Arquillian dependencies to the Maven-based project Configuring the container for running the tests Adding Arquillian test classes to the project Running Arquillian tests Using third-party entity provider frameworks with Jersey Transforming the JPA model into OData-enabled RESTful web services Packaging and deploying JAX-RS applications Packaging JAX-RS applications with an Application subclass Packaging the JAX-RS applications with web.xml and an Application subclass Configuring web.xml for a servlet 2.x container Configuring web.xml for a servlet 3.x container Packaging the JAX-RS applications with web.xml and without an Application subclass Configuring web.xml for the servlet 2.x container Configuring web.xml for the servlet 3.x container Summary