HTTP headers management and URL parameter handling with full manipulation capabilities. Provides polyfill functionality for browser compatibility and comprehensive parameter encoding.
HTTP headers management with polyfill for Fetch API Headers, supporting all standard header operations.
/**
* HTTP headers management class
* Polyfill for Fetch API Headers with full manipulation support
*/
class Headers {
/**
* Creates a new Headers instance
* @param headers - Initial headers as Headers object, plain object, or null
*/
constructor(headers?: Headers | {[name: string]: any} | null);
/**
* Creates Headers from response header string
* @param headersString - Raw header string from HTTP response
* @returns New Headers instance with parsed headers
*/
static fromResponseHeaderString(headersString: string): Headers;
/**
* Appends a new value to existing header or creates new header
* @param name - Header name
* @param value - Header value to append
*/
append(name: string, value: string): void;
/**
* Deletes a header
* @param name - Header name to delete
*/
delete(name: string): void;
/**
* Iterates over headers with callback function
* @param fn - Callback function receiving values, name, and headers map
*/
forEach(fn: (values: string[], name: string | undefined, headers: Map<string, string[]>) => void): void;
/**
* Gets first value of specified header
* @param name - Header name
* @returns First header value or null if not found
*/
get(name: string): string | null;
/**
* Gets all values of specified header
* @param name - Header name
* @returns Array of header values or null if not found
*/
getAll(name: string): string[] | null;
/**
* Checks if header exists
* @param name - Header name
* @returns True if header exists
*/
has(name: string): boolean;
/**
* Gets all header names
* @returns Array of header names
*/
keys(): string[];
/**
* Sets header value, replacing any existing values
* @param name - Header name
* @param value - Header value or array of values
*/
set(name: string, value: string | string[]): void;
/**
* Gets all header values as arrays
* @returns Array of header value arrays
*/
values(): string[][];
/**
* Converts headers to JSON object
* @returns Plain object representation of headers
*/
toJSON(): {[name: string]: any};
/**
* Gets header entries iterator
* @throws Error - Not implemented
*/
entries(): never;
}Usage Examples:
import { Headers, Http, RequestOptions } from '@angular/http';
class HeaderService {
constructor(private http: Http) {}
// Basic header creation and manipulation
createHeaders(): Headers {
const headers = new Headers();
headers.set('Content-Type', 'application/json');
headers.set('Accept', 'application/json');
headers.append('X-Custom-Header', 'value1');
headers.append('X-Custom-Header', 'value2');
console.log('Content-Type:', headers.get('Content-Type'));
console.log('Custom headers:', headers.getAll('X-Custom-Header'));
console.log('Has Authorization:', headers.has('Authorization'));
return headers;
}
// Headers from object
createFromObject(): Headers {
const headerObj = {
'Content-Type': 'application/json',
'Authorization': 'Bearer token123',
'X-API-Key': 'api-key-value'
};
return new Headers(headerObj);
}
// Authentication headers
createAuthHeaders(token: string): Headers {
const headers = new Headers();
headers.set('Authorization', `Bearer ${token}`);
headers.set('Content-Type', 'application/json');
headers.set('Accept', 'application/json');
return headers;
}
// Custom headers for API requests
makeApiRequest(): Observable<any> {
const headers = new Headers({
'Content-Type': 'application/json',
'X-API-Version': '2.0',
'X-Client-Id': 'web-app',
'Cache-Control': 'no-cache'
});
const options = new RequestOptions({ headers });
return this.http.get('/api/data', options)
.pipe(map(response => response.json()));
}
// Copy and modify headers
modifyHeaders(originalHeaders: Headers): Headers {
const newHeaders = new Headers(originalHeaders);
newHeaders.delete('Cache-Control');
newHeaders.set('X-Modified', 'true');
return newHeaders;
}
// Iterate through headers
logAllHeaders(headers: Headers): void {
headers.forEach((values, name) => {
console.log(`${name}:`, values.join(', '));
});
// Or iterate through keys
headers.keys().forEach(key => {
console.log(`${key}: ${headers.get(key)}`);
});
}
}URL search parameters management similar to native URLSearchParams with custom encoding support.
/**
* URL search parameters management class
* Similar to native URLSearchParams with custom encoding support
*/
class URLSearchParams {
/** Internal parameters map */
paramsMap: Map<string, string[]>;
/** Raw parameters string */
rawParams: string;
/**
* Creates a new URLSearchParams instance
* @param rawParams - Raw query string (without leading ?)
* @param queryEncoder - Custom query encoder (defaults to QueryEncoder)
*/
constructor(rawParams?: string, queryEncoder?: QueryEncoder);
/**
* Creates a clone of the URLSearchParams
* @returns New URLSearchParams instance with same parameters
*/
clone(): URLSearchParams;
/**
* Checks if parameter exists
* @param param - Parameter name
* @returns True if parameter exists
*/
has(param: string): boolean;
/**
* Gets first value of specified parameter
* @param param - Parameter name
* @returns First parameter value or null if not found
*/
get(param: string): string | null;
/**
* Gets all values of specified parameter
* @param param - Parameter name
* @returns Array of parameter values
*/
getAll(param: string): string[];
/**
* Sets parameter value, replacing any existing values
* @param param - Parameter name
* @param val - Parameter value
*/
set(param: string, val: string): void;
/**
* Sets all parameters from another URLSearchParams instance
* @param searchParams - Source URLSearchParams instance
*/
setAll(searchParams: URLSearchParams): void;
/**
* Appends a new value to existing parameter or creates new parameter
* @param param - Parameter name
* @param val - Parameter value to append
*/
append(param: string, val: string): void;
/**
* Appends all parameters from another URLSearchParams instance
* @param searchParams - Source URLSearchParams instance
*/
appendAll(searchParams: URLSearchParams): void;
/**
* Replaces all parameters with those from another URLSearchParams instance
* @param searchParams - Source URLSearchParams instance
*/
replaceAll(searchParams: URLSearchParams): void;
/**
* Converts parameters to query string
* @returns Encoded query string without leading ?
*/
toString(): string;
/**
* Deletes a parameter
* @param param - Parameter name to delete
*/
delete(param: string): void;
}Usage Examples:
import { URLSearchParams, Http, RequestOptions } from '@angular/http';
class ParameterService {
constructor(private http: Http) {}
// Basic parameter creation and manipulation
createParams(): URLSearchParams {
const params = new URLSearchParams();
params.set('page', '1');
params.set('limit', '10');
params.set('sort', 'name');
params.append('filter', 'active');
params.append('filter', 'verified');
console.log('Page:', params.get('page'));
console.log('Filters:', params.getAll('filter'));
console.log('Query string:', params.toString());
return params;
}
// Parameters from string
parseQueryString(): URLSearchParams {
const queryString = 'q=angular&category=framework&version=6';
const params = new URLSearchParams(queryString);
console.log('Search query:', params.get('q'));
console.log('Category:', params.get('category'));
return params;
}
// Search API with parameters
searchUsers(query: string, page: number, filters: string[]): Observable<any> {
const params = new URLSearchParams();
params.set('q', query);
params.set('page', page.toString());
params.set('limit', '20');
// Add multiple filter values
filters.forEach(filter => {
params.append('filter', filter);
});
const options = new RequestOptions({ search: params });
return this.http.get('/api/users/search', options)
.pipe(map(response => response.json()));
}
// Complex parameter manipulation
buildAdvancedQuery(): URLSearchParams {
const params = new URLSearchParams();
// Basic parameters
params.set('include', 'profile,settings');
params.set('expand', 'true');
// Array parameters
const categories = ['tech', 'science', 'business'];
categories.forEach(cat => params.append('category', cat));
// Date range
params.set('start_date', '2023-01-01');
params.set('end_date', '2023-12-31');
// Special characters (will be URL encoded)
params.set('search', 'hello world!');
params.set('tags', 'C++,TypeScript');
return params;
}
// Merge parameters from different sources
mergeParams(base: URLSearchParams, additional: URLSearchParams): URLSearchParams {
const merged = base.clone();
merged.appendAll(additional);
return merged;
}
// Convert object to URLSearchParams
fromObject(obj: {[key: string]: any}): URLSearchParams {
const params = new URLSearchParams();
Object.keys(obj).forEach(key => {
const value = obj[key];
if (Array.isArray(value)) {
value.forEach(v => params.append(key, v.toString()));
} else if (value !== null && value !== undefined) {
params.set(key, value.toString());
}
});
return params;
}
}Handles URL encoding for query parameters with specific character handling.
/**
* Query string encoder for URL parameters
* Handles special character encoding for query parameters
*/
class QueryEncoder {
/**
* Encodes parameter key
* @param key - Parameter key to encode
* @returns URL-encoded key
*/
encodeKey(key: string): string;
/**
* Encodes parameter value
* @param value - Parameter value to encode
* @returns URL-encoded value
*/
encodeValue(value: string): string;
}Usage Examples:
import { URLSearchParams, QueryEncoder } from '@angular/http';
// Custom encoder for special requirements
class CustomQueryEncoder extends QueryEncoder {
encodeKey(key: string): string {
// Custom key encoding logic
return encodeURIComponent(key).replace(/%20/g, '+');
}
encodeValue(value: string): string {
// Custom value encoding logic
return encodeURIComponent(value).replace(/%20/g, '+');
}
}
class EncodingService {
// Use custom encoder
createCustomParams(): URLSearchParams {
const encoder = new CustomQueryEncoder();
const params = new URLSearchParams('', encoder);
params.set('search term', 'hello world');
params.set('special chars', 'a+b=c&d');
console.log('Encoded:', params.toString());
// Output might be: search+term=hello+world&special+chars=a%2Bb%3Dc%26d
return params;
}
// Default encoding behavior
testDefaultEncoding(): void {
const params = new URLSearchParams();
params.set('spaces here', 'value with spaces');
params.set('symbols', '!@#$%^&*()');
params.set('unicode', 'café naïve');
console.log('Default encoding:', params.toString());
}
}import { Http, Headers, URLSearchParams, RequestOptions } from '@angular/http';
class CompleteRequestService {
constructor(private http: Http) {}
makeCompleteRequest(): Observable<any> {
// Create headers
const headers = new Headers({
'Content-Type': 'application/json',
'Authorization': 'Bearer token123',
'Accept': 'application/json',
'X-API-Version': '2.0'
});
// Create parameters
const params = new URLSearchParams();
params.set('page', '1');
params.set('limit', '10');
params.set('sort', 'created_date');
params.set('order', 'desc');
params.append('include', 'author');
params.append('include', 'comments');
// Combine in request options
const options = new RequestOptions({
headers: headers,
search: params
});
return this.http.get('/api/posts', options)
.pipe(map(response => response.json()));
}
// POST with both headers and body
createResource(data: any): Observable<any> {
const headers = new Headers({
'Content-Type': 'application/json',
'Authorization': this.getAuthToken()
});
const options = new RequestOptions({ headers });
return this.http.post('/api/resources', JSON.stringify(data), options)
.pipe(map(response => response.json()));
}
// Dynamic header and parameter building
buildDynamicRequest(config: any): Observable<any> {
const headers = new Headers();
const params = new URLSearchParams();
// Build headers based on config
if (config.auth) {
headers.set('Authorization', `Bearer ${config.auth}`);
}
if (config.contentType) {
headers.set('Content-Type', config.contentType);
}
// Build parameters based on config
if (config.filters) {
Object.keys(config.filters).forEach(key => {
params.set(key, config.filters[key]);
});
}
const options = new RequestOptions({ headers, search: params });
return this.http.get(config.url, options)
.pipe(map(response => response.json()));
}
private getAuthToken(): string {
return localStorage.getItem('authToken') || '';
}
}