Skip to content

Structuring API Functions

When creating functions within the api folder, it's important to understand how to use the Vue API module correctly. This guide will walk you through the process of structuring your API functions.

Choosing a Provider

Vue.js (@vue-api/core)

In Vue.js applications, you can choose different providers to handle HTTP requests. Currently, the main provider is ofetch, with plans to support other providers like Axios or GraphQL in the future.

typescript
// api/users/index.ts
export default function () {
  const $fetch = useOfetchModel({
    baseURL: 'https://api.example.com/users'
  })

  return {
    get: () => $fetch.get('/users')
  }
}

Nuxt (@vue-api/nuxt)

For Nuxt applications, we recommend using the built-in useFetchModel composable which provides both $fetch and useFetch methods:

typescript
// api/users/index.ts
export default function () {
  const { $fetch, useFetch } = useFetchModel({
    baseURL: 'https://api.example.com/users'
  })

  return {
    // For client-side operations
    create: (userData) => $fetch.post('/users', { body: userData }),
    // For SSR/hydration
    list: () => useFetch.get('/users')
  }
}

WARNING

The main difference between Vue and Nuxt implementations is that Nuxt's useFetchModel returns an object with both $fetch and useFetch methods, while Vue's useOfetchModel returns $fetch directly.

Example: Basic API Structure

typescript
// api/users/index.ts
export default function () {
  const { $fetch, useFetch } = useFetchModel({
    baseURL: 'https://api.example.com/users'
  })

  const USER_FIELDS = ['id', 'name', 'email']

  return {
    get: () => useFetch.get({
      transform: {
        fields: USER_FIELDS
      }
    }),
    create: (userData) => $fetch.post({
      body: userData,
      transform: {
        fields: USER_FIELDS
      }
    })
  }
}