Как использовать REST API с Angular2?

#javascript #rest #angular #typescript

#javascript #rest #angular #typescript

Вопрос:

Это мой демонстрационный код:

products.service.ts

 getProducts(){
 this.headers = new Headers();
 this.headers.append("Content-Type", 'application/json');
 this.headers.append("Authorization", 'Bearer '   localStorage.getItem('id_token'));
 return this.http.get('http://mydomain.azurewebsites.net/api/products',{headers:headers}).map(res => res.json().data);
}
  

products.component.ts

 constructor(private productsService: ProductsService) { }

ngOnInit() {
 this.productsService.getProducts().subscribe((res) => {
    console.log(res); 
 });
}
  

Необходимо ли импортировать что-то в ngModule декоратор для использования REST API или мой код неверен? Я могу получить нужные данные с помощью расширения Postman Chrome, но не с помощью кода Angular 2.

Я надеюсь, что хорошо объяснил свою проблему.

Обновить

Это ошибки, которые я получаю:

введите описание изображения здесь

Комментарии:

1. Что вы получаете вместо ожидаемых данных? Ошибка? Совсем ничего?

2. похоже, у вас есть 404, но у вас нет обработчика в subscribe для ошибки.

3. Можете ли вы проверить вкладку сеть в окне разработчика, чтобы увидеть, на какой URL отправляется фактический запрос?

Ответ №1:

Извините, что заставил вас тратить свое время.

Это была проблема:

app.module.ts

 providers: [
    ProductsService,
    // { provide: XHRBackend, useClass: InMemoryBackendService }, // in-mem server
    // { provide: SEED_DATA,  useClass: InMemoryDataService }     // in-mem server data
  ]
  

После комментария in-mem server и и in-mem server data проблема исчезла.

Ответ №2:

Вы не задаете заголовки в запросе. Вы объявляете Headers объект, но на самом деле ничего с ним не делаете.

Вам нужно установить их в get функции следующим образом:

 return this.http
           .get('http://mydomain.azurewebsites.net/api/products', { headers: headers })
           .map(res => res.json().data);
  

Комментарии:

1. Извините, на самом деле я установил заголовки, но скопировал и вставил неправильно. В любом случае спасибо за внимание.

Ответ №3:

Я бы посоветовал вам использовать ngx-rest-ex: https://www.npmjs.com/package/ngx-rest-ex

 npm i -S ngx-rest-ex
  

Это удобно, вам просто нужно указать соответствующий декоратор поверх метода и возвращаемый тип, он заменит тело вашего метода. Возвращаемый тип может быть любым Promise или Observable в зависимости от указанной вами аннотации МЕТОДА HTTP.

Мой демонстрационный код для вашего случая:

 import { Injectable, Injector } from '@angular/core';
import { BaseUrl, GET, RESTClient } from 'ngx-rest-ex';

import { Product } from './models';


@Injectable({
    providedIn: 'root'
})
@BaseUrl('http://mydomain.azurewebsites.net/api/')
export class ApiService extends RESTClient {

    constructor(injector: Injector) { super(injector); }

    protected getDefaultHeaders() {
        return {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer '   localStorage.getItem('id_token')
        };
    }

    @GET('products')
    getProducts(): Promise<Product[]> {
        return;
    }
}