Angular modules for dependency injection and service configuration with HttpModule and JsonpModule. Provides complete integration with Angular's dependency injection system for HTTP services.
Main Angular module providing HTTP services and dependencies for XMLHttpRequest-based operations.
/**
* Angular module for HTTP services
* Provides all necessary dependencies for XMLHttpRequest-based HTTP operations
* Configures dependency injection for Http service and related components
*/
class HttpModule {
// Provides the following services:
// - Http (factory: httpFactory)
// - BrowserXhr
// - RequestOptions (useClass: BaseRequestOptions)
// - ResponseOptions (useClass: BaseResponseOptions)
// - XHRBackend
// - XSRFStrategy (factory: _createDefaultCookieXSRFStrategy)
}Usage Examples:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpModule } from '@angular/http';
import { AppComponent } from './app.component';
@NgModule({
imports: [
BrowserModule,
HttpModule // Import HttpModule to enable HTTP services
],
declarations: [AppComponent],
bootstrap: [AppComponent]
})
export class AppModule {}import { Component } from '@angular/core';
import { Http } from '@angular/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
@Component({
selector: 'app-users',
template: `
<div *ngFor="let user of users | async">
{{ user.name }} - {{ user.email }}
</div>
`
})
export class UsersComponent {
users: Observable<any[]>;
constructor(private http: Http) {
// Http service is automatically injected by HttpModule
this.users = this.http.get('/api/users')
.pipe(map(response => response.json()));
}
}Angular module providing JSONP services and dependencies for cross-domain requests.
/**
* Angular module for JSONP services
* Provides all necessary dependencies for JSONP-based HTTP operations
* Configures dependency injection for Jsonp service and related components
*/
class JsonpModule {
// Provides the following services:
// - Jsonp (factory: jsonpFactory)
// - BrowserJsonp
// - RequestOptions (useClass: BaseRequestOptions)
// - ResponseOptions (useClass: BaseResponseOptions)
// - JSONPBackend
}Usage Examples:
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { JsonpModule } from '@angular/http';
import { AppComponent } from './app.component';
@NgModule({
imports: [
BrowserModule,
JsonpModule // Import JsonpModule to enable JSONP services
],
declarations: [AppComponent],
bootstrap: [AppComponent]
})
export class AppModule {}import { Component } from '@angular/core';
import { Jsonp } from '@angular/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
@Component({
selector: 'app-external-data',
template: `
<div *ngFor="let item of externalData | async">
{{ item.title }}
</div>
`
})
export class ExternalDataComponent {
externalData: Observable<any[]>;
constructor(private jsonp: Jsonp) {
// Jsonp service is automatically injected by JsonpModule
const url = 'https://api.external.com/data?callback=JSONP_CALLBACK';
this.externalData = this.jsonp.get(url)
.pipe(map(response => response.json()));
}
}Using both HttpModule and JsonpModule in the same application.
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { HttpModule, JsonpModule } from '@angular/http';
import { AppComponent } from './app.component';
@NgModule({
imports: [
BrowserModule,
HttpModule, // For regular HTTP requests
JsonpModule // For JSONP requests
],
declarations: [AppComponent],
bootstrap: [AppComponent]
})
export class AppModule {}import { Injectable } from '@angular/core';
import { Http, Jsonp } from '@angular/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
@Injectable()
export class DataService {
constructor(
private http: Http, // From HttpModule
private jsonp: Jsonp // From JsonpModule
) {}
// Use Http for same-origin requests
getLocalData(): Observable<any[]> {
return this.http.get('/api/local-data')
.pipe(map(response => response.json()));
}
// Use Jsonp for cross-origin requests
getExternalData(): Observable<any[]> {
const url = 'https://api.external.com/data?callback=JSONP_CALLBACK';
return this.jsonp.get(url)
.pipe(map(response => response.json()));
}
}Internal factory functions used by the modules for service creation.
/**
* Factory function for creating Http service
* @param xhrBackend - XMLHttpRequest backend implementation
* @param requestOptions - Default request options
* @returns Configured Http service instance
*/
function httpFactory(xhrBackend: XHRBackend, requestOptions: RequestOptions): Http;
/**
* Factory function for creating Jsonp service
* @param jsonpBackend - JSONP backend implementation
* @param requestOptions - Default request options
* @returns Configured Jsonp service instance
*/
function jsonpFactory(jsonpBackend: JSONPBackend, requestOptions: RequestOptions): Jsonp;
/**
* Factory function for creating default XSRF strategy
* @returns Default cookie-based XSRF strategy
*/
function _createDefaultCookieXSRFStrategy(): CookieXSRFStrategy;import { NgModule, ModuleWithProviders } from '@angular/core';
import {
Http,
XHRBackend,
RequestOptions,
BaseRequestOptions,
ResponseOptions,
BaseResponseOptions,
BrowserXhr,
XSRFStrategy,
CookieXSRFStrategy
} from '@angular/http';
// Custom HTTP module with configuration
@NgModule({})
export class CustomHttpModule {
static forRoot(config?: HttpConfig): ModuleWithProviders {
return {
ngModule: CustomHttpModule,
providers: [
BrowserXhr,
{ provide: RequestOptions, useClass: BaseRequestOptions },
{ provide: ResponseOptions, useClass: BaseResponseOptions },
XHRBackend,
{
provide: XSRFStrategy,
useFactory: () => new CookieXSRFStrategy(
config?.xsrfCookieName || 'XSRF-TOKEN',
config?.xsrfHeaderName || 'X-XSRF-TOKEN'
)
},
{
provide: Http,
useFactory: (backend: XHRBackend, options: RequestOptions) => {
return new Http(backend, options);
},
deps: [XHRBackend, RequestOptions]
}
]
};
}
}
interface HttpConfig {
xsrfCookieName?: string;
xsrfHeaderName?: string;
}
// Usage
@NgModule({
imports: [
CustomHttpModule.forRoot({
xsrfCookieName: 'MY_XSRF_TOKEN',
xsrfHeaderName: 'X-MY-XSRF-TOKEN'
})
]
})
export class AppModule {}import { NgModule } from '@angular/core';
import {
Http,
RequestOptions,
BaseRequestOptions,
Headers
} from '@angular/http';
// Custom request options
export class CustomRequestOptions extends BaseRequestOptions {
constructor() {
super();
// Set default headers for all requests
this.headers = new Headers({
'Accept': 'application/json',
'Content-Type': 'application/json',
'X-API-Version': '2.0'
});
this.withCredentials = true;
}
}
@NgModule({
imports: [HttpModule],
providers: [
// Override default request options
{ provide: RequestOptions, useClass: CustomRequestOptions }
]
})
export class CustomHttpConfigModule {}import { Injectable } from '@angular/core';
import { Http, RequestOptionsArgs, Response } from '@angular/http';
import { Observable } from 'rxjs';
import { map, catchError } from 'rxjs/operators';
// Service that wraps Http with additional functionality
@Injectable()
export class InterceptedHttp {
constructor(private http: Http) {}
get(url: string, options?: RequestOptionsArgs): Observable<Response> {
return this.http.get(url, this.addAuthHeaders(options))
.pipe(
map(this.handleResponse),
catchError(this.handleError)
);
}
post(url: string, body: any, options?: RequestOptionsArgs): Observable<Response> {
return this.http.post(url, body, this.addAuthHeaders(options))
.pipe(
map(this.handleResponse),
catchError(this.handleError)
);
}
private addAuthHeaders(options?: RequestOptionsArgs): RequestOptionsArgs {
const token = localStorage.getItem('authToken');
const headers = new Headers(options?.headers || {});
if (token) {
headers.set('Authorization', `Bearer ${token}`);
}
return { ...options, headers };
}
private handleResponse = (response: Response): Response => {
// Log successful responses
console.log(`HTTP ${response.status}: ${response.url}`);
return response;
}
private handleError = (error: any): Observable<never> => {
// Log errors
console.error('HTTP Error:', error);
return throwError(error);
}
}
// Module providing the intercepted HTTP service
@NgModule({
imports: [HttpModule],
providers: [
InterceptedHttp,
// Optionally override Http with InterceptedHttp
// { provide: Http, useExisting: InterceptedHttp }
]
})
export class InterceptedHttpModule {}import { NgModule } from '@angular/core';
import { HttpModule } from '@angular/http';
import { environment } from '../environments/environment';
// Development-specific HTTP configuration
@NgModule({
imports: [HttpModule],
providers: environment.production ? [] : [
// Development-only providers
{
provide: 'API_BASE_URL',
useValue: 'http://localhost:3000/api'
}
]
})
export class EnvironmentHttpModule {}
// Service using environment configuration
@Injectable()
export class ApiService {
constructor(
private http: Http,
@Inject('API_BASE_URL') private baseUrl: string
) {}
getData(): Observable<any> {
const url = `${this.baseUrl}/data`;
return this.http.get(url)
.pipe(map(response => response.json()));
}
}import { NgModule } from '@angular/core';
import { MockBackend, MockConnection } from '@angular/http/testing';
import { Http, BaseRequestOptions, ResponseOptions, Response } from '@angular/http';
// Testing module with mock backend
@NgModule({
providers: [
MockBackend,
BaseRequestOptions,
{
provide: Http,
useFactory: (mockBackend: MockBackend, options: BaseRequestOptions) => {
return new Http(mockBackend, options);
},
deps: [MockBackend, BaseRequestOptions]
}
]
})
export class HttpTestingModule {}
// Usage in tests
describe('DataService', () => {
let service: DataService;
let mockBackend: MockBackend;
beforeEach(() => {
TestBed.configureTestingModule({
imports: [HttpTestingModule],
providers: [DataService]
});
service = TestBed.get(DataService);
mockBackend = TestBed.get(MockBackend);
});
it('should fetch data', () => {
mockBackend.connections.subscribe((connection: MockConnection) => {
connection.mockRespond(new Response(new ResponseOptions({
body: JSON.stringify({ data: 'test' })
})));
});
service.getData().subscribe(data => {
expect(data.data).toBe('test');
});
});
});