EXCEPCIÓN angular: no hay proveedor para Http

333

Estoy obteniendo el EXCEPTION: No provider for Http!en mi aplicación Angular. ¿Qué estoy haciendo mal?

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
fuente
3
Se echa en falta HTTP_PROVIDERS.
Eric Martinez
1
importar / exportar ... por favor, cualquiera, ¿qué sintaxis es esta?
vp_arth
55
Es sintaxis mecanografiada
daniel
10
importación / exportación - es la sintaxis de JavaScript (ES6)
alexpods
3
Sería bueno si una de las respuestas realmente explicara por qué necesitamos importar HttpModuley qué hace.
Drazen Bjelovuk

Respuestas:

520

Importar el HttpModule

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

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

platformBrowserDynamic().bootstrapModule(AppModule);

Idealmente, divide este código en dos archivos separados. Para más información lea:

Philip
fuente
2
En la versión actual de Angular2 beta, se llama al archivo app.ts.
d135-1r43
77
En proyectos generados por angular-cli, se llama al archivo main.ts.
filoxo
¿Qué pasa si no tengo un NgModule? Estoy desarrollando un módulo angular2 y no tiene un NgModule, pero para las pruebas necesito un proveedor Http
iRaS el
@Webruster que acabo de comprobar. Aún debería funcionar. ¿Me puede dar el código de error exacto?
Philip
2
@PhilipMiglinci ... gracias por la valiosa respuesta ... agregando algunos puntos para los buscadores de que el archivo sería app.module.ts en angular 2.0 para explicación, este es el archivo central para que el proyecto incluya los módulos que usarán más heredados clases
shaan gola
56

> = Angular 4.3

para el introducido 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

Importar HttpModuleal módulo donde lo usa (aquí, por ejemplo, el AppModule:

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

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

Importar HttpModulees bastante similar a agregar HTTP_PROVIDERSen la versión anterior.

Günter Zöchbauer
fuente
9

Con la versión Angular 2.0.0 del 14 de septiembre de 2016, todavía está utilizando HttpModule. Su principal app.module.tsse vería así:

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

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

Luego, en su app.tspuede arrancar como tal:

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

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

Agregue HttpModule a la matriz de importaciones en el archivo app.module.ts antes de usarlo.

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

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

Surendra Parchuru
fuente
9

Desde rc.5 tienes que hacer algo como

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

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

porque fue solo en la sección de comentarios, repito la respuesta de Eric:

Tuve que incluir HTTP_PROVIDERS

daniel
fuente
2
... Además, HTTP_PROVIDERS se ha depreciado. Ahora se llama HttpModule .. stackoverflow.com/questions/38903607/…
Mike Gledhill
5

Importar HttpModuleen su archivo app.module.ts.

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

También recuerde declarar HttpModule bajo importaciones como a continuación:

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

La mejor manera es cambiar el decorador de su componente agregando Http en la matriz de proveedores como se muestra a continuación.

@Component({
    selector: 'greetings-ac-app2',
    providers: [Http],
    templateUrl: 'app/greetings-ac2.html',
    directives: [NgFor, NgModel, NgIf, FORM_DIRECTIVES],
    pipes: []
})
Shivang Gupta
fuente
Quien lo haya marcado mal, ¿puedo saber cuál es la razón?
Shivang Gupta
55
No voté en contra, pero la razón probablemente sea que no quieres un nuevo Http objeto para cada componente. Es mejor tener una sola para la aplicación, que se logra importándola en el NgModulenivel.
Ted Hopp
3

a partir de RC5 necesita importar el HttpModule de esta manera:

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

luego incluya el HttpModule en la matriz de importaciones como mencionó anteriormente Günter.

mareks
fuente
3

Solo incluya las siguientes bibliotecas:

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

e incluya la clase http en la providerssección, de la siguiente manera:

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

Si tiene este error en sus pruebas, debe crear un servicio falso para todos los servicios:

Por ejemplo:

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

Y en beforeEach:

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

Almación simple: importe el HttpModule y HttpClientModule en su 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
fuente
Esta solución funciona, pero HttpModule está marcado como obsoleto en Angular 5.2. Creo que algunos componentes no se actualizan y aún usan la antigua implementación Http.
Sobvan
1

Todo lo que necesita hacer es incluir las siguientes bibliotecas en el recorrido app.module.ts y también incluirlo en sus importaciones:

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

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

Me enfrenté a este problema en mi código. Solo pongo este código en mi app.module.ts.

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

@NgModule({
  imports:      [ BrowserModule, HttpModule ],
  declarations: [ AppComponent ],
  bootstrap:    [ AppComponent ]
})
export class AppModule { }
Saurabh
fuente
1
Por favor, no repita las respuestas existentes. Hacerlo no agrega valor a la comunidad.
isherwood
1

import { HttpModule } from '@angular/http'; paquete en su archivo module.ts y agréguelo a sus importaciones.

Alekya
fuente
1

Solo agrego ambos en mi app.module.ts:

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

Y

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

Ahora funciona bien ... Y no olvides agregar

@NgModule => Imports:[] array

Dibya Prakash Das
fuente