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