Павлов Михаил
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