|
@@ -0,0 +1,169 @@
|
|
|
|
|
+# Проект "база". Авторизация на сервере (Basic auth, token).
|
|
|
|
|
+
|
|
|
|
|
+## API
|
|
|
|
|
+
|
|
|
|
|
+Приведу пример описания API, которое было на моём демо-экзамене:
|
|
|
|
|
+
|
|
|
|
|
+>API доступно по адресу http://car.areas.su/
|
|
|
|
|
+>Для работы с API метод принимает в теле application/json
|
|
|
|
|
+>Например:
|
|
|
|
|
+>Метод входа. Ссылка http://cars.areas.su/login
|
|
|
|
|
+>
|
|
|
|
|
+>Request Body(application/json)
|
|
|
|
|
+>```json
|
|
|
|
|
+>{
|
|
|
|
|
+> "username":"serk",
|
|
|
|
|
+> "password":"123"
|
|
|
|
|
+>}
|
|
|
|
|
+>```
|
|
|
|
|
+>
|
|
|
|
|
+>Response
|
|
|
|
|
+>
|
|
|
|
|
+>```json
|
|
|
|
|
+>{
|
|
|
|
|
+> "notice":
|
|
|
|
|
+> {
|
|
|
|
|
+> "token":111520
|
|
|
|
|
+> }
|
|
|
|
|
+>}
|
|
|
|
|
+>```
|
|
|
|
|
+>
|
|
|
|
|
+>1 **/login** – метод для получения ключа для входа
|
|
|
|
|
+> - Используется метод POST
|
|
|
|
|
+> - Формат запроса JSON
|
|
|
|
|
+> - Принимает два ключа username и password
|
|
|
|
|
+> - ответ в формате JSON
|
|
|
|
|
+>
|
|
|
|
|
+>2 **/logout** – метод обнуления действия token
|
|
|
|
|
+> - Используется метод POST
|
|
|
|
|
+> - Формат запроса JSON
|
|
|
|
|
+> - Принимает ключ username
|
|
|
|
|
+>
|
|
|
|
|
+>3 **/signup** – метод регистрации нового пользователя
|
|
|
|
|
+> - Используется метод POST
|
|
|
|
|
+> - Формат запроса JSON
|
|
|
|
|
+> - Принимает ключ username, email, password
|
|
|
|
|
+>
|
|
|
|
|
+>4 **/cars** – метод для получения свободных автомобилей
|
|
|
|
|
+> - Используется метод GET
|
|
|
|
|
+> - Формат ответа JSON
|
|
|
|
|
+>
|
|
|
|
|
+>5 **/history** – метод для получения истории вождения
|
|
|
|
|
+> - Используется метод POST
|
|
|
|
|
+> - Формат запроса JSON
|
|
|
|
|
+> - **Принимает ключ token**
|
|
|
|
|
+> - Формат ответа JSON
|
|
|
|
|
+
|
|
|
|
|
+Несколько косноязычно и не расписаны "подводные камни". Логика авторизации такая, что если токен уже получен, то новый не выдается - нужно сначала разлогиниться.
|
|
|
|
|
+
|
|
|
|
|
+Методы есть как публичные (**/cars**), так и требующие авторизации (**/history** - это видно по тому, что в параметрах требуется токен).
|
|
|
|
|
+
|
|
|
|
|
+Я на примере этого разработал АПИ для ваших баз:
|
|
|
|
|
+
|
|
|
|
|
+1. Создаем файл `api.http`:
|
|
|
|
|
+
|
|
|
|
|
+ >Примеры запросов реализованы в формате плагина **REST Client** для Visual Studio Code
|
|
|
|
|
+
|
|
|
|
|
+ Прописываем в нем URL сервера:
|
|
|
|
|
+
|
|
|
|
|
+ ```
|
|
|
|
|
+ @url=http://s4a.kolei.ru
|
|
|
|
|
+ ```
|
|
|
|
|
+
|
|
|
|
|
+2. Проверить работоспособность можно послав запрос **/about**:
|
|
|
|
|
+
|
|
|
|
|
+ ```
|
|
|
|
|
+ GET {{url}}/about
|
|
|
|
|
+ ```
|
|
|
|
|
+
|
|
|
|
|
+3. Для авторизации нужно послать **POST** запрос **/login** в формате `application/json` с параметрами *username* и *password* (соответственно логин и пароль к ВАШЕЙ базе MySQL)
|
|
|
|
|
+
|
|
|
|
|
+ ```
|
|
|
|
|
+ ### логин
|
|
|
|
|
+ # @name login
|
|
|
|
|
+ POST {{url}}/login
|
|
|
|
|
+ Content-Type: application/json
|
|
|
|
|
+
|
|
|
|
|
+ {
|
|
|
|
|
+ "username": "esmirnov",
|
|
|
|
|
+ "password": "111103"
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ ###
|
|
|
|
|
+ @token={{login.response.body.$.notice.token}}
|
|
|
|
|
+ ```
|
|
|
|
|
+
|
|
|
|
|
+ Тут встречаются средства автоматизации **REST Client**-а:
|
|
|
|
|
+
|
|
|
|
|
+ * `# @name login` этой командой мы присваиваем имя текущему запросу
|
|
|
|
|
+ * `@token={{login.response.body.$.notice.token}}` а здесь, используя ответ команды достаём токен. Таким образом для последующих команд не надо выписывать на бумажке токен и править запросы.
|
|
|
|
|
+
|
|
|
|
|
+ При успешном ответе придет токен авторизации:
|
|
|
|
|
+
|
|
|
|
|
+ ```json
|
|
|
|
|
+ {
|
|
|
|
|
+ "notice": {
|
|
|
|
|
+ "token": 2200743
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ ```
|
|
|
|
|
+
|
|
|
|
|
+ При ошибке текст ошибки в поле *answer*:
|
|
|
|
|
+
|
|
|
|
|
+ ```json
|
|
|
|
|
+ {
|
|
|
|
|
+ "notice": {
|
|
|
|
|
+ "answer": "Пользователь уже авторизован, используйте токен или перелогиньтесь"
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ ```
|
|
|
|
|
+
|
|
|
|
|
+ То есть при получении ответа вы должны разобрать полученный JSON, если есть токен, то можно продолжать работать. Если ошибка, то показать **Alert** с ошибкой и остаться на экране авторизации.
|
|
|
|
|
+
|
|
|
|
|
+4. Для выхода нужно послать **POST** запрос **/logout** c параметом *username*:
|
|
|
|
|
+
|
|
|
|
|
+ ```
|
|
|
|
|
+ POST {{url}}/logout
|
|
|
|
|
+ Content-Type: application/json
|
|
|
|
|
+
|
|
|
|
|
+ {
|
|
|
|
|
+ "username": "esmirnov"
|
|
|
|
|
+ }
|
|
|
|
|
+ ```
|
|
|
|
|
+
|
|
|
|
|
+5. Для запроса данных из базы нужно послать **GET** запрос с названием таблицы. В заголовке запроса передать токен полученный при авторизации (я сначала сделал передачу токена в заголовке, а только потом увидел, что надо было передавать в теле запроса).
|
|
|
|
|
+
|
|
|
|
|
+ ```
|
|
|
|
|
+ GET {{url}}/Product
|
|
|
|
|
+ Content-Type: application/json
|
|
|
|
|
+ Token: {{token}}
|
|
|
|
|
+ ```
|
|
|
|
|
+
|
|
|
|
|
+ В ответ должны получить содержимое таблицы:
|
|
|
|
|
+
|
|
|
|
|
+ ```json
|
|
|
|
|
+ {
|
|
|
|
|
+ "notice": {
|
|
|
|
|
+ "data": [
|
|
|
|
|
+ {
|
|
|
|
|
+ "ID": 1,
|
|
|
|
|
+ "Title": "Колесо R18 Кованый",
|
|
|
|
|
+ "ProductTypeID": 128,
|
|
|
|
|
+ "ArticleNumber": "241659",
|
|
|
|
|
+ "Description": null,
|
|
|
|
|
+ "Image": "\\products\\tire_15.jpg",
|
|
|
|
|
+ "ProductionPersonCount": 4,
|
|
|
|
|
+ "ProductionWorkshopNumber": 10,
|
|
|
|
|
+ "MinCostForAgent": 11509
|
|
|
|
|
+ },
|
|
|
|
|
+ ...
|
|
|
|
|
+ ]
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ ```
|
|
|
|
|
+
|
|
|
|
|
+6. Для получения изображений нужно выделить его название из поля *Image* и сформировать **GET** запрос:
|
|
|
|
|
+
|
|
|
|
|
+ ```
|
|
|
|
|
+ GET {{url}}/img/tire_0.jpg
|
|
|
|
|
+ ```
|