Урок 14: Добавьте HTTP-коммуникацию в ваше приложение¶
Этот урок демонстрирует, как интегрировать HTTP и API в ваше приложение.
До этого момента ваше приложение считывало данные из статического массива в сервисе Angular. Следующим шагом будет использование сервера JSON, с которым ваше приложение будет взаимодействовать по HTTP. HTTP-запрос будет имитировать работу с данными с сервера.
Затраты времени: ожидайте, что на выполнение этого урока вы потратите около 20 минут.
Перед началом¶
Этот урок начинается с кода из предыдущего урока, поэтому вы можете:
-
Использовать код, созданный в Уроке 13, в своей интегрированной среде разработки (IDE).
-
Начните с примера кода из предыдущего урока. Выберите код из Урока 13, где вы можете:
-
Использовать живой пример в StackBlitz, где интерфейс StackBlitz является вашей IDE.
-
Использовать download пример и открыть его в вашей IDE.
-
Если вы не просмотрели введение, посетите учебник Введение в Angular, чтобы убедиться, что у вас есть все необходимое для завершения этого урока.
После завершения¶
- Ваше приложение будет использовать данные с сервера JSON.
Шаги урока¶
Выполните эти шаги в терминале на вашем локальном компьютере.
Шаг 1 — Настройка сервера JSON¶
JSON Server — это инструмент с открытым исходным кодом, используемый для создания имитационных REST API. Вы будете использовать его для обслуживания данных о местоположении жилья, которые в настоящее время хранятся в службе жилья.
-
Установите
json-serverиз npm с помощью следующей команды.1npm install -g json-server -
В корневом каталоге проекта создайте файл
db.json. В нем будут храниться данные дляjson-server. -
Откройте файл
db.jsonи скопируйте в него следующий код1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
{ "locations": [ { "id": 0, "name": "Acme Fresh Start Housing", "city": "Chicago", "state": "IL", "photo": "/assets/bernard-hermant-CLKGGwIBTaY-unsplash.jpg", "availableUnits": 4, "wifi": true, "laundry": true }, { "id": 1, "name": "A113 Transitional Housing", "city": "Santa Monica", "state": "CA", "photo": "/assets/brandon-griggs-wR11KBaB86U-unsplash.jpg", "availableUnits": 0, "wifi": false, "laundry": true }, { "id": 2, "name": "Warm Beds Housing Support", "city": "Juneau", "state": "AK", "photo": "/assets/i-do-nothing-but-love-lAyXdl1-Wmc-unsplash.jpg", "availableUnits": 1, "wifi": false, "laundry": false }, { "id": 3, "name": "Homesteady Housing", "city": "Chicago", "state": "IL", "photo": "/assets/ian-macdonald-W8z6aiwfi1E-unsplash.jpg", "availableUnits": 1, "wifi": true, "laundry": false }, { "id": 4, "name": "Happy Homes Group", "city": "Gary", "state": "IN", "photo": "/assets/krzysztof-hepner-978RAXoXnH4-unsplash.jpg", "availableUnits": 1, "wifi": true, "laundry": false }, { "id": 5, "name": "Hopeful Apartment Group", "city": "Oakland", "state": "CA", "photo": "/assets/r-architecture-JvQ0Q5IkeMM-unsplash.jpg", "availableUnits": 2, "wifi": true, "laundry": true }, { "id": 6, "name": "Seriously Safe Towns", "city": "Oakland", "state": "CA", "photo": "/assets/phil-hearing-IYfp2Ixe9nM-unsplash.jpg", "availableUnits": 5, "wifi": true, "laundry": true }, { "id": 7, "name": "Hopeful Housing Solutions", "city": "Oakland", "state": "CA", "photo": "/assets/r-architecture-GGupkreKwxA-unsplash.jpg", "availableUnits": 2, "wifi": true, "laundry": true }, { "id": 8, "name": "Seriously Safe Towns", "city": "Oakland", "state": "CA", "photo": "/assets/saru-robert-9rP3mxf8qWI-unsplash.jpg", "availableUnits": 10, "wifi": false, "laundry": false }, { "id": 9, "name": "Capital Safe Towns", "city": "Portland", "state": "OR", "photo": "/assets/webaliser-_TPTXZd9mOo-unsplash.jpg", "availableUnits": 6, "wifi": true, "laundry": true } ] } -
Сохраните этот файл.
-
Пришло время протестировать конфигурацию. Из командной строки в корне проекта выполните следующие команды.
1json-server --watch db.json -
В веб-браузере перейдите по адресу
http://localhost:3000/locationsи убедитесь, что ответ включает данные, хранящиеся в файлеdb.json.
Если у вас возникли проблемы с конфигурацией, вы можете найти более подробную информацию в официальной документации.
Шаг 2 — Обновление сервиса для использования веб-сервера вместо локального массива¶
Источник данных настроен, следующим шагом будет обновление веб-приложения для подключения к нему и использования данных.
-
В
src/app/housing.service.tsвнесите следующие изменения:-
Обновите код, чтобы удалить свойство
housingLocationListи массив, содержащий данные. -
Добавьте строковое свойство с именем и установите значение
'http://localhost:3000/locations'.1url = 'http://localhost:3000/locations';Этот код приведет к ошибкам в остальной части файла, поскольку он зависит от свойства
housingLocationList. Далее мы обновим методы сервиса. -
Обновите функцию
getAllHousingLocations, чтобы она выполняла вызов веб-сервера, который вы настроили.1 2 3 4
async getAllHousingLocations(): Promise<HousingLocation[]> { const data = await fetch(this.url); return await data.json() ?? []; }Теперь код использует асинхронный код для выполнения
getзапроса черезHTTP. Обратите внимание, что для этого примера в коде используется fetch. Для более продвинутых случаев использования рассмотрим использованиеHttpClient, предоставляемого Angular. -
Обновите функцию
getHousingLocationsById, чтобы сделать вызов к веб-серверу, который вы настроили.1 2 3 4
async getHousingLocationById(id: number): Promise<HousingLocation | undefined> { const data = await fetch(`${this.url}/${id}`); return await data.json() ?? {}; } -
Когда все обновления будут завершены, ваш обновленный сервис будет соответствовать следующему коду.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
import { Injectable } from '@angular/core'; import { HousingLocation } from './housinglocation'; @Injectable({ providedIn: 'root', }) export class HousingService { url = 'http://localhost:3000/locations'; async getAllHousingLocations(): Promise< HousingLocation[] > { const data = await fetch(this.url); return (await data.json()) ?? []; } async getHousingLocationById( id: number ): Promise<HousingLocation | undefined> { const data = await fetch( `${this.url}/${id}` ); return (await data.json()) ?? {}; } submitApplication( firstName: string, lastName: string, email: string ) { console.log(firstName, lastName, email); } }
-
Шаг 3 — Обновление компонентов для использования асинхронных вызовов службы жилья¶
Сервер теперь читает данные из запроса HTTP, но компоненты, которые полагаются на службу, теперь имеют ошибки, потому что они были запрограммированы на использование синхронной версии службы.
-
В
src/app/home/home.component.tsобновите конструктор, чтобы использовать новую асинхронную версию методаgetAllHousingLocations.1 2 3 4 5 6
constructor() { this.housingService.getAllHousingLocations().then((housingLocationList: HousingLocation[]) => { this.housingLocationList = housingLocationList; this.filteredLocationList = housingLocationList; }); } -
В
src/app/details/details.component.tsобновите конструктор, чтобы использовать новую асинхронную версию методаgetHousingLocationById.1 2 3 4 5 6
constructor() { const housingLocationId = parseInt(this.route.snapshot.params['id'], 10); this.housingService.getHousingLocationById(housingLocationId).then(housingLocation => { this.housingLocation = housingLocation; }); } -
Сохраните свой код.
-
Откройте приложение в браузере и убедитесь, что оно работает без ошибок.
Обзор урока¶
В этом уроке вы обновили свое приложение, чтобы:
-
использовать локальный веб-сервер (
json-server) -
использовать асинхронные методы сервиса для получения данных.
Поздравляем! Вы успешно завершили этот урок и готовы продолжить свое путешествие по созданию еще более сложных приложений Angular Apps. Если вы хотите узнать больше, пожалуйста, рассмотрите другие учебники и руководства по Angular для разработчиков.