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

Я играл с Быстрый запуск Angular 2.

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

Я просмотрел Angular 2 Todo's.js, но он не не используйте модуль http.

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


person rilut    schedule 07.03.2015    source источник
comment
Вот оболочка для вызовов XHR из Angular 2: github.com/arvindr21/ng2do-mean-app/blob/master/public/services/ Вы можете просмотреть приведенный выше репозиторий кода, чтобы увидеть, как он используется.   -  person Arvind    schedule 29.04.2015


Ответы (12)


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

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

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

tsd install angular2/http
person Andreas    schedule 12.09.2015
comment
/// ссылка больше не нужна, tsc начиная с 1.6.2 ожидает найти angular/http.js внутри node_modules, а рядом с ним должен быть angular/http.d.ts, это должно стать своего рода стандартом, IDE если бы это работало сейчас, это последний код VS, ранний доступ к WebStorm, и есть плагин Microsoft для возвышенного текста, вы можете увидеть, как это работает в последнем учебнике в angular.io. - person Gabriel Guerrero; 22.10.2015
comment
Учебник по угловым героям на Github, где можно увидеть, как он работает github.com/johnpapa/angular2 -тур-героев - person Gabriel Guerrero; 22.10.2015
comment
Я не вижу никаких ссылок на angular2/http больше в демоверсии @GabrielGuerrero - person 0xcaff; 18.12.2015

Последнее обновление: 11 мая 2016 г.
Версия Angular: 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));

person Itay Radotzki    schedule 21.06.2015
comment
Кстати, вы можете просто использовать http.get вместо http.request. :) - person Jean; 08.07.2015
comment
На alpha.35 -- Когда я пытался использовать Observable, я получил исключение ниже, не уверен, нужно ли мне создавать и экземпляр раньше. ИСХОДНОЕ ИСКЛЮЧЕНИЕ: TypeError: rx_1.Observable.fromEvent не является функцией - person lame_coder; 29.09.2015
comment
заменить angular2/angular2 на angular2/core в последних версиях - person Harry B; 18.01.2016
comment
@harryB Спасибо, я обновился до бета-версии 1 и включил ваше предложение. - person Itay Radotzki; 28.01.2016
comment
Обновлено до angular-2.0.0-rc.2 - person Itay Radotzki; 11.05.2016

  1. Мы работаем над отдельным уровнем сохраняемости данных, который будет охватывать HTTP. Это еще не закончено.
  2. Благодаря Zone в Angular 2 вы можете использовать любой существующий механизм для получения данных. Сюда входят XMLHttpRequest, fetch() и любые другие сторонние библиотеки.
  3. XHR в compiler предназначен для частного использования, и мы можем изменить API в любое время, поэтому его не следует использовать.
person Misko Hevery    schedule 13.04.2015
comment
Я выражал это раньше на других (и, вероятно, более подходящих) форумах, но я хочу отметить, что я не уверен, почему был сделан выбор в пользу использования наблюдаемых Rx в модуле Http. Тем более, что их API значительно отличается от следующего типа ECMAScript, он отличается от своей следующей версии (в настоящее время RxJS переписывается на другой API), и, как вы сказали, вы можете использовать fetch в любом случае. Это ставка на уже устаревший и нестандартный API для чего-то, к чему он не подходит (по словам его изобретателя) - но да ладно, я думаю, у вас были свои причины. - person Benjamin Gruenbaum; 13.07.2015
comment
@BenjaminGruenbaum: старый пост, но они планируют использовать RxJS-Next. - person Jesse Good; 12.08.2015
comment
@Misko Как лучше всего найти процент выполнения при использовании службы Angular2 Http? - person siva636; 02.08.2016

Почти то же самое в 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/

:)

person cienki    schedule 15.10.2015

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 мс - 30

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

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

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

person Thomas Bücklers    schedule 27.10.2015
comment
Это именно то, что происходит со мной - я думаю, что странный GET требует просто запуска запроса в ./anguar/http. В любом случае, ваше предложение включить http.dev.js сработало - person stringy05; 26.11.2015

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

ANGULAR2 HTTP (ОБНОВЛЕНО до бета-версии !!)

Во-первых, как ясно из названия, мы должны импортировать http-файл в index.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, например, заголовки, запрос, параметры запроса и т. д. и т. д., которые в основном используются при использовании 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: в основном мы используем GET, POST, но у нас есть еще несколько вариантов, которые вы можете см. здесь...

мы можем использовать методы запроса, используя 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() }]
                }
            });
    }

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

person Pardeep Jain    schedule 16.01.2016

Я считаю, что сейчас (альфа.35 и 36) нужно быть:

import {Http} from 'http/http';

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

person tomascharad    schedule 03.09.2015
comment
Я получаю ошибку не могу найти модуль "http/http" в компиляторе машинописного текста при его импорте, альфа 36 - person MonkeyBonkey; 05.09.2015
comment
@MonkeyBonkey вы должны добавить ссылку в свой html: код https://code.angularjs.org/2.0.0-alpha.36/http.dev.js - person tomascharad; 05.09.2015
comment
Как это сделать, используя синтаксис ES5? - person oravecz; 13.09.2015
comment
Теперь это angular2/http вместо http/http - person Mike Argyriou; 15.12.2015

В продолжение нескольких ответов, вот полный рабочий пример использования модуля 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, []);
person jczaplew    schedule 17.11.2015

просто беги:

npm install --save  @angular/http

а затем импортировать через

import {HttpModule} from '@angular/http'
person Ratnabh kumar rai    schedule 10.12.2018
comment
import {HttpModule} from '@angular/http': правда. npm install --save @angular/http: не нужно. @angular/http уже должен быть доступен при создании проекта Angular. - person paulsm4; 20.02.2019

Это уже в angular2, поэтому вам не нужно ничего вставлять в package.json

Вам просто нужно импортировать и внедрить его вот так. (это служба Stuff с методом ThatUsesHttp(), который просто регистрирует ответ)

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);
        });
    }
}
person Filip Bech-Larsen    schedule 20.03.2015
comment
однако он не работает точно так же, как $http в angular 1.x... вам нужно вручную проанализировать ответ в соответствии с типом... this.$http.get(url).then((res) => { console.log(JSON.parse(res)); }, (err) => { console.log(err); }); - person Filip Bech-Larsen; 20.03.2015

Для Angular 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';

In package.json

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

Ссылка находится здесь

person Frank Nguyen    schedule 04.01.2018

Простой пример с использованием модуля 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]);
person Ariful Islam    schedule 12.09.2015
comment
Пожалуйста, не публикуйте ответы, содержащие только ссылки, на свой собственный сайт. Вместо этого поместите основную информацию в сам ответ. См.: Что означает "Хорошая" самореклама? - person durron597; 12.09.2015