70 lines
1.7 KiB
Markdown
70 lines
1.7 KiB
Markdown
# API Client CLI Tool Example
|
|
|
|
Complete REST API client CLI demonstrating:
|
|
- HTTP client sharing via context
|
|
- Authentication in Before hook
|
|
- Multiple HTTP methods (GET, POST, PUT, DELETE)
|
|
- Headers and request configuration
|
|
- Arguments handling
|
|
|
|
## Usage
|
|
|
|
```bash
|
|
# Set environment variables
|
|
export API_URL=https://api.example.com
|
|
export API_TOKEN=your_token_here
|
|
|
|
# GET request
|
|
api get /users
|
|
api get /users/123
|
|
|
|
# POST request
|
|
api post /users '{"name": "John", "email": "john@example.com"}'
|
|
api post /posts '{"title": "Hello", "body": "World"}' --content-type application/json
|
|
|
|
# PUT request
|
|
api put /users/123 '{"name": "Jane"}'
|
|
|
|
# DELETE request
|
|
api delete /users/123
|
|
|
|
# Test authentication
|
|
api auth-test
|
|
|
|
# Custom timeout
|
|
api --timeout 60s get /slow-endpoint
|
|
|
|
# Additional headers
|
|
api get /users -H "Accept:application/json" -H "X-Custom:value"
|
|
```
|
|
|
|
## Features Demonstrated
|
|
|
|
1. **Context Management**: Shared HTTPClient and auth across requests
|
|
2. **Before Hook**: Authenticates and sets up HTTP client
|
|
3. **Arguments**: Commands accept endpoint and data as arguments
|
|
4. **Required Flags**: --url and --token are required
|
|
5. **Environment Variables**: API_URL, API_TOKEN, API_TIMEOUT fallbacks
|
|
6. **Duration Flags**: --timeout uses time.Duration type
|
|
7. **Multiple Values**: --header can be specified multiple times
|
|
8. **Helper Functions**: maskToken() for secure token display
|
|
|
|
## HTTP Client Pattern
|
|
|
|
```go
|
|
type APIContext struct {
|
|
BaseURL string
|
|
Token string
|
|
HTTPClient *http.Client
|
|
}
|
|
|
|
// Initialize in Before hook
|
|
client := &http.Client{Timeout: timeout}
|
|
ctx := &APIContext{...}
|
|
c.App.Metadata["ctx"] = ctx
|
|
|
|
// Use in commands
|
|
ctx := c.App.Metadata["ctx"].(*APIContext)
|
|
resp, err := ctx.HTTPClient.Get(url)
|
|
```
|