Angular AUSNAHME: Kein Anbieter für HTTP

333

Ich bekomme das EXCEPTION: No provider for Http!in meiner Angular App. Was mache ich falsch?

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'
                })
            });
Daniel
quelle
3
Du vermisst HTTP_PROVIDERS.
Eric Martinez
1
Import / Export ... bitte, jemand, welche Syntax ist das?
vp_arth
5
Es ist Typescript Syntax
Daniel
10
Import / Export - es ist JavaScript-Syntax (ES6)
Alexpods
3
Es wäre schön, wenn eine der Antworten tatsächlich erklären würde, warum wir importieren HttpModulemüssen und was es tut.
Drazen Bjelovuk

Antworten:

520

Importieren Sie das HttpModule

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

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

platformBrowserDynamic().bootstrapModule(AppModule);

Idealerweise teilen Sie diesen Code in zwei separate Dateien auf. Weitere Informationen finden Sie unter:

Philip
quelle
2
In der aktuellen Beta von Angular2 wird die Datei aufgerufen app.ts.
d135-1r43
7
In Angular-Cli-generierten Projekten wird die Datei aufgerufen main.ts.
Filoxo
Was ist, wenn ich kein NgModule habe? Ich entwickle ein angle2-Modul und es hat kein NgModule, aber für Tests brauche ich einen HTTP-Anbieter
iRaS
@Webruster habe ich gerade überprüft. Es sollte immer noch funktionieren. Können Sie mir den genauen Fehlercode geben?
Philip
2
@PhilipMiglinci ... danke für die wertvolle Antwort .. Hinzufügen einiger Punkte für die Suchenden, dass die Datei app.module.ts in Winkel 2.0 sein würde, um zu erklären, dass dies die Kerndatei für das Projekt ist, um die Module einzuschließen, die weiter vererbt werden Klassen.
Shaan Gola
56

> = Winkel 4.3

für die eingeführten HttpClientModule

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

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

Winkel2> = RC.5

Importieren Sie HttpModulein das Modul, in dem Sie es verwenden (hier zum Beispiel AppModule:

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

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

Das Importieren von HttpModuleist dem Hinzufügen HTTP_PROVIDERSin der vorherigen Version ziemlich ähnlich .

Günter Zöchbauer
quelle
9

Mit der Angular 2.0.0-Version vom 14. September 2016 verwenden Sie weiterhin HttpModule. Ihr Haupt app.module.tswürde ungefähr so ​​aussehen:

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

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

Dann können app.tsSie in Ihrem Bootstrap als solches:

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

platformBrowserDynamic().bootstrapModule(AppModule);
Caleb
quelle
9

Fügen Sie HttpModule zum Importieren des Arrays in der Datei app.module.ts hinzu , bevor Sie es verwenden.

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

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

Surendra Parchuru
quelle
9

Seit rc.5 muss man so etwas machen

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

platformBrowserDynamic().bootstrapModule(AppModule);
Adrian Ber
quelle
6

weil es nur im Kommentarbereich war, wiederhole ich die Antwort von Eric:

Ich musste einschließen HTTP_PROVIDERS

Daniel
quelle
2
... Außerdem wurde HTTP_PROVIDERS abgeschrieben. Es heißt jetzt HttpModule .. stackoverflow.com/questions/38903607/…
Mike Gledhill
5

Importieren Sie HttpModulein Ihre Datei app.module.ts.

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

Denken Sie auch daran, HttpModule unter den folgenden Importen zu deklarieren:

imports: [
    BrowserModule,
    HttpModule
  ],
poo arasan
quelle
4

Der beste Weg ist, den Dekorator Ihrer Komponente zu ändern, indem Sie Http wie unten im Provider-Array hinzufügen.

@Component({
    selector: 'greetings-ac-app2',
    providers: [Http],
    templateUrl: 'app/greetings-ac2.html',
    directives: [NgFor, NgModel, NgIf, FORM_DIRECTIVES],
    pipes: []
})
Shivang Gupta
quelle
Wer hat es falsch markiert? Darf ich wissen, was der Grund ist?
Shivang Gupta
5
Ich habe nicht abgelehnt, aber der Grund ist wahrscheinlich, dass Sie nicht Httpfür jede Komponente ein neues Objekt möchten . Es ist besser, eine einzige für die App zu haben, was durch Importieren auf der NgModuleEbene erreicht wird.
Ted Hopp
3

Ab RC5 müssen Sie das HttpModule wie folgt importieren:

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

Nehmen Sie dann das HttpModule in das Import-Array auf, wie oben von Günter erwähnt.

Mareks
quelle
3

Fügen Sie einfach die folgenden Bibliotheken hinzu:

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

und fügen Sie die http-Klasse providerswie folgt in den Abschnitt ein:

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

Wenn Sie diesen Fehler in Ihren Tests haben, sollten Sie einen gefälschten Dienst für alle Dienste erstellen:

Zum Beispiel:

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; }
}

Und vor jedem:

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

Einfache Lösung: Importieren Sie das HttpModule und das HttpClientModule in Ihre app.module.ts

** **.

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 { }
Shashwat Gupta
quelle
Diese Lösung funktioniert, aber HttpModule ist in Angular 5.2 als veraltet markiert. Ich denke, einige Komponenten werden nicht aktualisiert und verwenden immer noch die alte HTTP-Implementierung.
Sobvan
1

Alles, was Sie tun müssen, ist, die folgenden Bibliotheken in tour app.module.ts aufzunehmen und sie auch in Ihre Importe aufzunehmen:

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

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

Ich habe dieses Problem in meinem Code festgestellt. Ich habe diesen Code nur in meine app.module.ts eingefügt.

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

@NgModule({
  imports:      [ BrowserModule, HttpModule ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }
Saurabh
quelle
1
Bitte wiederholen Sie vorhandene Antworten nicht. Dies bringt keinen Mehrwert für die Community.
Isherwood
1

import { HttpModule } from '@angular/http'; Paket in Ihrer module.ts-Datei und fügen Sie es in Ihren Importen hinzu.

Alekya
quelle
1

Ich füge einfach beide in meine app.module.ts ein:

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

&

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

Jetzt funktioniert es gut .... Und vergessen Sie nicht, das hinzuzufügen

@NgModule => Imports:[] array

Dibya Prakash Das
quelle