Skip to content

useApi

A composable that provides a comprehensive API client for making HTTP requests with various utilities for caching, form handling, file uploads, and downloads.

Usage

ts
import { useApi } from '#imports'

// Create API client instance
const api = useApi()

// Basic requests
const getData = async () => {
  // Standard response contains data wrapped in { data: ... } object
  const response = await api.get('/users')
  
  // Use $ prefix methods to get just the data property
  const users = await api.$get('/users')
}

// Post data
const createUser = async (userData) => {
  return api.$post('/users', userData)
}

// Form submissions
const submitForm = async (formData) => {
  return api.$postForm('/users', formData)
}

// File uploads
const uploadUserAvatar = async (file) => {
  return api.uploadFile(file)
}

// Download files
const downloadReport = async () => {
  return api.download('/reports/monthly', 'monthly-report.pdf')
}

// Cache control
api.$getLazyInvalidate('users') // Invalidate cached requests containing "users"

Return Value

useApi() returns an instance with the following methods:

Basic Request Methods

MethodParametersDescription
request<T>(options)Generic request method
get<T>(url, options?)GET request
post<T>(url, body?, options?)POST request
put<T>(url, body?, options?)PUT request
patch<T>(url, body?, options?)PATCH request
delete<T>(url, body?, options?)DELETE request

Direct Data Access Methods

All methods prefixed with $ return the data directly instead of the complete response:

MethodParametersDescription
$get<T>(url, options?)GET request returning just the data
$post<T>(url, body?, options?)POST request returning just the data
$put<T>(url, body?, options?)PUT request returning just the data
$patch<T>(url, body?, options?)PATCH request returning just the data
$delete<T>(url, body?, options?)DELETE request returning just the data

Form Handling Methods

MethodParametersDescription
postForm<T>(url, data?, options?)POST form data
putForm<T>(url, data?, options?)PUT form data (emulated via POST)
patchForm<T>(url, data?, options?)PATCH form data (emulated via POST)
$postForm<T>(url, data?, options?)POST form data returning just the data
$putForm<T>(url, data?, options?)PUT form data returning just the data
$patchForm<T>(url, data?, options?)PATCH form data returning just the data
buildFormData(data?, options?)Convert object to FormData

Caching Methods

MethodParametersDescription
getLazy<T>(url, options?)GET with caching
$getLazyInvalidate(key)Invalidate cached entries containing key

File Operations

MethodParametersDescription
getSignedURL(file, options?)Get a signed URL for file upload
uploadFile(file, options?)Upload a file
download(url, filename?, options?)Download a file

URL Management

MethodParametersDescription
changeBaseUrl(baseURL)Change the base URL for API calls

API Hooks

The API client integrates with Nuxt's hooks system to provide two lifecycle hooks that allow you to customize request behavior and error handling:

HookParametersDescription
we-api:onRequest(request)Called before each request is sent
we-api:onResponseError(error)Called when a response error occurs

Registering Hook Handlers

You can register handlers for these hooks in your plugins:

ts
// plugins/api-hooks.ts
export default defineNuxtPlugin((nuxtApp) => {
  // Add a request interceptor
  nuxtApp.hooks.hook('we-api:onRequest', (request) => {
    // Add custom headers
    request.options.headers.append('X-Custom-Header', 'CustomValue')
    
    // Log outgoing requests
    console.log(`[API Request] ${request.method} ${request.url}`)
  })
  
  // Add a response error handler
  nuxtApp.hooks.hook('we-api:onResponseError', (error) => {
    // Custom error tracking
    if (error.response?.status === 500) {
      trackError({
        type: 'API_ERROR',
        url: error.request?.url,
        status: error.response.status,
        data: error.response._data
      })
    }
  })
})

Examples

Fetching Data with Automatic Caching

ts
const api = useApi()

// First call fetches and caches data
const page1 = await api.getLazy('/users', { query: { page: 1 } })

// Subsequent calls with the same URL and options use cached data
const cachedPage1 = await api.getLazy('/users', { query: { page: 1 } })

// Clear cache for specific endpoints
api.$getLazyInvalidate('users')

Working with Forms and File Uploads

ts
const api = useApi()

async function submitUserForm(userData, avatarFile) {
  // Upload avatar first
  const fileData = await api.uploadFile(avatarFile)
  
  // Then create user with avatar reference
  return api.$postForm('/users', {
    ...userData,
    avatar_id: fileData.id
  })
}

Downloading Files

ts
const api = useApi()

function downloadUserReport(userId) {
  return api.download(`/users/${userId}/report`, `user-${userId}-report.pdf`)
}

Source Code