Перейти к содержанию

Как использовать службу RESTful (REST API) в Spring Boot

Мы используем 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.

Оригинал