Файл: Spring boot, spring security и rest spring security.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 26.10.2023

Просмотров: 51

Скачиваний: 2

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

@PostMapping("/request")
public ResponseEntity postController(
@RequestBody LoginForm loginForm) {

exampleService.fakeAuthenticate(loginForm);
return ResponseEntity.ok(HttpStatus.OK);
}


Аннотация @ResponseBody дает фреймворку понять, что объект, который вернули метода надо прогнать через HttpMessageConverter, чтобы получить готовое к отправке на клиент представление. В этот момент происходит обратная сериализация сущности в HttpResponse.

@Controller
@RequestMapping("/post")
public class ExamplePostController {

@Autowired
ExampleService exampleService;

@PostMapping("/response")
@ResponseBody
public ResponseTransfer postResponseController(
@RequestBody LoginForm loginForm) {
return new ResponseTransfer("Thanks For Posting!!!");
}
}


Сериализация / десериализация RequestBody / ResponseBody, конечно, не ограничивается JSON (необходимо прописать пути к классам до Jackson), оба могут обрабатывать несколько форматов, включая простой текст и XML, но JSON, вероятно, является наиболее часто используемым форматом.


  • Что такое AJAX/fetch?

Для сетевых запросов из JavaScript есть широко известный термин «AJAX» (аббревиатура от Asynchronous JavaScript And XML). Данная технология предоставляет возможность отправлять сетевые запросы на сервер и подгружать новую информацию по мере необходимости.

Есть несколько способов делать сетевые запросы и получать информацию с сервера.

Метод fetch() — современный и очень мощный, XMLHttpRequest нового поколения. Он не поддерживается старыми (можно использовать полифил), но поддерживается всеми современными браузерами.

Базовый синтаксис:

let promise = fetch(url, [options])
/*url - URL для отправки запроса.
options - дополнительные параметры: метод, заголовки и так далее*/


  • Чем аннотация RestController отличается от Controller

@RestController – это просто сокращенная запись для @Controller + @ResponseBody.


  • RestTemplate и его методы

RestTemplate это специальный клиент для отправки запросов в Spring. Он предоставляет удобные API для легкого вызова конечных точек REST’а в одну строку.

RestTemplate restTemplate = new RestTemplate();
String fooResourceUrl =
"http://localhost:8080/spring-rest/foos";
ResponseEntity response = restTemplate.getForEntity(fooResourceUrl +
"/1", String.class);


Основные методы:

getForEntity - выполняет запрос GET и возвращает объект ResponseEntity;

getForObject - аналогично getForEntity, но возвращает ресурс напрямую;

exchange - выполняет указанный метод HTTP, такой как GET, POST, PUT и т. д., и возвращает объект ResponseEntity;

execute - аналогичен exchange методу, но требует дополнительных параметров: RequestCallback и ResultSetExtractor;

headForHeaders - выполняет запрос HEAD и возвращает все заголовки;

optionsForAllow - выполняет запрос OPTIONS и использует заголовок Allow;

delete - удаляет ресурсы по указанному URL-адресу с помощью метода HTTP DELETE;

put - обновляет ресурс для заданного URL-адреса с помощью метода HTTP PUT;

postForObject - создает новый запрос с использованием метода HTTP POST и возвращает сущность;

postForLocation - создает новый запрос с использованием метода HTTP POST и возвращает его расположение;
HTTP

  • Что такое HTTP, основные его методы?

HTTP (англ. - Hyper Text Transfer Protocol) — широко распространённый протокол передачи данных, изначально предназначенный для передачи гипертекстовых документов (то есть документов, которые могут содержать ссылки, позволяющие организовать переход к другим документам).

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

Задача, которая традиционно решается с помощью протокола HTTP — обмен данными между пользовательским приложением, осуществляющим доступ к веб-ресурсам (обычно это веб-браузер) и веб-сервером. На данный момент именно благодаря протоколу HTTP обеспечивается работа Всемирной паутины.
GET

Метод GET запрашивает представление ресурса. Запросы с использованием этого метода могут только извлекать данные.

HEAD

Запрашивает ресурс так же, как и метод GET, но без тела ответа.

POST

Используется для отправки сущностей к определённому ресурсу. Часто вызывает изменение состояния или какие-то побочные эффекты на сервере.

PUT

Заменяет все текущие представления ресурса данными запроса.

DELETE

Удаляет указанный ресурс.


  • Идемпотентность HTTP-методов

Метод считается «идемпотентным», если

эффект на сервер от одного запроса такой же как от нескольких идентичных запросов такого типа. PUT, DELETE и безопасные методы (только на чтение — не изменяют состояние сервера) запросы являются идемпотентными.

Другими словами если многократное повторение одних и тех же запросов возвращает одинаковые результаты, то метод считается идемпотентным.

Идемпотентный и небезопасный — значит, что, сколько бы ни повторялся запрос, только первый изменит состояние системы, а остальные состояние системы не меняют.

Идемпотентный и безопасный — многократное повторение запроса вернет одно и то же состояние системы (если ресурс не изменился между ними по иным причинам).

Из спецификации HTTP:


Метод

Безопасный

Идемпотентный

Ссылка

CONNECT

нет

нет

Section 4.3.6

DELETE

нет

да

Section 4.3.5

GET

да

да

Section 4.3.1

HEAD

да

да

Section 4.3.2

OPTIONS

да

да

Section 4.3.7

POST

нет

нет

Section 4.3.3

PUT

нет

да

Section 4.3.4

TRACE

да

да

Section 4.3.8




  • Что такое http-заголовок? Что такое http-сессия?

HTTP Заголовки (англ. HTTP Headers) - это строки в HTTP-сообщении, содержащие разделенную двоеточием пару параметр-значение.

Заголовки должны отделяться от тела сообщения хотя бы одной пустой строкой.

Пример:

Server: Apache/2.2.11 (Win32) PHP/5.3.0

Last-Midified: Sat, 16 Jan 2010 21:16:42 GMT

Content-Type: text/plain; charset=windows-1251

Content-Language: ru
Сессия — это диалоговое состояние между клиентом и сервером, включающее информацию о предыдущих запросах клиента и ответах сервера.

Так как HTTP — это клиент-серверный протокол, HTTP сессия состоит из трёх фаз:

Клиент устанавливает TCP соединения (или другое соединение, если не используется TCP транспорт).


Клиент отправляет запрос и ждёт ответа.

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

Начиная с версии HTTP/1.1, после третьей фазы соединение не закрывается, так как клиенту позволяется инициировать другой запрос. То есть, вторая и третья фазы могут повторяться.


  • Коды состояний HTTP

1xx информационное

2хх успешно

3хх редирект

4хх ошибка клиента

5хх ошибка сервера
Другое

  • Разница между SpringBoot и SpringMVC

Прежде всего, это две разные технологии, и задачи, которые они решают, разные.

Spring MVC - это фреймворк, основанный на сервлетах. Он решает проблему разработки Web-сервисов с помощью Dispatcher Servlet и ModelAndView. Его конфигурация громоздка, с большим количеством файлов .xml и .properties, а при использовании сборщика проектов maven легко возникают конфликты пакетов jar.

Spring Boot - это пакет для быстрой разработки и интеграции на основе Spring, который включает не только Spring MVC, но также Spring JPA и Spring Security. Призван реализовать автоматическую настройку и снизить сложность построения проекта. А встроенный сервер Tomcat упрощает запуск и решает проблему конфликтов пакетов jar.


  • Разница между @PathVariable и @RequestParam

Аннотация @RequestParam используется для доступа к значениям параметров из запроса.

/*http://localhost:8080/springmvc/hello/101?param1=10&param2=20
*/

public String getDetails(@RequestParam(value="param1",required=true) String param1, @RequestParam(value="param2", required=false) String param2){
...
}


@PathVariable определяет шаблон, который используется в URI входящего запроса.

/*http://localhost:8080/springmvc/hello/101?param1=10&param2=20*/
@RequestMapping("/hello/{id}")

public String getDetails(@PathVariable(value="id")String id,
@
RequestParam(value="param1", required=true)String param1,
@
RequestParam(value="param2", required=false)String param2){
.......
}


  • Определение реактивных потоков данных


Reactive Streams – это инициатива, запущенная в конце 2013 года инженерами из Netflix, Lightbend и Pivotal (последняя компания в этом списке как раз и занимается разработкой Spring). Цель Reactive Streams – поддержка стандарта асинхронной обработки потоков с неблокирующим обратным давлением (backpressure).

Это позволяет выполнять задачи параллельно и достигать большей масштабируемости. Обратное давление – это средство, помогающее получателям данных избежать перегрузки при работе со слишком быстрым источником данных; с его помощью получатели могут установить ограничение на объем, который они готовы обработать в единицу времени.

Спецификацию Reactive Streams можно свести к четырем определениям интерфейсов: Publisher, Subscriber, Subscription и Processor.

Издатель Publisher создает данные и отправляет их подписчику Subscriber. Интерфейс издателя Publisher объявляет единственный метод subscribe(), с помощью которого подписчик Subscriber может подписаться на события издателя. После оформления подписки подписчик Subscriber может получать события от издателя. Эти события отправляются через методы в интерфейсе подписчика Subscriber.

Первое событие, которое получит подписчик, – это вызов onSubscribe(). Когда издатель вызывает onSubscribe(), он передает объект Subscription подписчику. Именно через Subscription подписчик Subscribe может управлять своей подпиской.

После запроса данных подписчиком Subscriber они начинают передаваться через поток.

Так же как подписчик Subscriber, процессор Processor будет получать и каким-то образом обрабатывать данные. Затем он сменит ориентацию и будет действовать как издатель Publisher, чтобы опубликовать новые данные для своих подписчиков.

Следует упомянуть также об основных типах, реализующих интерфейс Publisher: Mono и Flux. Тип Flux представляет конвейер из произвольного количества (от нуля до бесконечности) элементов данных. Mono – это специализированный реактивный тип, оптимизированный для случаев, когда известно, что набор данных содержит не более одного элемента данных.

  • RestTemplate vs WebClient

RestTemplate появился еще в версии Spring 3.0. В свое время он использовался для выполнения запросов от имени приложений, которые его используют.

Но все методы RestTemplate работают с нереактивными прикладными типами и коллекциями.

Spring предлагает WebClient – реактивную альтернативу RestTemplate. WebClient позволяет отправлять и получать реактивные типы при работе с внешними API.

Использование WebClient сильно отличается от использования RestTemplate. Вместо нескольких методов для работы с разными типами запросов WebClient предлагает гибкий интерфейс в стиле конструктора, который позволяет описывать и отправлять запросы. Вот как выглядит