271 lines
6.5 KiB
Markdown
271 lines
6.5 KiB
Markdown
# @coze-arch/bot-http
|
|
|
|
> Global HTTP client and error handling utilities for Bot Studio web applications
|
|
|
|
## Project Overview
|
|
|
|
This package provides a centralized HTTP client solution for the entire Bot Studio web application ecosystem. It offers a pre-configured axios instance with global interceptors, comprehensive error handling, event-driven API error management, and standardized response processing. This package ensures consistent HTTP behavior across all Bot Studio services while providing robust error reporting and handling capabilities.
|
|
|
|
## Features
|
|
|
|
- **Pre-configured Axios Instance**: Ready-to-use HTTP client with Bot Studio optimizations
|
|
- **Global Interceptors**: Request/response interceptors for authentication, logging, and error handling
|
|
- **Event-driven Error Management**: Centralized API error event system with custom handlers
|
|
- **Structured Error Types**: Type-safe API error definitions with detailed error information
|
|
- **Authentication Integration**: Built-in support for unauthorized request handling and redirects
|
|
- **Error Reporting**: Automatic error reporting with categorized event tracking
|
|
- **Response Processing**: Standardized response data extraction and error transformation
|
|
|
|
## Get Started
|
|
|
|
### Installation
|
|
|
|
Add this package to your `package.json` dependencies and set it to `workspace:*` version:
|
|
|
|
```json
|
|
{
|
|
"dependencies": {
|
|
"@coze-arch/bot-http": "workspace:*"
|
|
}
|
|
}
|
|
```
|
|
|
|
Then run:
|
|
```bash
|
|
rush update
|
|
```
|
|
|
|
### Basic Usage
|
|
|
|
#### Using the Axios Instance
|
|
|
|
```typescript
|
|
import { axiosInstance } from '@coze-arch/bot-http';
|
|
|
|
// Make HTTP requests
|
|
const response = await axiosInstance.get('/api/users');
|
|
const userData = await axiosInstance.post('/api/users', { name: 'John' });
|
|
|
|
// The instance is pre-configured with interceptors and error handling
|
|
```
|
|
|
|
#### Error Handling
|
|
|
|
```typescript
|
|
import {
|
|
APIErrorEvent,
|
|
handleAPIErrorEvent,
|
|
isApiError,
|
|
ApiError
|
|
} from '@coze-arch/bot-http';
|
|
|
|
// Register global error handler
|
|
handleAPIErrorEvent((error: APIErrorEvent) => {
|
|
console.error('API Error occurred:', error);
|
|
// Handle error globally (show toast, redirect, etc.)
|
|
});
|
|
|
|
// Check if error is an API error
|
|
try {
|
|
await axiosInstance.get('/api/data');
|
|
} catch (error) {
|
|
if (isApiError(error)) {
|
|
console.log('API Error Code:', error.code);
|
|
console.log('API Error Message:', error.msg);
|
|
}
|
|
}
|
|
```
|
|
|
|
#### Global Interceptors
|
|
|
|
```typescript
|
|
import {
|
|
addGlobalRequestInterceptor,
|
|
addGlobalResponseInterceptor,
|
|
removeGlobalRequestInterceptor
|
|
} from '@coze-arch/bot-http';
|
|
|
|
// Add request interceptor for authentication
|
|
const requestInterceptor = addGlobalRequestInterceptor((config) => {
|
|
config.headers.Authorization = `Bearer ${getToken()}`;
|
|
return config;
|
|
});
|
|
|
|
// Add response interceptor for data processing
|
|
addGlobalResponseInterceptor((response) => {
|
|
// Process response data
|
|
return response;
|
|
});
|
|
|
|
// Remove interceptor when no longer needed
|
|
removeGlobalRequestInterceptor(requestInterceptor);
|
|
```
|
|
|
|
#### Error Event Management
|
|
|
|
```typescript
|
|
import {
|
|
emitAPIErrorEvent,
|
|
startAPIErrorEvent,
|
|
stopAPIErrorEvent,
|
|
clearAPIErrorEvent
|
|
} from '@coze-arch/bot-http';
|
|
|
|
// Manually emit API error event
|
|
emitAPIErrorEvent({
|
|
code: '500',
|
|
msg: 'Internal server error',
|
|
type: 'custom'
|
|
});
|
|
|
|
// Control error event handling
|
|
stopAPIErrorEvent(); // Temporarily disable error events
|
|
startAPIErrorEvent(); // Re-enable error events
|
|
clearAPIErrorEvent(); // Clear all error handlers
|
|
```
|
|
|
|
## API Reference
|
|
|
|
### Core Components
|
|
|
|
#### `axiosInstance`
|
|
Pre-configured axios instance with global interceptors and error handling.
|
|
|
|
```typescript
|
|
import { axiosInstance } from '@coze-arch/bot-http';
|
|
// Use like regular axios instance
|
|
```
|
|
|
|
#### `ApiError`
|
|
Extended error class for API-specific errors.
|
|
|
|
```typescript
|
|
class ApiError extends AxiosError {
|
|
code: string; // Error code
|
|
msg: string; // Error message
|
|
hasShowedError: boolean; // Whether error has been displayed
|
|
type: string; // Error type
|
|
raw?: any; // Raw error data
|
|
}
|
|
```
|
|
|
|
### Error Management
|
|
|
|
#### Error Event Functions
|
|
```typescript
|
|
// Register error handler
|
|
handleAPIErrorEvent(handler: (error: APIErrorEvent) => void): void
|
|
|
|
// Remove error handler
|
|
removeAPIErrorEvent(handler: (error: APIErrorEvent) => void): void
|
|
|
|
// Control error events
|
|
startAPIErrorEvent(): void
|
|
stopAPIErrorEvent(): void
|
|
clearAPIErrorEvent(): void
|
|
|
|
// Emit custom error
|
|
emitAPIErrorEvent(error: APIErrorEvent): void
|
|
```
|
|
|
|
#### Error Checking
|
|
```typescript
|
|
// Check if error is API error
|
|
isApiError(error: any): error is ApiError
|
|
```
|
|
|
|
### Interceptor Management
|
|
|
|
#### Request Interceptors
|
|
```typescript
|
|
// Add request interceptor
|
|
addGlobalRequestInterceptor(
|
|
interceptor: (config: AxiosRequestConfig) => AxiosRequestConfig
|
|
): number
|
|
|
|
// Remove request interceptor
|
|
removeGlobalRequestInterceptor(interceptorId: number): void
|
|
```
|
|
|
|
#### Response Interceptors
|
|
```typescript
|
|
// Add response interceptor
|
|
addGlobalResponseInterceptor(
|
|
interceptor: (response: AxiosResponse) => AxiosResponse
|
|
): void
|
|
```
|
|
|
|
### Error Codes
|
|
|
|
Built-in error code constants:
|
|
|
|
```typescript
|
|
enum ErrorCodes {
|
|
NOT_LOGIN = 700012006,
|
|
COUNTRY_RESTRICTED = 700012015,
|
|
COZE_TOKEN_INSUFFICIENT = 702082020,
|
|
COZE_TOKEN_INSUFFICIENT_WORKFLOW = 702095072,
|
|
}
|
|
```
|
|
|
|
## Advanced Usage
|
|
|
|
### Custom Error Handling
|
|
|
|
```typescript
|
|
import { axiosInstance, ApiError } from '@coze-arch/bot-http';
|
|
|
|
axiosInstance.interceptors.response.use(
|
|
response => response,
|
|
error => {
|
|
if (error instanceof ApiError) {
|
|
// Handle specific API errors
|
|
switch (error.code) {
|
|
case '401':
|
|
// Redirect to login
|
|
break;
|
|
case '403':
|
|
// Show permission error
|
|
break;
|
|
default:
|
|
// Generic error handling
|
|
}
|
|
}
|
|
return Promise.reject(error);
|
|
}
|
|
);
|
|
```
|
|
|
|
### Integration with Web Context
|
|
|
|
The package automatically integrates with `@coze-arch/web-context` for handling redirects and navigation in unauthorized scenarios.
|
|
|
|
## Development
|
|
|
|
### Available Scripts
|
|
|
|
- `npm run build` - Build the package (no-op, source-only package)
|
|
- `npm run lint` - Run ESLint
|
|
- `npm run test` - Run tests with Vitest
|
|
- `npm run test:cov` - Run tests with coverage
|
|
|
|
### Project Structure
|
|
|
|
```
|
|
src/
|
|
├── axios.ts # Axios instance configuration and interceptors
|
|
├── api-error.ts # API error classes and utilities
|
|
├── eventbus.ts # Error event management system
|
|
└── index.ts # Main exports
|
|
```
|
|
|
|
## Dependencies
|
|
|
|
This package depends on:
|
|
- `@coze-arch/logger` - Logging utilities for error reporting
|
|
- `axios` - HTTP client library
|
|
|
|
## License
|
|
|
|
Apache-2.0
|