Перейти к содержанию

Отправка данных в запросе

В прошлых темах были рассмотрены простейшие запросы к файлу json, который содержал некоторые данные. Однако нередко возникает необходимость обращаться с более сложными запросами к удаленному ресурсу, передавая ему некоторые параметры. Вначале рассмотрим, как передать параметры в get-запросе.

Допустим, на стороне сервера действует некоторый обработчик или скрипт, который принимает в качестве параметра некоторое число и вычисляет его факториал.

Например, в PHP мы могли бы определить следующий простейший скрипт getFactorial.php:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
if(isset($_GET['number']))
{
    $num = $_GET['number'];
    $result=1;
    for($i=1; $i<=$num; $i++){

        $result *= $i;
    }
    echo $result;
}
else
{
    echo "Введенные данные некорректны";
}
?>

В ASP.NET MVC это могло бы быть следующее действие контроллера:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
public class HomeController : Controller
{
    public ActionResult GetFactorial(int number)
    {
        int result = 1;
        for(int i =1; i<=number; i++)
        {
            result *= i;
        }

        return Json(result, JsonRequestBehavior.AllowGet);
    }
}

Это может быть какая-то другая технология сервера. Но вне зависимости от выбранной технологии следует учитывать ограничения на кроссдоменные запросы. В частности, если наше приложение на Angular запускается в одном домене, а сервер, обрабатывающий запросы, запущен на другом домене, то на сервере нам надо включить технологию CORS. В PHP для этого можно добавить заголовки в скрипт:

1
2
3
4
5
6
<?php
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Methods: GET, PUT, POST, DELETE, OPTIONS");
header("Access-Control-Allow-Headers: Origin, Content-Type, X-Auth-Token , Authorization");

// остальное содержимое скрипта

В ASP.NET MVC это может быть добавление в файл конфигурации web.config следующего узла:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<system.webServer>
    <httpProtocol>
        <customHeaders>
            <clear />
            <add
                name="Access-Control-Allow-Origin"
                value="*"
            />
            <add
                name="Access-Control-Allow-Headers"
                value="Origin, X-Requested-With, Content-Type, Accept"
            />
            <add
                name="Access-Control-Allow-Methods"
                value="*"
            />
        </customHeaders>
    </httpProtocol>
    <!-- остальное содержимое узла system.webServer -->
</system.webServer>

В других технологиях могут применяться другие способы добавления CORS.

Для отправки запроса из Angular определим следующий сервис:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable()
export class HttpService {
    constructor(private http: HttpClient) {}

    //http://localhost:60489/Home/GetFactorial?number=  ASP.NET MVC
    //http://localhost:8080/angular/getFactorial.php?number=    PHP
    getFactorial(num: number) {
        return this.http.get(
            'http://localhost:60489/Home/GetFactorial?number=' +
                num
        );
    }
}

Поскольку данные передаются через запрос GET, то мы можем конкатенировать нужное число со строкой запроса.

И определим код компонента:

 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
import { Component, OnInit } from '@angular/core';
import { HttpService } from './http.service';
import { User } from './user';

@Component({
    selector: 'my-app',
    template: `
        <div *ngIf="done">{{ factorial }}</div>
        <div class="form-group">
            <label>Введите число</label>
            <input
                class="form-control"
                type="number"
                name="factorial"
                [(ngModel)]="num"
            />
        </div>
        <div class="form-group">
            <button
                class="btn btn-default"
                (click)="submit(num)"
            >
                Отправить
            </button>
        </div>
    `,
    providers: [HttpService],
})
export class AppComponent {
    factorial: number;
    done: boolean = false;
    constructor(private httpService: HttpService) {}
    submit(num: number) {
        this.httpService
            .getFactorial(num)
            .subscribe((data: number) => {
                this.factorial = data;
                this.done = true;
            });
    }
}

По нажатию на кнопку отправляем введенное число на сервер, и поверх формы ввода отображаем полученный результат:

Скриншот

HttpParams

Также для определения параметров в запросе можно использовать класс HttpParams. В частности, изменим сервис HttpService следующим образом:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import { Injectable } from '@angular/core';
import {
    HttpClient,
    HttpParams,
} from '@angular/common/http';

@Injectable()
export class HttpService {
    constructor(private http: HttpClient) {}

    //http://localhost:60489/Home/GetFactorial?number=  ASP.NET MVC
    //http://localhost:8080/angular/getFactorial.php?number=    PHP
    getFactorial(num: number) {
        const params = new HttpParams().set(
            'number',
            num.toString()
        );
        return this.http.get(
            'http://localhost:60489/Home/GetFactorial',
            { params }
        );
    }
}

С помощью метода set() объекта HttpParams устанавливаются параметры, и затем этот объект передается в запрос. В итоге результат будет тот же, что и в примере выше.

Комментарии