or run

npx @tessl/cli init
Log in

Version

Tile

Overview

Evals

Files

docs

angular-modules.mdbackend-implementation.mdconfiguration-options.mdheaders-parameters.mdhttp-services.mdindex.mdrequest-response.mdtesting.md
tile.json

headers-parameters.mddocs/

Headers and Parameters

HTTP headers management and URL parameter handling with full manipulation capabilities. Provides polyfill functionality for browser compatibility and comprehensive parameter encoding.

Capabilities

Headers Class

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

URLSearchParams Class

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

QueryEncoder Class

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

Integration Examples

Complete Request with Headers and Parameters

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