Angular 2: Как использовать/импортировать модуль http?

Я играл с Угловой 2 Quickstart. Как я могу использовать / импортировать http-модуль в Angular 2?
Я смотрел на угловой 2 Todo .js, но он не использует модуль http.

я добавил "ngHttp": "angular/http", до dependencies в пакет.json, потому что я слышал, что Angular 2 несколько модульный

12 ответов


в версии 37 вам нужно сделать это:

///<reference path="typings/angular2/http.d.ts"/>    
import {Http} from "angular2/http";

и запустите эту команду tsd:

tsd install angular2/http

последнее обновление: 11 мая 2016
угловая версия: 2.0.0-rc.2
версия Typescript: 1.8.10

живой рабочий пример.

простой пример использования Http-модуля с Observable:

import {bootstrap} from '@angular2/platform-browser-dynamic';
import {Component, enableProdMode, Injectable, OnInit} from '@angular/core';
import {Http, Headers, HTTP_PROVIDERS, URLSearchParams} from '@angular/http';
import 'rxjs/add/operator/map';

const API_KEY = '6c759d320ea37acf99ec363f678f73c0:14:74192489';

@Injectable()
class ArticleApi {
  constructor(private http: Http) {}
  
  seachArticle(query) {
    const endpoint = 'http://api.nytimes.com/svc/search/v2/articlesearch.json';
    const searchParams = new URLSearchParams()
    searchParams.set('api-key', API_KEY);
    searchParams.set('q', query);
    
    return this.http
      .get(endpoint, {search: searchParams})
      .map(res => res.json().response.docs);
  }
  
  postExample(someData) {
    const endpoint = 'https://your-endpoint';
    const headers = new Headers({'Content-Type': 'application/json'});
    
    return this.http
      .post(endpoint, JSON.stringify(someData), { headers: headers })
      .map(res => res.json());
  }
}

@Component({
  selector: 'app',
  template: `<ul>
                <li *ngFor="let article of articles | async"> {{article.headline.main}} </li>
             </ul>`, 
  providers: [HTTP_PROVIDERS, ArticleApi],
})
class App implements OnInit {
  constructor(private articleApi: ArticleApi) { }
  
  ngOnInit() {
    this.articles = this.articleApi.seachArticle('obama');
  }
}

enableProdMode();
bootstrap(App)
  .catch(err => console.error(err));

  1. мы работаем над отдельным уровнем сохраняемости данных, который будет охватывать HTTP. Это еще не все.
  2. из-за Zone в Angular 2 Вы можете использовать любой существующий механизм для извлечения данных. Это включает в себя XMLHttpRequest, fetch() и любые другие сторонние библиотеки.
  3. XHR на compiler предназначен для частного использования, и мы можем изменить API в любое время и как таковой не должны использоваться.

почти то же самое в Alpha 42, но можно отметить, что Headers и HTTP_PROVIDERS также приехал из angular2/http.

import {Http, Headers, HTTP_PROVIDERS} from 'angular2/http';

export class App {

  constructor(public http: Http) { }

  getThing() {
    this.http.get('http://example.com')
      .map(res => res.text())
      .subscribe(
        data => this.thing = data,
        err => this.logError(err),
        () => console.log('Complete')
      );
  }

}

подробнее об этом и как использовать параметры, которые возвращаются сюда: https://auth0.com/blog/2015/10/15/angular-2-series-part-3-using-http/

:)


import {Injectable} from 'angular2/core';
import {Http, HTTP_PROVIDERS} from 'angular2/http';

@Injectable()
export class GroupSelfService {
    items:Array<any>;

    constructor(http:Http){
        http.get('http://127.0.0.1:8080/src/data/names.json')
        .subscribe(res => {
            this.items = res;
            console.log('results found');
        })
    }
}

результаты в 404:
Обнаружено изменение файла
Обнаружено изменение файла
GET / src / angular2 / http 404 0.124 ms-30

две странные вещи:
1. /src/angular2 / http - это не путь, по которому можно найти http, и не путь, который я предоставил в коде.
2. ядро.js лежит рядом с http.js в папке node_modules/angular2 и находится.

насколько это странно?

обновление Невесть: Ни один из примеров не упоминал, что вам нужно ссылаться на http.js в вашем html, как
<script src="../node_modules/angular2/bundles/http.dev.js"></script>
...и тогда это сработало.
Но для пути в сообщении об ошибке у меня все еще нет объяснения.


помимо всех ответов, приведенных ниже, если я покрываю некоторые дополнительные моменты здесь Http как использовать/импортировать все...

ANGULAR2 HTTP (обновлено до бета-версии !!)

во-первых, как ясно из имени, мы должны импортировать http-файл в индекс.html как это

<script src="node_modules/angular2/bundles/http.dev.js"></script>

или вы можете обновить это через CDN отсюда

затем следующий шаг мы должны импортировать Http и HTTP_PROVIDERS из пучков, предоставляемых angular.

Но да, это хорошая практика, чтобы предоставить HTTP_PROVIDERS в файле начальной загрузки, потому что с помощью этого способа он предоставляется на глобальном уровне и доступен для всего проекта, как показано ниже.

bootstrap(App, [
    HTTP_PROVIDERS, some_more_dependency's
]);

и импорт из....

import {http} from 'angular2/http';

потребление REST API или json с помощью Http

теперь вместе с http у нас есть некоторые дополнительные параметры, предоставляемые с angular2 / http i.e как заголовки, запрос, Requestoptions и т. д. который в основном используется при использовании REST API или временных данных Json. во-первых, мы должны импортировать все это следующим образом:

import {Http, Response, RequestOptions, Headers, Request, RequestMethod} from 'angular2/http';

иногда нам нужно предоставлять заголовки при использовании API для отправки access_token и многих других вещей, которые выполняются таким образом:

this.headers = new Headers();
this.headers.append("Content-Type", 'application/json');
this.headers.append("Authorization", 'Bearer ' + localStorage.getItem('id_token'));

теперь приходите к RequestMethods: bascially мы используем GET, POST, но у нас есть еще вариант вы можете см. здесь...

мы можем использовать использование requestmethods с помощью RequestMethod.method_name

есть еще несколько вариантов для API, на данный момент я опубликовал один пример для POST запроса помощи, используя некоторые важные методы:

PostRequest(url,data) {
        this.headers = new Headers();
        this.headers.append("Content-Type", 'application/json');
        this.headers.append("Authorization", 'Bearer ' + localStorage.getItem('id_token'))

        this.requestoptions = new RequestOptions({
            method: RequestMethod.Post,
            url: url,
            headers: this.headers,
            body: JSON.stringify(data)
        })

        return this.http.request(new Request(this.requestoptions))
            .map((res: Response) => {
                if (res) {
                    return [{ status: res.status, json: res.json() }]
                }
            });
    }

для получения дополнительной информации я нашел две лучшие ссылки здесь.. и здесь...


Я верю, что сейчас (Альфа.35 и 36) необходимо:

import {Http} from 'http/http';

Не забудьте добавить (так как теперь это отдельный файл) ссылку в вашем html:https://code.angularjs.org/2.0.0-alpha.36/http.dev.js


следуя нескольким ответам, вот полный рабочий пример использования http модуль

index.html

 <html>
  <head>
    <title>Angular 2 QuickStart</title>
    <script src="../node_modules/es6-shim/es6-shim.js"></script>
    <script src="../node_modules/systemjs/dist/system.src.js"></script>
    <script src="../node_modules/angular2/bundles/angular2.dev.js"></script>
    <script src="../node_modules/angular2/bundles/http.dev.js"></script>
    <script>
      System.config({
        packages: {'app': {defaultExtension: 'js'}}
      });
      System.import('app/app');
    </script>
  </head>
  <body>
    <app>loading...</app>
  </body>
</html>

app/app.ts

import {bootstrap, Component} from 'angular2/angular2';
import {Http, Headers, HTTP_PROVIDERS} from 'angular2/http';

@Component({
  selector: 'app',
  viewProviders: [HTTP_PROVIDERS],
  template: `<button (click)="ajaxMe()">Make ajax</button>`
})

class AppComponent {
  constructor(public http: Http) { }

  ajaxMe() {
    this.http.get('https://some-domain.com/api/json')
      .map(res => res.json())
      .subscribe(
        data => this.testOutput = data,
        err => console.log('foo'),
        () => console.log('Got response from API', this.testOutput)
      );
  }

}

bootstrap(AppComponent, []);

его уже в angular2, поэтому вам не нужно ничего класть в пакет.в JSON

вам просто нужно импортировать и ввести его вот так. (это служба Stuff с methodThatUsesHttp (), которая просто регистрирует ответ)

import {XHR} from 'angular2/src/core/compiler/xhr/xhr';

export class Stuff {
    $http;
    constructor($http: XHR) {
        this.$http = $http;
    }

    methodThatUsesHttp() {
        var url = 'http://www.json-generator.com/api/json/get/cfgqzSXcVu?indent=2';

        this.$http.get(url).then(function(res) {
            console.log(res);
        }, function(err) {
            console.log(err);
        });
    }
}

import {Http, Response} from '@angular/http';

Угловое 4.3+, 5.+

// app.module.ts:

import {NgModule} from '@angular/core';
import {BrowserModule} from '@angular/platform-browser';

// Import HttpClientModule from @angular/common/http
import {HttpClientModule} from '@angular/common/http';

@NgModule({
  imports: [
    BrowserModule,
    // Include it under 'imports' in your application module
    // after BrowserModule.
    HttpClientModule,
  ],
})
export class MyAppModule {}

и внутри вашего класса обслуживания

import { HttpClient } from '@angular/common/http';

другие пакеты, которые вам также могут понадобиться

import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpResponse, HttpErrorResponse } from '@angular/common/http';

на package.json

"@angular/http": "^5.1.2",

ссылка здесь


простой пример использования модуля http:

import {Component, View, bootstrap, bind, NgFor} from 'angular2/angular2';
import {Http, HTTP_BINDINGS} from 'angular2/http'

@Component({
   selector: 'app'
})

@View({
    templateUrl: 'devices.html',
    directives: [NgFor]
})

export class App {
    devices: any;
    constructor(http: Http) {
        this.devices = []; 
        http.get('./devices.json').toRx().subscribe(res => this.devices = res.json());
    }
}

bootstrap(App,[HTTP_BINDINGS]);