tags | projects | |||||
---|---|---|---|---|---|---|
|
|
This guide walks you through the process of creating an application that consumes a RESTful web service.
You’ll build an application that uses Spring’s RestTemplate
to retrieve a random Spring Boot quotation at http://gturnquist-quoters.cfapps.io/api/random.
With project setup complete, you can create a simple application that consumes a RESTful service.
A RESTful service has been stood up at http://gturnquist-quoters.cfapps.io/api/random. It randomly fetches quotes about Spring Boot and returns them as a JSON document.
If you request that URL through your web browser or curl, you’ll receive a JSON document that looks something like this:
{
type: "success",
value: {
id: 10,
quote: "Really loving Spring Boot, makes stand alone Spring apps easy."
}
}
Easy enough, but not terribly useful when fetched through a browser or through curl.
A more useful way to consume a REST web service is programmatically. To help you with that task, Spring provides a convenient template class called RestTemplate
. RestTemplate
makes interacting with most RESTful services a one-line incantation. And it can even bind that data to custom domain types.
First, create a domain class to contain the data that you need.
src/main/java/hello/Quote.java
link:complete/src/main/java/hello/Quote.java[role=include]
As you can see, this is a simple Java class with a handful of properties and matching getter methods. It’s annotated with @JsonIgnoreProperties
from the Jackson JSON processing library to indicate that any properties not bound in this type should be ignored.
In order for you to directly bind your data to your custom types, you need to specify the variable name exact same as the key in the JSON Document returned from the API. In case your variable name and key in JSON doc are not matching, you need to use @JsonProperty
annotation to specify the exact key of JSON document.
An additional class is needed to embed the inner quotation itself.
src/main/java/hello/Value.java
link:complete/src/main/java/hello/Value.java[role=include]
This uses the same annotations but simply maps onto other data fields.
Although it is possible to package this service as a traditional WAR file for deployment to an external application server, the simpler approach demonstrated below creates a standalone application. You package everything in a single, executable JAR file, driven by a good old Java main()
method. Along the way, you use Spring’s support for embedding the Tomcat servlet container as the HTTP runtime, instead of deploying to an external instance.
Now you can write the Application
class that uses RestTemplate
to fetch the data from our Spring Boot quotation service.
src/main/java/hello/Application.java
public class Application {
private static final Logger log = LoggerFactory.getLogger(Application.class);
public static void main(String args[]) {
RestTemplate restTemplate = new RestTemplate();
Quote quote = restTemplate.getForObject("http://gturnquist-quoters.cfapps.io/api/random", Quote.class);
log.info(quote.toString());
}
}
Because the Jackson JSON processing library is in the classpath, RestTemplate
will use it (via a message converter) to convert the incoming JSON data into a Quote
object. From there, the contents of the Quote
object will be logged to the console.
Here you’ve only used RestTemplate
to make an HTTP GET
request. But RestTemplate
also supports other HTTP verbs such as POST
, PUT
, and DELETE
.
So far we haven’t used Spring Boot in our application, but there are some advantages in doing so, and it isn’t hard to do. One of the advantages is that we might want to let Spring Boot manage the message converters in the RestTemplate
, so that customizations are easy to add declaratively. To do that we use @SpringBootApplication
on the main class and convert the main method to start it up, like in any Spring Boot application. Finally we move the RestTemplate
to a CommandLineRunner
callback so it is executed by Spring Boot on startup:
src/main/java/hello/Application.java
link:complete/src/main/java/hello/Application.java[role=include]
The RestTemplateBuilder
is injected by Spring, and if you use it to create a RestTemplate
then you will benefit from all the autoconfiguration that happens in Spring Boot with message converters and request factories. We also extract the RestTemplate
into a @Bean
to make it easier to test (it can be mocked more easily that way).
You should see output like the following, with a random quote:
2015-09-23 14:22:26.415 INFO 23613 --- [main] hello.Application : Quote{type='success', value=Value{id=12, quote='@springboot with @springframework is pure productivity! Who said in #java one has to write double the code than in other langs? #newFavLib'}}
Note
|
If you see the error Could not extract response: no suitable HttpMessageConverter found for response type [class hello.Quote] it’s possible you are in an environment that cannot connect to the backend service (which sends JSON if you can reach it). Maybe you are behind a corporate proxy? Try setting the standard system properties http.proxyHost and http.proxyPort to values appropriate for your environment.
|
Congratulations! You have just developed a simple REST client using Spring.