Мы используем Spring Boot для создания RESTful API. В то же время можно использовать сервисы RESTful (например, платежные сервисы) в Spring, используя RestTemplate.
Общедоступная служба RESTful
В этом руководстве используем общедоступную службу RESTful. Можно найти различные сайты, предоставляющие общедоступные службы RESTful. Вот несколько полезных сервисов RESTful на https://reqres.in/. Здесь доступны различные API с GET, POST, PUT, PATCH, DELETE.
Мы используем службу RESTful, которую можно найти по адресу https://reqres.in/api/users?page=1. Эта служба вызывается через веб-браузер, который возвращает список фиктивных данных пользователя в формате JSON, как показано ниже:
{
"page":1,
"per_page":6,
"total":12,
"total_pages":2,
"data":[
{"id":1,"email":"george.bluth@reqres.in","first_name":"George","last_name":"Bluth","avatar":"https://reqres.in/img/faces/1-image.jpg"},
{"id":2,"email":"janet.weaver@reqres.in","first_name":"Janet","last_name":"Weaver","avatar":"https://reqres.in/img/faces/2-image.jpg"},
{"id":3,"email":"emma.wong@reqres.in","first_name":"Emma","last_name":"Wong","avatar":"https://reqres.in/img/faces/3-image.jpg"},
{"id":4,"email":"eve.holt@reqres.in","first_name":"Eve","last_name":"Holt","avatar":"https://reqres.in/img/faces/4-image.jpg"},
{"id":5,"email":"charles.morris@reqres.in","first_name":"Charles","last_name":"Morris","avatar":"https://reqres.in/img/faces/5-image.jpg"},
{"id":6,"email":"tracey.ramos@reqres.in","first_name":"Tracey","last_name":"Ramos","avatar":"https://reqres.in/img/faces/6-image.jpg"}
],
"support": {
"url":"https://reqres.in/#support-heading",
"text":"To keep ReqRes free, contributions towards server costs are
appreciated!"
}
}
Использование RestTemplate
Spring предоставляет очень полезный класс под названием RestTemplate. С его помощью можно общаться со службой RESTful.
Сначала нужно создать приложение Spring Boot. Можно создать приложение Spring Boot с помощью Spring Initializr и включить в проект зависимость Spring Web. Просто загрузите zip-файл, разархивируйте его в нужное место и импортируйте проект в свою любимую IDE.
Теперь, если внимательно посмотрите на документ JSON, то нужны три класса для хранения данных (MainClass и два подкласса для поддержки класса MainClass). Класс main предназначен для захвата всех данных документа JSON, а два подкласса предназначены для данных (фактически сведений о пользователе) и для поддержки. Итак, следующий код предназначен для DataClass:
package com.example.springresttemplate;
public class DataClass {
private int id;
private String email;
private String first_name;
private String last_name;
private String avatar;
public int getId() { return id;}
public void setId(int id) { this.id = id; }
public String getEmail() { return email; }
public void setEmail(String email) { this.email = email; }
public String getFirst_name() { return first_name; }
public void setFirst_name(String first_name) { this.first_name = first_name; }
public String getLast_name() { return last_name; }
public void setLast_name(String last_name) { this.last_name = last_name; }
public String getAvatar() { return avatar; }
public void setAvatar(String avatar) { this.avatar = avatar; }
@Override
public String toString() {
return "DataClass [id=" + id + ", email=" + email + ", first_name=" +
first_name + ", last_name=" + last_name + ", avatar=" + avatar + "]";
}
}
Следующий код предназначен для SupportClass:
package com.example.springresttemplate;
public class SupportClass {
private String url;
private String text;
public String getUrl() { return url; }
public void setUrl(String url) { this.url = url; }
public String getText() { return text; }
public void setText(String text) { this.text = text; }
@Override
public String toString() {
return "SupportClass [url=" + url + ", text=" + text + "]";
}
}
И, наконец, следующий код относится к MainClass:
package com.example.springresttemplate;
import java.util.Arrays;
public class MainClass {
private int page;
private int per_page;
private int total;
private int total_pages;
private DataClass[] data;
private SupportClass support;
public int getPage() { return page; }
public void setPage(int page) { this.page = page; }
public int getPer_page() { return per_page; }
public void setPer_page(int per_page) { this.per_page = per_page; }
public int getTotal() { return total; }
public void setTotal(int total) { this.total = total; }
public int getTotal_pages() { return total_pages; }
public void setTotal_pages(int total_pages) { this.total_pages = total_pages; }
public DataClass[] getData() { return data; }
public void setData(DataClass[] data) { this.data = data; }
public SupportClass getSupport() { return support; }
public void setSupport(SupportClass support) { this.support = support; }
@Override
public String toString() {
return "MainClass [page=" + page + ", per_page=" + per_page + ", total=" +
total + ", total_pages=" + total_pages + ", data=" + Arrays.toString(data) +
", support=" + support + "]";
}
}
Теперь создаем метод веб-запроса в классе контроллера RestFulController, код выглядит следующим образом:
package com.example.springresttemplate;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/restful")
public class RestFulController {
private static final Logger LOGGER = Logger.getLogger(RestFulController.class);
@Autowired
RestTemplate restTemplate;
@RequestMapping(value = "/users", method = RequestMethod.GET)
public void getUsers(HttpServletRequest request) {
MainClass mainClass = this.restTemplate.getForObject("https://reqres.in/api/users?page=1", MainClass.class);
LOGGER.info("Response -> " + mainClass.toString());
}
}
Здесь создали простой метод веб-запроса GET для взаимодействия со службой RESTful с использованием RestTemplate. Мы вызвали службу RESTful, используя метод getForObject(), который фактически извлекает данные и сохраняет их в MainClass, а затем записывает результат в консоль.
Теперь вызовем этот URL-адрес – http://localhost:8080/restful/users – из любого браузера, затем вернемся в IDE и откроем консоль. Там можно увидеть результат, показанный ниже:
2021-06-08 09:56:03 INFO RestFulController:24 - Response -> MainClass
[page=1, per_page=6, total=12, total_pages=2,
data=[DataClass [id=1,email=george.bluth@reqres.in, first_name=George, last_name=Bluth, avatar=https://reqres.in/img/faces/1-image.jpg],
DataClass [id=2, email=janet.weaver@reqres.in, first_name=Janet, last_name=Weaver, avatar=https://reqres.in/img/faces/2-image.jpg],
DataClass [id=3, email=emma.wong@reqres.in, first_name=Emma, last_name=Wong, avatar=https://reqres.in/img/faces/3-image.jpg],
DataClass [id=4, email=eve.holt@reqres.in, first_name=Eve, last_name=Holt, avatar=https://reqres.in/img/faces/4-image.jpg],
DataClass [id=5, email=charles.morris@reqres.in, first_name=Charles, last_name=Morris, avatar=https://reqres.in/img/faces/5-image.jpg],
DataClass [id=6, email=tracey.ramos@reqres.in, first_name=Tracey, last_name=Ramos, avatar=https://reqres.in/img/faces/6-image.jpg]],
support=SupportClass[url=https://reqres.in/#support-heading,
text=To keep ReqRes free, contributions towards server costs are appreciated!]
]
Таким образом, можно вызывать службы RESTful с помощью RestTemplate в Spring.