Skip to content

StrawPlus

StrawPlus is a decorator-based API encapsulation solution that provides cleaner and more elegant code organization.

Basic Usage

Creating API Class

javascript
import { ConnectStrawPlus, Get, Post, Put, Delete } from 'strap-trousers'

@ConnectStrawPlus({
  lib: axios,
  name: 'userApi',
  rootUrl: 'https://api.example.com'
})
class UserApi {
  @Get('/users')
  getUsers() {}

  @Post('/users')
  createUser(data) {}

  @Put('/users/:id')
  updateUser(id, data) {}

  @Delete('/users/:id')
  deleteUser(id) {}
}

// Create instance
const userApi = new UserApi()

Using API

javascript
// Get user list
const users = await userApi.getUsers()

// Create user
const newUser = await userApi.createUser({
  name: 'John Doe',
  email: 'john@example.com'
})

// Update user
const updatedUser = await userApi.updateUser(1, {
  name: 'John Smith'
})

// Delete user
await userApi.deleteUser(1)

Advanced Configuration

Configuration Options

javascript
@ConnectStrawPlus({
  lib: axios,
  name: 'userApi',
  rootUrl: 'https://api.example.com',
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json',
    'Authorization': 'Bearer token'
  }
})
class UserApi {
  // API methods
}

Debounce Configuration

javascript
import { Debounce } from 'strap-trousers'

@ConnectStrawPlus({
  lib: axios,
  name: 'searchApi',
  rootUrl: 'https://api.example.com'
})
class SearchApi {
  @Debounce(300) // 300ms debounce
  @Get('/search')
  search(keyword) {}
}

Mini-Program Environment

javascript
@ConnectStrawPlus({
  lib: { Axios: wx.request },
  name: 'wechatApi',
  rootUrl: 'https://api.example.com',
  miniAdapter: wx.request
})
class WechatApi {
  @Get('/user/info')
  getUserInfo() {}
}

Decorator Details

@ConnectStrawPlus

Class decorator used to configure basic API information.

javascript
@ConnectStrawPlus({
  lib: axios,                    // Request library
  name: 'apiName',              // Unique identifier
  rootUrl: 'https://api.example.com', // Root URL
  timeout: 10000,               // Timeout (optional)
  headers: {                    // Request headers (optional)
    'Content-Type': 'application/json'
  },
  debounce: {                   // Global debounce (optional)
    time: 300,
    immediate: false
  },
  miniAdapter: wx.request       // Mini-program adapter (optional)
})
class ApiClass {
  // API methods
}

Request Method Decorators

@Get(url)

javascript
@Get('/users')
getUsers() {}

@Get('/users/:id')
getUser(id) {}

@Post(url)

javascript
@Post('/users')
createUser(data) {}

@Put(url)

javascript
@Put('/users/:id')
updateUser(id, data) {}

@Delete(url)

javascript
@Delete('/users/:id')
deleteUser(id) {}

@Debounce

Method decorator for debouncing requests.

javascript
@Debounce(300) // 300ms debounce
timeout: 300,   // Debounce time
immediate: false // Whether to trigger immediately

@Res

Response processing decorator (coming soon).

javascript
@Res((response) => response.data)
@Get('/users')
getUsers() {}

Best Practices

Modular Organization

javascript
// api/user.js
import { ConnectStrawPlus, Get, Post, Put, Delete } from 'strap-trousers'

@ConnectStrawPlus({
  lib: axios,
  name: 'userApi',
  rootUrl: 'https://api.example.com'
})
export class UserApi {
  @Get('/users')
  getUsers() {}

  @Post('/users')
  createUser(data) {}

  @Put('/users/:id')
  updateUser(id, data) {}

  @Delete('/users/:id')
  deleteUser(id) {}
}

// api/product.js
@ConnectStrawPlus({
  lib: axios,
  name: 'productApi',
  rootUrl: 'https://api.example.com'
})
export class ProductApi {
  @Get('/products')
  getProducts() {}

  @Get('/products/:id')
  getProduct(id) {}

  @Post('/products')
  createProduct(data) {}
}

// main.js
import { UserApi, ProductApi } from './api'

const userApi = new UserApi()
const productApi = new ProductApi()

// Use
const users = await userApi.getUsers()
const products = await productApi.getProducts()

TypeScript Support

typescript
import { ConnectStrawPlus, Get, Post } from 'strap-trousers'

interface User {
  id: number
  name: string
  email: string
}

interface CreateUserData {
  name: string
  email: string
}

@ConnectStrawPlus({
  lib: axios,
  name: 'userApi',
  rootUrl: 'https://api.example.com'
})
export class UserApi {
  @Get('/users')
  getUsers(): Promise<User[]> {
    return {} as any
  }

  @Post('/users')
  createUser(data: CreateUserData): Promise<User> {
    return {} as any
  }
}

Environment Configuration

javascript
// config/api.config.js
export const API_CONFIG = {
  development: {
    rootUrl: 'http://localhost:3000',
    timeout: 5000
  },
  production: {
    rootUrl: 'https://api.example.com',
    timeout: 10000
  }
}

// api/base.js
import { API_CONFIG } from '../config/api.config'

const env = process.env.NODE_ENV || 'development'

export class BaseApi {
  static getConfig() {
    return {
      lib: axios,
      ...API_CONFIG[env]
    }
  }
}

// api/user.js
import { ConnectStrawPlus } from 'strap-trousers'
import { BaseApi } from './base'

@ConnectStrawPlus({
  ...BaseApi.getConfig(),
  name: 'userApi'
})
export class UserApi {
  // API methods
}

Released under the MIT License.