我在Angular应用中得到了EXCEPTION: No provider for Http!。我在做什么错?

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


@Component({
    selector: 'greetings-ac-app2',
    providers: [],
    templateUrl: 'app/greetings-ac2.html',
    directives: [NgFor, NgModel, NgIf, FORM_DIRECTIVES],
    pipes: []
})
export class GreetingsAcApp2 {
    private str:any;

    constructor(http: Http) {

        this.str = {str:'test'};

        http.post('http://localhost:18937/account/registeruiduser/',
            JSON.stringify(this.str),
            {
                headers: new Headers({
                    'Content-Type': 'application/json'
                })
            });


评论

您缺少HTTP_PROVIDERS。

导入/导出...大家,这是什么语法?

是打字稿语法

导入/导出-这是JavaScript语法(ES6)

如果其中一个答案能真正解释为什么我们需要导入HttpModule及其作用,那将是很好的。

#1 楼

导入HttpModule

 import { HttpModule } from '@angular/http';

@NgModule({
    imports: [ BrowserModule, HttpModule ],
    providers: [],
    declarations: [ AppComponent ],
    bootstrap: [ AppComponent ]
})
export default class AppModule { }

platformBrowserDynamic().bootstrapModule(AppModule);
 


理想情况下,您将此代码分成两个单独的文件。 br />有关更多信息,请阅读:


https://v2.angular.io/docs/ts/latest/cookbook/rc4-to-rc5.html
https ://v2.angular.io/docs/ts/latest/guide/ngmodule.html


评论


在当前的Angular2 beta中,该文件称为app.ts。

–d135-1r43
16年4月20日在13:05

在angular-cli生成的项目中,该文件称为main.ts。

–filoxo
16年5月16日在16:33

如果我没有NgModule怎么办?我正在开发angular2模块,它没有NgModule,但是对于测试,我需要Http provider

– iRaS
16-10-7在6:03

我刚刚检查的@Webruster。它仍然应该工作。您能给我确切的错误代码吗?

–菲利普
17年6月11日在9:24

@PhilipMiglinci ...感谢您提供宝贵的答案..为寻求者提供了一些要点,该文件将是angular 2.0中的app.module.ts,以解释这是该项目的核心文件,其中包括将使用进一步继承的模块类。

–陕戈拉
17-09-23在17:40



#2 楼

> = Angular 4.3

用于引入的HttpClientModule

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

@NgModule({
  imports: [
    BrowserModule,
    FormsModule, // if used
    HttpClientModule,
    JsonpModule // if used
  ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }
 


Angular2> = RC.5

HttpModule导入到您使用它的模块中(例如AppModule

 import { HttpModule } from '@angular/http';

@NgModule({
  imports: [
    BrowserModule,
    FormsModule, // if used
    HttpModule,
    JsonpModule // if used
  ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }
 


导入HttpModule非常类似于在先前版本中添加HTTP_PROVIDERS

#3 楼

在2016年9月14日Angular 2.0.0版本中,您仍在使用HttpModule。您的主要app.module.ts看起来像这样:

import { HttpModule } from '@angular/http';

@NgModule({
   bootstrap: [ AppComponent ],
   declarations: [ AppComponent ],
   imports: [
      BrowserModule,
      HttpModule,
      // ...more modules...
   ],
   providers: [
      // ...providers...
   ]
})
export class AppModule {}


然后在您的app.ts中,您可以这样进行引导:

import { platformBrowserDynamic } from '@angular/platform-browser-dynamic';
import { AppModule } from './app/main/app.module';

platformBrowserDynamic().bootstrapModule(AppModule);


#4 楼

在使用HttpModule之前,将其添加到app.module.ts文件中的import数组。




 import { HttpModule } from '@angular/http';

@NgModule({
  declarations: [
    AppComponent,
    CarsComponent
  ],
  imports: [
    BrowserModule,
	HttpModule  
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { } 




#5 楼

从rc.5开始,您必须做类似

 @NgModule({
    imports: [ BrowserModule],
    providers: [ HTTP_PROVIDERS ],  
    declarations: [ AppComponent ],
    bootstrap: [ AppComponent ]
})
export default class AppModule { }

platformBrowserDynamic().bootstrapModule(AppModule);
 


#6 楼

因为它仅在评论部分,所以我重复了Eric的回答:

我必须添加HTTP_PROVIDERS

评论


...另外,HTTP_PROVIDERS已被淘汰。现在称为HttpModule ..stackoverflow.com/questions/38903607/…

–迈克·格莱德希尔(Mike Gledhill)
17年9月9日在9:53

#7 楼

在您的app.module.ts文件中导入HttpModule

import { HttpModule } from '@angular/http';
import { YourHttpTestService } from '../services/httpTestService';


也请记住在如下所示的导入下声明HttpModule:

imports: [
    BrowserModule,
    HttpModule
  ],


#8 楼

最好的方法是通过在Providers数组中添加Http来更改组件的装饰器,如下所示。

@Component({
    selector: 'greetings-ac-app2',
    providers: [Http],
    templateUrl: 'app/greetings-ac2.html',
    directives: [NgFor, NgModel, NgIf, FORM_DIRECTIVES],
    pipes: []
})


评论


谁曾将其标记为错误,请问原因是什么?

– Shivang Gupta
16-9-29在4:45

我没有投票,但是原因可能是您不想为每个组件都使用新的Http对象。最好为该应用程序创建一个应用程序,这是通过在NgModule级别上导入来完成的。

–特德·霍普(Ted Hopp)
16 Dec 4'在7:02

#9 楼

从RC5开始,您需要像这样导入HttpModule:

import { HttpModule } from '@angular/http';


然后将HttpModule包括在Günter提到的imports数组中。

#10 楼

只需包含以下库:

import { HttpModule } from '@angular/http';
import { YourHttpTestService } from '../services/httpTestService';


,并在providers部分中包含http类,如下所示:

@Component({
  selector: '...',
  templateUrl: './test.html',
  providers: [YourHttpTestService]


#11 楼

如果您在测试中遇到此错误,则应为所有服务创建Fake Service:

例如:

import { YourService1 } from '@services/your1.service';
import { YourService2 } from '@services/your2.service';

class FakeYour1Service {
 public getSomeData():any { return null; }
}

class FakeYour2Service {
  public getSomeData():any { return null; }
}


以及在beforeEach中:

beforeEach(async(() => {
  TestBed.configureTestingModule({
    providers: [
      Your1Service,
      Your2Service,
      { provide: Your1Service, useClass: FakeYour1Service },
      { provide: Your2Service, useClass: FakeYour2Service }
    ]
  }).compileComponents();  // compile template and css
}));


#12 楼

**



简单的灵魂:在您的app.module.ts上导入HttpModule和HttpClientModule



**

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



@NgModule({
 declarations: [
   AppComponent, videoComponent, tagDirective, 
 ],
 imports: [
  BrowserModule, routing, HttpClientModule, HttpModule

],
providers: [ApiServices],
bootstrap: [AppComponent]
})
export class AppModule { }


评论


此解决方案有效,但是Angular 5.2中将HttpModule标记为已弃用。我认为某些组件未升级,仍然使用旧的Http实现。

– Sobvan
18 Mar 16 '18在20:09

#13 楼

您需要做的就是在游览app.module.ts中包含以下库,并将其包含在导入中:

import { HttpModule } from '@angular/http';

@NgModule({
  imports:    [ HttpModule ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }


#14 楼

我在代码中遇到了这个问题。我只将此代码放在我的app.module.ts中。

import { HttpModule } from '@angular/http';

@NgModule({
  imports:      [ BrowserModule, HttpModule ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }


评论


请不要重复现有的答案。这样做不会为社区增加价值。

–艾舍伍德
17年12月12日在20:44

#15 楼

import { HttpModule } from '@angular/http';软件包放在module.ts文件中,并将其添加到导入中。

#16 楼

我将它们都添加到我的app.module.ts中:

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




import { HttpModule } from '@angular/http';"


现在其效果很好....
并且不要忘记添加

@NgModule => Imports:[] array