Павлов Михаил
https://www.youtube.com/playlist?list=PLmEQRj1_Mt5f5MlXGlf5kzldb9Rl8Pwuo
Михаил
Павлов
shell:>joke
Chuck Norris hosting is 101% uptime guaranteed.
shell:>joke
Product Owners never ask Chuck Norris for more features.
They ask for mercy.Сделать веб-приложение со списком вопросов
(*) - Опционально
Отделить бизнес-логику от ее визуализации
Сделать веб-приложение со списком вопросов
1. Создавать страницы на сервере (шаблонизатор)
2. Отдельное SPA, с которым можно работать через REST
http://my-site.ru/folder/index.html
Протокол
Доменное имя
Путь
GET /security/auth HTTP/1.1
Host: www.my-site.ru
Accept-Language: en-us
Метод
Путь
Версия протокола
Заголовки
* Для некоторых типов запросов есть еще тело (Body)
| Метод | Описание |
|---|---|
| GET | Получить данные объекта |
| PUT | Изменить / обновить объект |
| POST | Создать объект |
| DELETE | Удалить объект |
Протокол взаимодействия приложений
(HyperText Transfer Protocol)
Основные методы:
(Representational State Transfer)
Набор договоренностей о взаимодействии
Ключевые моменты:
| Метод | Описание |
|---|---|
| GET /books/ | получить список всех книг |
| GET /books/3/ | получить книгу номер 3 |
| POST /books/ | добавить книгу (данные в теле запроса) |
| PUT /books/3 | изменить книгу номер 3 (данные в теле запроса) |
| DELETE /book/3 | удалить книгу номер 3 |
Веб-сервер (open-source)
*Продуктовый сервер энтерпрайз уровня
Тип метода: GET
URL: http://localhost:8080/api/journal/<строка с id журнала>
Пример: http://localhost:8080/api/journal/questions
Ожидаемый ответ:
Пример ответа (JSON):
{
id: string;
name: string;
defaultPageSize?: number;
}{
"id": "questions",
"name": "Вопросы",
"defaultPageSize": 15
}Тип метода: PUT
URL: http://localhost:8080/api/journal/<строка с id журнала>/rows
Пример: http://localhost:8080/api/journal/questions/rows
Тело запроса:
Пример тела запроса (JSON):
{ journalId: string;
search: string;
filters: JournalFilterItem[];
page: number;
pageSize: number; }{ type: string;
code: string;
value: string; }JournalFilterItem:
{ "journalId": "questions",
"search": "someText",
"filters": [{
"code": "question-answer-count",
"type": "single-select",
"value": 2
}],
"page": 1,
"pageSize": 15 }Ожидаемые ответ:
Пример тела ответа (JSON):
{
total: number;
items:
[{
id: string;
name: string;
answersCount: number;
}]
}{
"total" : 2,
"items":
[{
"id": 1,
"name": "Вопрос 1",
"answersCount": 4
}, {
"id": 2,
"name": "Вопрос 2",
"answersCount": 3
}]
}Client
Application
Request (HTTP)
Dispatcher Servlet
Handler Mapping
Response (HTTP)
REST controller
Database
Service (BL)
Поиск нужного контроллера
Ответ
Tomcat
@RestController
@RequestMapping("api/journal")
public class JournalRestController {
...
}и др. http-методы
@GetMapping("{id}")
public JournalEntityDTO getJournalEntity(@PathVariable String id) {
return journals.get(0);
}
@PutMapping("{id}/rows")
public JournalResultDTO getRows(
@PathVariable String id, @RequestBody JournalRequestDTO dto) {
return new JournalResultDTO(questions);
}@PutMapping("{id}/rows")
public JournalResultDTO getRows(
@PathVariable String id,
@RequestParam(required = false, name = "q") String queryString,
@RequestBody JournalRequestDTO dto
) {
return new JournalResultDTO(questions);
}http://localhost:8080/api/journal/questions/rows?q=someText
By Павлов Михаил
Spring MVC. Rest API