=====Отправка данных в get запросе ===== В прошлых темах были рассмотрены простейшие запросы к файлу json, который содержал некоторые данные. Однако нередко возникает необходимость обращаться с более сложными запросами к удаленному ресурсу, передавая ему некоторые параметры. Вначале рассмотрим, как передать параметры в get-запросе.\\ \\ ====Определение приложения на сервере==== Рассмотрим простейшую задачу. Допустим, на стороне сервера действует некоторый обработчик или скрипт, который принимает в качестве параметра два числа и вычисляет их сумму.\\ \\ В качестве стороны сервера мы могли бы взять разные технологии: PHP, ASP.NET и т.д. В данном случае для тестирования определим небольшое приложение на Node.js, так как данная технология представляет наиболее простейший способ для создания простейшего тестового приложения, да и сам Node.js установлен у всех разработчиков Angular. Приложение будет интуитивно понятным, более же подробно с данной технологией можно ознакомиться в [[https://metanit.com/web/nodejs/|руководстве по Node.js]\\ \\ Определим для приложения Node.js новый каталог где-нибудь на жестком диске. Далее в этом каталоге определим файл package.json: { "name": "expressapp", "version": "1.0.0", "dependencies": { "express": "^4.16.4" } } Наше приложение будет использовать фреймворк Express для обработки запросов. Установим пакеты командой npm install.\\ \\ Далее определим в папке приложения файл app.js - главный файл приложения, который будет содержать следующий код: const express = require("express"); const app = express(); // обработчик по маршруту localhost:3000/sum app.get("/sum", function(request, response){ // получаем параметры из строки запроса и преобразуем в числа const number1 = parseInt(request.query.num1); const number2 = parseInt(request.query.num2); // вычисляем сумму const sum = number1 + number2; // настройка заголовков CORS для кроссдоменных запросов response.header('Access-Control-Allow-Origin', '*'); response.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); response.header('Access-Control-Allow-Methods', 'GET, PATCH, PUT, POST, DELETE, OPTIONS'); response.send({result: sum}); }); app.listen(3000); Данное приложение будет принимать запросы по адресу "/sum" (app.get("/sum")...). Из строки запроса получаем два параметра num1 и num2 (названия параметров произвольное). Далее конвертируем значения параметров в числа и вычисляем суммму. И возвращаем сумму в виде объекта json {result: sum}.\\ \\ Поскольку приложение Angular будет разворачиваться на одном домене, а приложение Node.js на другом, то нам необходимо будет настроить CORS - кроссдоменные запросы. Для этого с помощью метода response.header устанавливаются соответствующие заголовки.\\ \\ В командой строке/консоли перейдем к папке приложения node.js и запустим скрипт с помощью команды node app.js\\ C:\WINDOWS\system32>cd C:\node\expressapp C:\node\expressapp>node app.js Мы можем простестировать приложение в браузере, обратившись к нему с запросом http://localhost:3000/sum?num1=5&num2=9:\\ \\ {{ :angular:angular2:http:6.11.png |}} \\ ====Определение клиентского приложения Angular==== Для отправки запроса из Angular определим следующий сервис: import {Injectable} from '@angular/core'; import {HttpClient} from '@angular/common/http'; @Injectable() export class HttpService{ constructor(private http: HttpClient){ } getSum(num1: number, num2: number){ return this.http.get('http://localhost:3000/sum?num1=' + num1 + "&num2=" + num2); } } Поскольку данные передаются через запрос GET, то мы можем конкатенировать нужное число со строкой запроса.\\ \\ И определим код компонента: import { Component, OnInit} from '@angular/core'; import { HttpService} from './http.service'; @Component({ selector: 'my-app', template: `
Сумма = {{sum}}
`, providers: [HttpService] }) export class AppComponent { num1: number; num2: number; sum: number; done: boolean = false; constructor(private httpService: HttpService){} submit(){ this.httpService.getSum(this.num1, this.num2).subscribe((data:any) => { this.sum=data.result; this.done=true; }); } }
По нажатию на кнопку отправляем введенное число на сервер, и поверх формы ввода отображаем полученный результат:\\ \\ {{ :angular:angular2:http:6.5.png |}} \\ ====HttpParams==== Также для определения параметров в запросе можно использовать класс HttpParams. В частности, изменим сервис HttpService следующим образом: import {Injectable} from '@angular/core'; import {HttpClient, HttpParams} from '@angular/common/http'; @Injectable() export class HttpService{ constructor(private http: HttpClient){ } getSum(num1: number, num2: number){ const params = new HttpParams() .set('num1', num1.toString()) .set('num2', num2.toString()); return this.http.get('http://localhost:3000/sum', {params}); } } С помощью метода **set()** объекта HttpParams устанавливаются параметры, и затем этот объект передается в запрос. В итоге результат будет тот же, что и в примере выше.