WEB & REST API Flashcards

1
Q

Что такое REST?

A

REST (Representational State Transfer)- это архитектурный стиль, который используется для создания распределенных приложений в Интернете. Он был предложен в 2000 году Роем Филдингом (Roy Fielding) в его диссертации “Архитектурные стили и дизайн сетевых программных архитектур”.

REST это набор ограничений-правил, описывающий как правильно написать код серверного веб-приложения, чтобы все системы легко обменивались данными и приложение возможно было масштабировать.

Основная идея REST заключается в том, что клиент и сервер обмениваются ресурсами (например, документами, изображениями, видео и т.д.), которые идентифицируются уникальным идентификатором URI (Uniform Resource Identifier). Клиенты могут запрашивать и получать ресурсы с помощью стандартных HTTP-методов (GET, POST, PUT, DELETE и т.д.), а серверы должны предоставлять эти ресурсы в виде данных (например, в формате HTML, XML, JSON и т.д.), которые могут быть легко обработаны и отображены клиентом.

REST также включает в себя несколько архитектурных ограничений, которые позволяют создавать более гибкие и масштабируемые веб-сервисы. Например, гипермедиа-ориентированный интерфейс (HATEOAS) позволяет клиенту получать информацию о доступных действиях на ресурсах через ссылки, возвращаемые сервером. Ограничение без состояния (Stateless) означает, что сервер не должен хранить информацию о состоянии клиента между запросами, что позволяет легко масштабировать приложение на несколько серверов.

REST позволяет создавать более гибкие, расширяемые и легко поддерживаемые приложения в Интернете. Он является стандартом для создания веб-сервисов и API в Интернете.

В контексте REST (Representational State Transfer) эндпоинт (endpoint) - это конечная точка (URL-адрес), которая представляет собой конкретный ресурс или коллекцию ресурсов в веб-сервисе. Эндпоинт - это место, где клиентские приложения могут отправлять запросы на получение или изменение данных, а сервер может отвечать на эти запросы.

REST = Representational State Transfer
1) Архитектурный стиль взаимодействия компонентов распределенного приложения в сети.
2) Согласованный набор ограничений, учитываемых при проектировании распределённой системы.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

Что такое REST API?

A

**REST API **(Application Programming Interface) - это интерфейс программирования приложений, который основан на архитектурном стиле REST (Representational State Transfer). Он позволяет взаимодействовать с удаленными приложениями или сервисами, используя стандартные HTTP-методы, такие как GET, POST, PUT и DELETE.

REST API позволяет передавать данные между клиентом и сервером в формате JSON, XML или других форматах. Он используется для разработки веб-приложений, мобильных приложений, интеграции с другими сервисами и т.д.

REST API должен быть построен с соблюдением всех ограничений и принципов, определенных в стиле архитектуры REST, таких как идентификация ресурсов, использование HTTP-методов, разделение клиента и сервера, кэширование и т.д.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

Перечислите требования REST? 6 принципов REST API

A

Client-Server Отделяя пользовательский интерфейс от хранилища данных, мы улучшаем переносимость пользовательского интерфейса на другие платформы и улучшаем масштабируемость серверных компонент засчёт их упрощения.
REST API следует принципу разделения клиента и сервера. Клиент и сервер могут развиваться независимо друг от друга, без знания о существовании друг друга. Это позволяет изменять реализацию клиента и сервера, не влияя на другую сторону.
Stateless (без состояния). Каждый запрос от клиента к серверу должен содержать в себе всю необходимую информацию и не может полагаться на какое-либо состояние, хранящееся на стороне сервера. Таким образом, информация о текущей сессии должна целиком храниться у клиента.
REST API должен быть без состояния (stateless). Каждый запрос к серверу должен содержать всю необходимую информацию для его обработки. Сервер не должен хранить информацию о состоянии клиента между запросами. Это позволяет масштабировать систему и улучшить ее производительность.
Cacheable (кэшируемость). Это ограничение требует, чтобы для данных в ответе на запрос явно было указано – можно их кэшировать или нет. Если ответ поддерживает кэширование, то клиент имеет право повторно использовать данные в последующих эквивалентных запросов без обращения на сервер.”
REST API должен поддерживать кэширование, чтобы уменьшить количество запросов и улучшить производительность. Клиент может сохранять ответы на запросы, которые часто повторяются, и использовать их вместо отправки новых запросов на сервер.
Uniform interface (единообразие интерфейса). Если применить к системе инженерный принцип общности/единообразия, то архитектура всего приложения станет проще, а взаимодействие станет прозрачнее и понятнее.
Для выполнения этого принципа необходимо придерживаться нескольких архитектурных ограничений. REST накладывает на интерфейс четыре ограничения:
* Определение ресурса (означает, что каждый ресурс должны быть обозначен постоянным идентефикатором)
* Управление ресурсами через представление (означает, что клиент хранит ресурс в виде его представления, и при желании изменения ресурса он отправляет серверу информацию о том, в каком виде он хотел бы видеть этот ресурс; сервер же рассматривает этот как запрос как предложение, и сам решает, что делать ему с хранимым ресурсом)
* Самодостаточные сообщения (каждое сообщение содержит достаточно информации, чтобы понять, как его обрабатывать)
* Гипермедиа (означает, что клиенты изменяют состояние системы только через действия, которые динамически определены в гипермедиа на сервер) (HATEOAS) – ссылки на другие ресурсы внутри приложения.

**Uniform Interface **(Единый интерфейс)
REST API должен иметь единый интерфейс, который определяет, как клиенты и серверы общаются друг с другом. Это включает в себя определение ресурсов, используемых в приложении, методов, которые могут быть применены к ресурсам, и форматов, которые используются для представления данных.

Layered system (многоуровневая система). Многоуровневость достигается засчёт ограничения поведения компонентов таким образом, что компоненты ““не видят”” другие компоненты, кроме расположенных на ближайших уровнях, с которыми они взаимодействуют.
REST API должен быть построен на слоистой архитектуре, в которой каждый слой выполняет определенную функцию. Это позволяет скрыть детали реализации от клиентов и серверов, и упростить архитектуру приложения.
Code on demand (код по мере необходимости, необятельно). REST позволяет наращивать функциональность клиентского приложения по мере необходимости при помощи скачивания и исполнения кода в виде апплетов или скриптов. Это упрощает клиентские приложения, уменьшая количество заранее написанных возможностей.
REST API может включать в себя код на запрос, который передается от сервера к клиенту при необходимости. Это позволяет расширять возможности клиента, не изменяя приложение на сервере.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

Что означает RESTful?

A

Термин RESTful обычно используется для описания веб-сервисов, которые следуют архитектурным принципам REST. Это означает, что сервисы предоставляют клиентам доступ к ресурсам через единый интерфейс, используя URI и HTTP-методы, такие как GET, POST, PUT и DELETE.

  • Клиент-серверная архитектура: взаимодействие между клиентом и сервером должно быть разделено на отдельные слои, которые могут быть изменены независимо друг от друга.
  • Без состояния (Stateless): каждый запрос от клиента должен содержать всю необходимую информацию для сервера, чтобы понимать запрос и выполнить его, без необходимости сохранять информацию о предыдущих запросах.
  • Кэширование (Caching): ответы сервера должны быть кэшируемы, чтобы повторные запросы клиента на ту же самую информацию могли быть удовлетворены из кэша, что уменьшит нагрузку на сервер.
  • Единообразный интерфейс (Uniform Interface): интерфейс между клиентом и сервером должен быть единообразным, чтобы клиент мог легко понимать, как взаимодействовать с сервером.
  • Слои (Layered System): клиент не должен знать о дополнительных слоях между ним и сервером, что позволяет менять или добавлять слои без изменения клиентского кода.
  • Отсутствие предварительного состояния (Code-On-Demand): сервер может отправлять код клиенту, который может выполнить для выполнения дополнительных функций, например, скрипты на JavaScript.

Сервис написанный с учетом всех правил REST принято называть RESTful

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

Каковы преимущества REST API?

A

REST API - это архитектурный стиль, который использует протокол HTTP для создания веб-сервисов. Он имеет несколько преимуществ перед другими подходами к созданию веб-сервисов:

  • Универсальность: REST API может использоваться с любыми клиентами, которые могут отправлять HTTP-запросы и обрабатывать HTTP-ответы. Это делает его универсальным и легко масштабируемым.
  • Разделение сервера и клиента: REST API позволяет разделять клиентскую и серверную части приложения, что упрощает разработку и обеспечивает более четкую архитектуру.
  • Простота и гибкость: REST API использует простые и понятные HTTP-методы для выполнения операций, таких как создание, чтение, обновление и удаление данных. Это делает его гибким и простым в использовании.
  • Надежность: REST API использует HTTP-протокол, который является надежным и широко используется в интернете. Это позволяет обеспечивать надежность и целостность данных при передаче по сети.
  • Кэширование: REST API поддерживает кэширование, что позволяет уменьшить нагрузку на сервер и ускорить процесс обработки запросов.
  • Поддержка форматов данных: REST API поддерживает различные форматы данных, такие как XML и JSON, что обеспечивает более гибкую передачу данных между клиентом и сервером.
  • можем связывать между собой разные сервисы, которые используеют разные языки программирование, разные фреймворки и тд, поскольку данные передаются в формате json чаще всего, который не зависит от конкретной технологии от конкретного языка программирования, он универсален для всех языков программирования, и все языки программирования могут с ним работать.
  • Также к одному сервису могут обращаться сразу несколько сервисов, то есть написали бэк, а множество фронтов обращаются за данными

Также REST API популярны среди микросервисов.
Обычный подход к работе над приложением - это монолитный подход, когда у нас в одном приложении всё находится, контроллеры, сервисы и тд. Но когда проект расрастается, то им становится сложнее управлять, изменять, дополнять, когда всё в одной куче, поэтому монолитное приложение разбирается на микросервисы, небольшие сервисы, слабо связанные и легко изменяемые приложения, которые выполняет какие-то элементарные функции. Эти с другом с помощью API, то есть обмениваются между собой данные чаще всего в формате json, тем самым могут использовать разные языки программирования С микросервисами можно изменять какой-то конкретный модуль, при этом это изменение не будет отражаться на других модулях, как это было при монолите.
Микросервисы могут быть распределенными, то есть могут работать на множестве серверов, тем самым это
позволяет нам горизонтально масшабироваться, докупая сервера при необходимости, не увеличивать мощность текущего сервера

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

Каковы недостатки REST API?

A
  • получаемые данные из какого-то сервиса часто бывают избыточными или неполными
  • До сих пор нет общего согласования того, что такое REST API. Это по поводу статусов ответа, порой трудно понять когда и какой статус ответа использовать, можем ли мы, например, использовать для изменения пользователя статус 200 или 201
  • rest привязан сильно к http протоколу
  • Отсутствие формальной спецификации: REST API не имеет формальной спецификации, что может привести к несоответствию между клиентскими и серверными интерфейсами.
  • Ограниченность методов: REST API ограничивает набор методов, которые можно использовать для взаимодействия с ресурсами. Это может привести к необходимости использования обходных путей для реализации некоторых функций.
  • Сложность понимания для новичков: Из-за отсутствия формальной спецификации и широкого спектра возможных реализаций, REST API может быть сложен для понимания для новичков.
  • Большое количество запросов: REST API может потребовать большого количества запросов для получения необходимых данных, что может ухудшить производительность приложения.
  • Отсутствие безопасности: REST API не обеспечивает безопасности, так как все данные передаются в открытом виде. Для обеспечения безопасности приходится использовать дополнительные механизмы, такие как SSL и токены авторизации.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Объясните ограничения единого интерфейса

A

Одним из основных принципов архитектурного стиля REST является ограничение на единый интерфейс, который клиенты могут использовать для взаимодействия с сервером. Единый интерфейс включает в себя четыре ограничения:

  • Идентичность ресурсов (Resource identification) - каждый ресурс должен быть идентифицирован уникальным URI (Uniform Resource Identifier).
  • Манипуляция над ресурсами через представление (Resource manipulation through representations) - клиенты могут модифицировать ресурсы, отправляя запросы на URI, которые описывают операции над ресурсами (например, GET, POST, PUT, DELETE). При этом клиенты должны отправлять данные в виде представления (representation) ресурса, которое может быть в разных форматах, таких как JSON, XML или HTML.
  • Исчерпывающие, понятные человеку сообщения(Self-descriptive messages) - запросы и ответы должны содержать достаточно информации для понимания, как обрабатывать сообщения, без дополнительной информации от клиента или сервера. Для этого используются заголовки HTTP, которые описывают формат сообщений, тип содержимого и другую мета-информацию.
  • Гипермедиа (Hypermedia) как движок для состояния приложения (HATEOAS) - сервер должен включать в ответы ссылки на связанные ресурсы, которые могут быть запрошены клиентом. Это позволяет клиенту определить, какие действия можно совершить над ресурсами и какие ресурсы могут быть получены дополнительно. Такой подход упрощает изменение API и добавление новых функций без изменения клиентского кода.

1) идентичность ресурсов;
2) 2) манипуляция над ресурсами через представление;
3) 3) исчерпывающие, понятные человеку сообщения;
4) 4) гипермедиа (hypermedia) как движок для состояния приложения (HATEOAS) – ссылки на другие ресурсы внутри приложения.

Ограничение на единый интерфейс упрощает клиент-серверное взаимодействие, уменьшает зависимости между клиентом и сервером и повышает гибкость системы. Оно также упрощает масштабирование системы, поскольку все клиенты используют один и тот же интерфейс для взаимодействия с сервером.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

Гипермедиа (HATEOAS)

A

HATEOAS (Hypermedia as the Engine of Application State) - это принцип архитектуры REST, который определяет способ представления ресурсов и связей между ними в веб-сервисе.

Простыми словами, HATEOAS означает, что каждый ресурс в веб-сервисе должен содержать не только саму информацию, но и ссылки на другие связанные ресурсы, а также информацию о том, как эти ссылки могут быть использованы для выполнения различных операций над ресурсами.

Например, если веб-сервис представляет собой интернет-магазин, ресурс “корзина” может содержать не только информацию о товарах, но и ссылки на страницы для добавления товаров в корзину, удаления товаров и оформления заказа. Это позволяет клиентскому приложению использовать эти ссылки для выполнения соответствующих операций, не требуя предварительного знания конкретных URL-адресов.

Таким образом, принцип HATEOAS обеспечивает более гибкую и универсальную работу с веб-сервисом, упрощает его использование и облегчает его сопровождение.

Вот пример контроллера REST API на Java с использованием фреймворка Spring Boot и Spring HATEOAS, который возвращает JSON-ответ с гиперссылками на другие ресурсы:
~~~
@RestController
public class ProductController {

@GetMapping("/products/{productId}")
public Product getProduct(@PathVariable long productId) {
    // Здесь мы получаем объект продукта по его идентификатору из базы данных или другого источника данных
    Product product = getProductFromDatabase(productId);

    // Создаем гиперссылки на другие ресурсы
    Link selfLink = WebMvcLinkBuilder.linkTo(ProductController.class).slash("/products/" + productId).withSelfRel();
    Link addToCartLink = WebMvcLinkBuilder.linkTo(CartController.class).slash("/cart/add/" + productId).withRel("add_to_cart");

    // Добавляем гиперссылки к объекту продукта
    product.add(selfLink, addToCartLink);

    return product;
}

private Product getProductFromDatabase(long productId) {
    // Здесь мы имитируем получение объекта продукта из базы данных или другого источника данных
    return new Product(productId, "Example Product", "This is an example product.", 9.99);
}

}
~~~
В этом примере контроллер ProductController имеет метод getProduct, который получает объект продукта по его идентификатору и добавляет к нему гиперссылки на другие ресурсы. Метод linkTo из класса WebMvcLinkBuilder используется для создания гиперссылок на методы контроллера ProductController и CartController. Метод add из класса org.springframework.hateoas.RepresentationModel используется для добавления гиперссылок к объекту продукта.

Вот пример JSON-ответа, который возвращает этот контроллер:

{
  "productId": 1234,
  "name": "Example Product",
  "description": "This is an example product.",
  "price": 9.99,
  "_links": {
    "self": {
      "href": "http://localhost:8080/products/1234"
    },
    "add_to_cart": {
      "href": "http://localhost:8080/cart/add/1234"
    }
  }
}

Обратите внимание на свойство _links, которое содержит гиперссылки на другие ресурсы. Каждая гиперссылка представлена объектом с именем отношения (self, add_to_cart) и свойством href, которое содержит URL-адрес ресурса.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

JSON

A

JSON (JavaScript Object Notation) - это легкий формат обмена данными, основанный на синтаксисе объектов JavaScript. Он широко используется в веб-разработке для передачи данных между клиентом и сервером.

JSON представляет данные в виде пар “имя/значение” и структурирован в виде объектов и массивов. Он может содержать строки, числа, логические значения, массивы и объекты, а также нулевое значение.

JSON является удобным форматом для обмена данными, так как он прост в использовании и понимании, а также поддерживается многими языками программирования и платформами. Он может использоваться для передачи данных в различных форматах, включая AJAX-запросы, RESTful API и др.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Как в java происходит конвертация json в java код.

A

Для конвертации JSON в объекты Java в языке программирования Java часто используется библиотека Jackson. Она позволяет сериализовать (конвертировать в JSON) и десериализовать (конвертировать из JSON в объекты Java) данные.

Например, предположим, у нас есть JSON-строка, представляющая объект Person:
~~~
{
“firstName”: “John”,
“lastName”: “Doe”,
“age”: 30
}
~~~

Чтобы преобразовать эту строку в объект Person, необходимо выполнить следующий код:

import com.fasterxml.jackson.databind.ObjectMapper;

public class Main {
    public static void main(String[] args) throws Exception {
        String json = "{\"firstName\":\"John\",\"lastName\":\"Doe\",\"age\":30}";
        ObjectMapper objectMapper = new ObjectMapper();
        Person person = objectMapper.readValue(json, Person.class);
        System.out.println(person);
    }
}

В данном примере мы использовали метод readValue() из библиотеки Jackson, который принимает строку в формате JSON и класс Java, в который необходимо конвертировать JSON. В результате выполнения метода мы получаем объект класса Person, который мы можем использовать в своей программе.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Что такое CRUD?

A

CRUD - это акроним, который означает Create (Создание), Read (Чтение), Update (Обновление) и Delete (Удаление). CRUD - это основные операции, которые могут быть выполнены над любой постоянной системой хранения данных, такой как база данных, файловая система и т.д. Они представляют собой стандартный набор операций, которые позволяют создавать, читать, изменять и удалять данные.

Примеры использования CRUD:

  • Создание: создание нового пользователя в базе данных;
  • Чтение: чтение информации о продукте из базы данных;
  • Обновление: изменение цены товара в базе данных;
  • Удаление: удаление пользователя из базы данных.
    CRUD используется во многих приложениях и системах, таких как веб-приложения, мобильные приложения, системы управления контентом и т.д. Он облегчает работу с данными и позволяет эффективно управлять ими.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Что такое SOAP?

A

SOAP (Simple Object Access Protocol) - это протокол обмена структурированными сообщениями в формате XML между компьютерными системами. SOAP используется для обмена данными между приложениями, работающими на разных платформах и написанными на разных языках программирования. SOAP предоставляет механизмы для вызова удаленных процедур и передачи сообщений между различными системами.

SOAP-сообщение обычно состоит из трех частей:

Сообщение SOAP выглядит так:

Envelope — корневой элемент, который определяет сообщение и пространство имен, использованное в документе.
Header — содержит атрибуты сообщения, например: информация о безопасности или о сетевой маршрутизации.
Body — содержит сообщение, которым обмениваются приложения.
Fault — необязательный элемент, который предоставляет информацию об ошибках, которые произошли при обработке сообщений.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

В чем разница между SOAP и REST?

A

На самом деле, сравнивать их немного похоже на сравнение яблок с апельсинами, поскольку SOAP — это формат протокола, основанный на XML, тогда как REST — это архитектурный подход.

Основные различия между ними:

  • Архитектура: SOAP является протоколом, основанным на XML, который работает на основе структурированных сообщений, а REST основан на архитектуре клиент-сервер и работает с ресурсами через универсальный набор операций HTTP.
  • Формат данных: SOAP использует XML для форматирования данных, а REST может использовать различные форматы, такие как JSON, XML или даже текст.
  • Модель безопасности: SOAP имеет свой собственный набор стандартов для безопасности, таких как WS-Security, в то время как в REST безопасность обычно достигается с помощью HTTPS и базовой аутентификации.
  • Производительность: REST обычно более производительный, так как использует более простой формат данных и не имеет накладных расходов, связанных с обработкой XML.
  • Поддержка: SOAP имеет широкую поддержку со стороны инструментов и языков программирования, в то время как REST считается более простым и имеет менее жесткие требования к клиентам.
  • Кеширование: REST легко кешируется на стороне клиента, в то время как SOAP трудно кешируется.
How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Расскажите о методах HTTP-запросов, поддерживаемых REST, и о том, когда они используются.

A

REST использует методы HTTP-запросов для взаимодействия с ресурсами. Основными методами являются:

GET: используется для получения информации о ресурсе. GET-запрос может содержать параметры запроса, передаваемые в URL-адресе, и сервер должен вернуть запрошенную информацию в теле ответа.

POST: используется для создания нового ресурса. POST-запрос содержит данные, которые должны быть сохранены на сервере, и сервер должен вернуть ответ, указывающий, что ресурс был успешно создан.

PUT: используется для обновления существующего ресурса. PUT-запрос содержит данные, которые должны быть сохранены на сервере, и сервер должен вернуть ответ, указывающий, что ресурс был успешно обновлен.

DELETE: используется для удаления ресурса. DELETE-запрос должен содержать идентификатор ресурса, который должен быть удален, и сервер должен вернуть ответ, указывающий, что ресурс был успешно удален.

PATCH: используется для частичного обновления ресурса. PATCH-запрос содержит только ту часть данных, которая должна быть обновлена, а не все данные ресурса.

OPTIONS: используется для получения информации о доступных методах HTTP-запросов для ресурса.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Различие между методами GET и POST

A

Метод GET используется для запроса ресурса у сервера. Он передает параметры запроса (например, запрос на получение конкретного ресурса) в URL-адресе, который затем отправляется на сервер. GET-запросы могут кэшироваться браузером и прокси-серверами, что может ускорить процесс получения данных. GET-запросы не могут использоваться для изменения данных на сервере.

GET передает данные в URL в виде пар “имя-значение”, данные видны всем в адресной строке браузера. Длина запроса не более 2048 символов. Следует использовать для получения данных от сервера и не желательно в запросах, предполагающих внесений изменений в ресурс.
GET ограничен максимальной длинной(ограничение устанавливается на сервере).
GET не поддерживает передачу бинарных данных.
GET используется для получения информации

Метод POST, в отличие от метода GET, используется для отправки данных на сервер, обычно с целью создания или обновления ресурсов. POST-запросы передают данные в теле запроса, а не в URL-адресе. POST-запросы не кэшируются, что может замедлить процесс получения данных. Однако, POST-запросы могут использоваться для изменения данных на сервере.
POST используется для добавления данных

POST передает данные в теле запроса. Данные можно увидеть только с помощью инструментов разработчика, расширений браузера. Следует использовать в случаях, когда нужно вносить изменение в ресурс. HTTP метод POST поддерживает тип кодирования данных multipart/form-data, что позволяет передавать файлы.

Передача данных методом POST более безопасна, чем методом GET, так как секретные данные (например пароль) не отображаются напрямую в web-клиенте пользователя, в отличии от URL, который виден почти всегда. Иногда это преимущество превращается в недостаток - вы не сможете послать данные за кого-то другого.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

RestTemplate

A

RestTemplate - это класс из библиотеки Spring Framework, который предоставляет простой и удобный способ взаимодействия с REST API веб-сервисами по протоколу HTTP.

RestTemplate может выполнять запросы HTTP методами GET, POST, PUT, DELETE и другими, а также обрабатывать ответы в различных форматах, таких как JSON и XML, настройку времени ожидания, обработку ошибок и так далее.

RestTemplate - это клиентский инструмент, который используется для взаимодействия с удаленными веб-сервисами по протоколу HTTP. Он может быть использован для выполнения различных типов запросов, таких как GET, POST, PUT, DELETE и др., и обработки ответов в форматах, таких как JSON и XML.

Контроллеры и RestTemplate выполняют разные задачи в приложении. Контроллеры обрабатывают запросы внутри приложения, а RestTemplate используется для отправки запросов к внешним сервисам.

Для использования RestTemplate в приложении на платформе Spring необходимо добавить зависимость на библиотеку spring-web.

после 5 спринга - webclient

Примеры использования RestTemplate:

Получение данных от веб-сервиса в формате JSON:
~~~
RestTemplate restTemplate = new RestTemplate();
String url = “https://jsonplaceholder.typicode.com/posts/1”;
String jsonResponse = restTemplate.getForObject(url, String.class);
System.out.println(jsonResponse);
~~~

В этом примере RestTemplate выполняет GET-запрос к веб-сервису по указанному URL-адресу и получает ответ в формате JSON. Ответ сохраняется в виде строки, которая затем выводится на консоль.

Отправка данных в веб-сервис в формате JSON:
~~~
RestTemplate restTemplate = new RestTemplate();
String url = “https://jsonplaceholder.typicode.com/posts”;
Post post = new Post();
post.setTitle(“New Post”);
post.setBody(“This is a new post.”);
post.setUserId(1);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
HttpEntity<Post> requestEntity = new HttpEntity<Post>(post, headers);
Post response = restTemplate.postForObject(url, requestEntity, Post.class);
System.out.println(response);
~~~
В этом примере RestTemplate отправляет POST-запрос к веб-сервису по указанному URL-адресу и передает объект типа Post в формате JSON. Запрос создается в виде объекта HttpEntity, который содержит заголовки и тело запроса. RestTemplate выполняет запрос и получает ответ в формате JSON, который сохраняется в виде объекта типа Post. Ответ затем выводится на консоль.</Post></Post>

Получение списка объектов в формате JSON:
~~~
RestTemplate restTemplate = new RestTemplate();
String url = “https://jsonplaceholder.typicode.com/posts”;
List<Post> posts = restTemplate.exchange(
url,
HttpMethod.GET,
null,
new ParameterizedTypeReference<List<Post>>(){}
).getBody();
System.out.println(posts);
~~~
В этом примере RestTemplate выполняет GET-запрос к веб-сервису по указанному URL-адресу и получает ответ в формате JSON, содержащий список объектов типа Post. RestTemplate использует метод exchange() для выполнения запроса и получения ответа в виде объекта ResponseEntity. Метод getBody() извлекает тело ответа в виде списка объектов типа Post, который затем выводится на консоль.</Post></Post>

17
Q

HTTP протокол

A

HTTP (Hypertext Transfer Protocol) - это протокол прикладного уровня, который используется для передачи гипертекстовых документов в сети Интернет.
HTTP является протоколом прикладного уровня, который чаще всего использует возможности другого протокола - TCP (или TLS - защищённый TCP) - для пересылки и получения сообщений.
Протокол HTTP лежит в основе обмена данными в Интернете.
HTTP является протоколом клиент-серверного взаимодействия, что означает инициирование запросов к серверу самим получателем, обычно веб-браузером (web-browser).
HTTP запросы и ответы имеют близкую структуру. Они состоят из:

  1. Стартовой строки, описывающей запрос, или статус (успех или сбой). Это всегда одна строка.
  2. Произвольного набора HTTP заголовков, определяющих запрос или описывающих тело сообщения.
  3. Пустой строки, указывающей, что вся мета информация отправлена.
  4. Произвольного тела, содержащего пересылаемые с запросом данные (например, содержимое HTML-формы ) или отправляемый в ответ документ. Наличие тела и его размер определяется стартовой строкой и заголовками HTTP.

Стартовую строку вместе с заголовками сообщения HTTP называют головой запроса, а его данные - телом.

Как выглядит стартовая строка ответа?

HTTP/версия Код_состояния Пояснение
Например: HTTP/1.1 200 OK

Наиболее распространенными методами являются:

GET - используется для запроса ресурсов. Сервер возвращает запрашиваемый ресурс в теле ответа.
POST - используется для создания ресурсов или отправки данных на сервер. Данные передаются в теле запроса.
PUT - используется для обновления ресурсов. Ресурс, указанный в запросе, полностью заменяется данными из тела запроса.
DELETE - используется для удаления ресурсов.
PATCH - используется для частичного обновления ресурсов. Ресурс, указанный в запросе, обновляется только теми данными, которые передаются в теле запроса.
OPTIONS - используется для получения информации о возможностях сервера в отношении ресурса, указанного в запросе.
HEAD - Аналогичен методу GET, за исключением того, что в ответе сервера отсутствует BODY . Запрос HEAD обычно применяется для извлечения метаданных, проверки наличия ресурса (валидация URL) и чтобы узнать, не изменился ли он с момента последнего обращения.
TRACE Возвращает полученный запрос так, что клиент может увидеть, какую информацию промежуточные серверы добавляют или изменяют в запросе.
CONNECT Преобразует соединение запроса в прозрачный TCP/IP-туннель, обычно чтобы содействовать установлению защищённого SSL-соединения через нешифрованный прокси.

Элементы запроса:

  • Метод запроса: GET, POST, PUT, DELETE и т.д.
  • URL (Uniform Resource Locator) или URI (Uniform Resource Identifier) - адрес ресурса, к которому обращается запрос
  • Заголовки (Headers) - метаданные запроса, содержащие информацию о типе запроса, используемом языке, форматах ответов, типе контента и т.д.
  • Тело запроса (Body) - необязательное поле, которое может содержать данные, передаваемые в запросе, например, параметры запроса.

Элементы ответа:

  • Код состояния (Status Code) - трехзначный код, описывающий результат выполнения запроса (например, 200 OK, 404 Not Found)
  • Заголовки (Headers) - метаданные ответа, содержащие информацию о типе ответа, используемом языке, форматах ответов, типе контента и т.д.
  • Тело ответа (Body) - необязательное поле, которое может содержать данные, передаваемые в ответе, например, текст, HTML, JSON или XML.
18
Q

основные отличия между HTTP 1 и HTTP 2

A
  • Мультиплексирование: HTTP 2 поддерживает мультиплексирование, что означает, что несколько запросов могут быть отправлены и получены через одно соединение. В HTTP 1 каждый запрос требует своего собственного соединения.
  • Бинарный формат: HTTP 2 использует бинарный формат передачи данных, в то время как HTTP 1 использует текстовый формат. Это улучшает производительность и снижает объем передаваемых данных.
  • Server Push: HTTP 2 поддерживает server push, что позволяет серверу отправлять клиенту данные, которые он не запрашивал, но которые он вероятно запросит в будущем. В HTTP 1 клиент должен отправлять отдельные запросы для получения этих данных.
  • Заголовки: HTTP 2 позволяет сжимать заголовки, которые отправляются в каждом запросе, чтобы уменьшить объем передаваемых данных.
  • Приоритеты: HTTP 2 поддерживает приоритеты запросов, что позволяет управлять порядком выполнения запросов на сервере и улучшает производительность.
  • Keep-Alive: HTTP 2 по умолчанию поддерживает соединения Keep-Alive, что позволяет использовать одно соединение для нескольких запросов, в то время как в HTTP 1 требуется отдельное соединение для каждого запроса.
19
Q

Статусы ответа HTTP

A

HTTP (Hypertext Transfer Protocol) определяет также статусы ответа (HTTP status codes), которые отправляются сервером в ответ на запрос клиента. Статусы ответа помогают клиентам понимать, что произошло с запросом, и принимать соответствующие действия. Наиболее распространенные статусы ответа HTTP:

1xx (Информационные): сервер принял запрос, но еще не завершил его обработку.
2xx (Успешный): сервер успешно обработал запрос клиента.
3xx (Перенаправление): сервер направляет клиента на другой ресурс или URL.
4xx (Клиентские ошибки): сервер не может обработать запрос клиента из-за ошибок в запросе или отсутствия доступа к запрашиваемому ресурсу.
5xx (Серверные ошибки): сервер не может обработать запрос клиента из-за ошибок на стороне сервера.
Наиболее часто используемые статусы ответа HTTP:

200 OK - успешный запрос клиента.
201 Created - ресурс успешно создан на сервере.
204 No Content - сервер успешно обработал запрос, но не возвращает содержимое в теле ответа.
400 Bad Request - ошибка в запросе клиента.
401 Unauthorized - клиент не авторизован для выполнения данного запроса.
404 Not Found - запрашиваемый ресурс не найден на сервере.
500 Internal Server Error - серверная ошибка при обработке запроса.
Каждый статус ответа сопровождается соответствующим текстовым описанием, которое помогает клиентам понимать, что произошло с запросом.

20
Q

Что такое идемпотентный HTTP-метод?

A

Что такое идемпотентный Http метод?
2) 1) Метод HTTP является идемпотентным, если повторный идентичный запрос не меняет состояния сервера.
2) Иначе говоря, нет разницы - вызвать метод один раз или много.
3) Разницы нет для внутреннего состояния сервера - но ответ может меняться. Например, удалив узел (DELETE /page HTTP/1.1), в первый раз мы получил 200 ОК, а во второй - 404 NOT FOUND

Какие HTTP методы являются идемпотентными?
Все безопасные методы: 1) GET, 2) HEAD
методы DELETE, PUT, OPTIONS, TRACE являются идемпотентными только если они корректно реализованы на сервере.

Какой метод HTTP не является идемпотентным?
1) HTTP метод POST не является безопасным или идемпотентным.
2) Метод POST изначально запрашивает изменение внутреннего состояния сервера.

“В контексте API идемпотентность означает, что многократные запросы обрабатываются так же, как однократные.
Это значит, что получив повторный запрос с теми же параметрами, в ответе должен быть результат исходного запроса.
Такое поведение помогает избежать нежелательного повторения транзакций.
Например, если при проведении платежа возникли проблемы с сетью, и соединение прервалось,
вы сможете безопасно повторить нужный запрос неограниченное количество раз.

GET-запросы являются по умолчанию идемпотентными, так как не имеют нежелательных последствий.
Для идемпотентности POST-запросов используется заголовок ““Idempotence-Key”” (ключ идемпотентности).”
“Если вы повторяете запрос с теми же данными и тем же ключом, API обрабатывает его как повторный.
Если данные в запросе те же, а ключ идемпотентности отличается, запрос выполняется как новый.
В заголовке Idempotence-Key можно передавать любое значение, уникальное для этой операции на вашей стороне.

Можно использовать ограниченные по времени ключи идемпотентности как дополнительное средство обеспечения безопасности использования вашего REST API. “

21
Q

Часто встречающиеся коды ошибок HTTP

A

Обработка ошибок
400 Bad Request Универсальный код ошибки, если серверу непонятен запрос от клиента.

403 Forbidden Возвращается, если операция запрещена для текущего пользователя. Если у оператора есть учётка с более высокими правами, он должен перелогиниться самостоятельно. См. также 419

404 Not Found Возвращается, если в запросе был указан неизвестный entity или id несуществующего объекта.Списочные методы get не должны возвращать этот код при верном entity (см. выше).Если запрос вообще не удалось разобрать, следует возвращать 418.

415 Unsupported Media Type Возвращается при загрузке файлов на сервер, если фактический формат переданного файла не поддерживается. Также может возвращаться, если не удалось распарсить JSON запроса, или сам запрос пришёл не в формате JSON.

418 I’m a Teapot Возвращается для неизвестных серверу запросов, которые не удалось даже разобрать. Обычно это указывает на ошибку в клиенте, типа ошибки при формировании URI, либо что версии протокола клиента и сервера не совпадают. Этот ответ удобно использовать, чтобы отличать запросы на неизвестные URI (т.е. явные баги клиента) от ответов 404, у которых просто нет данных (элемент не найден). В отличие от 404, код 418 не бросается никаким промежуточным софтом. Альтернатива — использовать для обозначения ситуаций “элемент не найден” 410 Gone, но это не совсем корректно, т.к. предполагает, что ресурс когда-то существовал. Да и выделить баги клиента из потока 404 будет сложнее.

419 Authentication Timeout Отправляется, если клиенту нужно пройти повторную авторизацию (например, протухли куки или CSRF токены). При этом на клиенте могут быть несохранённые данные, которые будут потеряны, если просто выкинуть клиента на страницу авторизации.

422 Unprocessable Entity Запрос корректно разобран, но содержание запроса не прошло серверную валидацию. Например, в теле запроса были указаны неизвестные серверу поля, или не были указаны обязательные, или с содержимым полей что-то не так. Обычно это означает ошибку в введённых пользователем данных, но может также быть вызвано ошибкой на клиенте или несовпадением версий.

500 Internal Server Error Возвращается, если на сервере вылетело необработанное исключение или произошла другая необработанная ошибка времени исполнения.Всё, что может сделать клиент в этом случае — это уведомить пользователя и сделать console.error(err) для более продвинутых товарищей (админов, разработчиков и тестировщиков).

501 Not Implemented Возвращается, если текущий метод неприменим (не реализован) к объекту запроса.

22
Q

Отличие HTTP vs HTTPS

A

По HTTP информация передаётся в обычном виде, а по HTTPS — в зашифрованном.

HTTP передает данные от клиента к серверу в открытом виде, без шифрования. Это означает, что любой, кто может перехватить трафик, может прочитать отправленные данные, включая логины, пароли и другую конфиденциальную информацию.

HTTPS использует протокол SSL/TLS для шифрования передаваемых данных между клиентом и сервером, что обеспечивает безопасность соединения. Когда вы используете HTTPS, ваше соединение шифруется, что делает невозможным для злоумышленника перехватить данные или изменить их. Это особенно важно при передаче конфиденциальной информации, такой как логины, пароли, данные банковских карт и т.д.

23
Q

Отличие Url от Uri

A

URI (Uniform Resource Identifier) и URL (Uniform Resource Locator) - это два понятия, которые часто используются в контексте веб-разработки. URI - это строка символов, которая идентифицирует уникальный ресурс в Интернете, в то время как URL - это подмножество URI, которое включает информацию о том, как получить доступ к этому ресурсу.
URI это путь до конкретного ресурса, над которым требуется совершить операцию.

URI является общим термином, который используется для идентификации ресурсов в Интернете. Он может содержать имя протокола (например, http, ftp), имя хоста, путь к файлу и параметры запроса. URL является конкретным типом URI, который содержит дополнительную информацию о том, как получить доступ к ресурсу, например, с помощью протокола HTTP или FTP.

Вот некоторые отличия между URL и URI:

URL - это подмножество URI. Таким образом, все URL являются URI, но не все URI являются URL.

URL всегда указывает на местоположение ресурса, тогда как URI может указывать на что-то другое, например, на определенный порт или параметр.

URL содержит информацию о том, как получить доступ к ресурсу, например, протокол, имя хоста, порт и путь к файлу, в то время как URI может содержать только идентификатор ресурса.

URL всегда содержит протокол, например, HTTP или FTP, тогда как URI может быть без протокола.

В целом, URI - это более общее понятие, которое описывает уникальный идентификатор ресурса, а URL - это конкретный тип URI, который содержит информацию о том, как получить доступ к этому ресурсу с помощью определенного протокола.

24
Q

DTO

A

DTO (Data Transfer Object) - это объект, который используется для передачи данных между слоями или компонентами приложения. В Spring Framework DTO-объекты могут использоваться для передачи данных между клиентом и сервером, между контроллером и сервисом или между сервисом и репозиторием.

DTO-объекты в Spring обычно представляют собой простые классы с полями, которые соответствуют данным, передаваемым между слоями приложения. Они могут содержать аннотации для сериализации и десериализации данных, а также для валидации данных на стороне клиента и сервера.

Пример DTO-объекта в Spring:

public class UserDTO {
    private String firstName;
    private String lastName;
    private String email;

    public UserDTO() {}

    public UserDTO(String firstName, String lastName, String email) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.email = email;
    }

    // геттеры и сеттеры
}

DTO-объекты в Spring часто используются для преобразования данных между разными форматами, такими как JSON и XML, а также для упрощения передачи данных между компонентами приложения. Они помогают разделить логику и данные приложения, упрощая его разработку и сопровождение.

25
Q

OpenAPI

A

OpenAPI (ранее известный как Swagger) - это набор инструментов и стандартов, которые позволяют описывать, создавать, документировать и использовать RESTful API. Это язык описания веб-сервисов, который позволяет автоматически создавать клиентские библиотеки, документацию и различные инструменты для работы с API.

Swagger — это фрэймворк для описания, документирования и визуализации REST API. На основании спецификации Swagger можно генерировать исходный код для библиотек клиентских приложений, текстовую документацию для пользователей, варианты тестирования и др. Для этого имеется множество инструментов для различных языков программирования и платформ.

Инструмент представляет собой языконезависимую утилиту. Это значит, что Swagger создаёт чёткую документацию, которая читается одинаково хорошо как человеком, так и машиной, позволяя автоматизировать процессы зависящие от API.

С помощью OpenAPI можно описать структуру API, включая доступные ресурсы, методы, параметры запросов и ответы, а также форматы данных, используемые при обмене информацией. Описание API в формате OpenAPI может быть использовано для автоматической генерации документации, тестирования API, а также для автоматической генерации кода клиентских библиотек для работы с API на разных языках программирования.

Преимущества использования OpenAPI включают:

  • Улучшенная документация API: OpenAPI позволяет автоматически создавать документацию на основе описания API, что делает документацию более полной и актуальной.
  • Ускорение разработки: автоматическая генерация кода клиентских библиотек позволяет быстрее начать работу с API.
  • Удобство тестирования: OpenAPI позволяет автоматически генерировать тесты для проверки работы API, что упрощает процесс тестирования.
  • Улучшенная совместимость: использование стандартизированного языка описания API позволяет улучшить совместимость между различными системами и приложениями.
26
Q

Какие аннотации используются в Spring REST и для чего они нужны?

A

В Spring REST есть несколько аннотаций, которые используются для определения конфигурации API и обеспечения интеграции между различными функциональными элементами Spring. Некоторые из наиболее распространенных аннотаций Spring REST включают в себя:

@RestController - аннотация, которая используется для определения класса контроллера REST API в Spring. Эта аннотация комбинирует в себе аннотации @Controller и @ResponseBody, и позволяет автоматически сериализовать результаты запросов в JSON или XML.

@RequestMapping - аннотация, которая определяет путь запроса, который будет обрабатываться контроллером. Эта аннотация может использоваться на уровне класса и/или метода, и позволяет определить, какой HTTP-метод будет использоваться для обработки запроса (GET, POST, PUT, DELETE и т.д.).

@PathVariable - аннотация, которая используется для получения значения переменной из URI-шаблона запроса. Эта аннотация может быть использована вместе с @RequestMapping для получения динамических параметров из пути запроса.

@RequestParam - аннотация, которая используется для получения значения параметра запроса из строки запроса. Эта аннотация может быть использована вместе с @RequestMapping для получения параметров запроса.

@RequestBody - аннотация, которая используется для получения данных запроса из тела запроса. Эта аннотация может использоваться в методах контроллера для получения данных, отправленных клиентом в теле запроса.

@ResponseBody - аннотация, которая используется для указания, что результат запроса должен быть сериализован в теле ответа. Эта аннотация может быть использована в методах контроллера, чтобы указать, что возвращаемый объект должен быть сериализован и отправлен клиенту в качестве тела ответа.

@ResponseStatus - аннотация, которая используется для определения кода состояния HTTP-ответа. Эта аннотация может быть использована в методах контроллера для указания кода состояния, который должен быть возвращен в ответ на запрос.

Это только некоторые из наиболее распространенных аннотаций, используемых в Spring REST. В зависимости от ваших потребностей, вы можете использовать другие аннотации, такие как @GetMapping, @PostMapping, @PutMapping и @DeleteMapping, чтобы определить HTTP-методы, которые вы хотите использовать в своем API.

27
Q

Как в Spring REST осуществляется обработка ошибок?

A

В Spring REST обработка ошибок может быть реализована с помощью механизма обработчиков исключений (exception handling). Механизм обработки исключений в Spring REST позволяет определять, как приложение должно обрабатывать исключения, которые возникают в процессе обработки запросов.

Когда исключение возникает в процессе обработки запроса в Spring REST, оно перехватывается и передается в обработчик исключений. Обработчик исключений затем может выполнить необходимые действия, например, вернуть сообщение об ошибке в формате JSON.

В Spring REST можно определить глобальный обработчик исключений, который будет применяться ко всем запросам в приложении. Это можно сделать, создав класс, помеченный аннотацией @RestControllerAdvice. Этот класс может содержать методы, которые обрабатывают различные типы исключений, используя аннотацию @ExceptionHandler.

Например, вы можете создать класс GlobalExceptionHandler, который будет обрабатывать исключения типа NotFoundException, BadRequestException и т.д.:

@RestControllerAdvice
public class GlobalExceptionHandler {

  @ExceptionHandler(NotFoundException.class)
  public ResponseEntity<ErrorResponse> handleNotFoundException(NotFoundException ex) {
    ErrorResponse errorResponse = new ErrorResponse(HttpStatus.NOT_FOUND.value(), ex.getMessage());
    return new ResponseEntity<>(errorResponse, HttpStatus.NOT_FOUND);
  }

  @ExceptionHandler(BadRequestException.class)
  public ResponseEntity<ErrorResponse> handleBadRequestException(BadRequestException ex) {
    ErrorResponse errorResponse = new ErrorResponse(HttpStatus.BAD_REQUEST.value(), ex.getMessage());
    return new ResponseEntity<>(errorResponse, HttpStatus.BAD_REQUEST);
  }
  
  // Другие методы для обработки других типов исключений

}

Когда исключение типа NotFoundException или BadRequestException возникает в процессе обработки запроса, оно будет перехвачено и обработано соответствующим методом в GlobalExceptionHandler. Метод создает объект ErrorResponse, который содержит информацию об ошибке, и возвращает его в формате JSON с соответствующим кодом состояния HTTP.

Вы также можете определить обработчики исключений на уровне методов в контроллерах. В этом случае, обработчик исключения будет применяться только к запросам, обрабатываемым этим методом.