Skip to content

Query Parameters

Httx provides a simple and type-safe way to handle query parameters in your requests.

Basic Usage

typescript
const response = await client.request('/api/users', {
  method: 'GET',
  query: {
    page: '1',
    limit: '10',
    sort: 'name',
    order: 'asc'
  }
})

// Results in: /api/users?page=1&limit=10&sort=name&order=asc

Type-Safe Query Parameters

You can create type-safe query parameter objects:

typescript
interface UserQueryParams {
  page: string
  limit: string
  sort?: 'name' | 'email' | 'created'
  order?: 'asc' | 'desc'
  search?: string
}

const params: UserQueryParams = {
  page: '1',
  limit: '10',
  sort: 'name',
  order: 'asc'
}

const response = await client.request('/api/users', {
  method: 'GET',
  query: params
})

Array Parameters

Httx automatically handles array parameters:

typescript
const response = await client.request('/api/users', {
  method: 'GET',
  query: {
    ids: ['1', '2', '3'],
    tags: ['admin', 'user']
  }
})

// Results in: /api/users?ids=1&ids=2&ids=3&tags=admin&tags=user

URL Encoding

Query parameters are automatically URL encoded:

typescript
const response = await client.request('/api/search', {
  method: 'GET',
  query: {
    q: 'hello world',
    filter: 'status:active'
  }
})

// Results in: /api/search?q=hello%20world&filter=status%3Aactive

Dynamic Query Parameters

You can build query parameters dynamically:

typescript
function buildUserQuery(filters: Record<string, string>) {
  return {
    page: '1',
    limit: '10',
    ...filters
  }
}

const response = await client.request('/api/users', {
  method: 'GET',
  query: buildUserQuery({
    status: 'active',
    role: 'admin'
  })
})

Query Parameter Validation

You can add validation for query parameters:

typescript
class ValidatedClient extends HttxClient {
  async request<T>(url: string, options: RequestOptions): Promise<Result<HttxResponse<T>, Error>> {
    if (options.query) {
      this.validateQueryParams(options.query)
    }
    return super.request(url, options)
  }

  private validateQueryParams(params: Record<string, string>) {
    if (params.page && isNaN(Number(params.page))) {
      throw new Error('Page must be a number')
    }
    if (params.limit && isNaN(Number(params.limit))) {
      throw new Error('Limit must be a number')
    }
  }
}

Released under the MIT License.