static2api/README.md

215 lines
No EOL
4.1 KiB
Markdown

# Static2API
A simple FastAPI application that automatically exposes CSV and JSON files as API endpoints.
## Features
- Automatically creates API endpoints for CSV and JSON files in the `source` directory
- Files are accessible via `/api/{filename}` endpoints
- New files are detected automatically without restarting the server
- Runs in a secure container with Docker or Podman
## Quick Start
### Option 1: Run with Python
```bash
# Install dependencies
pip install -r requirements.txt
# Run the application
uvicorn main:app --reload
```
The API will be available at: http://localhost:8000
### Option 2: Run with Docker/Podman
Use the provided script to run the application in a container:
```bash
# Make the script executable
chmod +x run_container.sh
# Run the container
./run_container.sh
```
The API will be available at: http://localhost:8000
## API Endpoints
- `GET /` - Welcome message
- `GET /api/{filename}` - Access data from files in the source directory
Example:
- `GET /api/contacts` - Returns data from `source/contacts.csv`
- `GET /api/users` - Returns data from `source/users.json`
## Sample Responses
### CSV Example (from contacts.csv)
```bash
curl http://localhost:8000/api/contacts
```
Response:
```json
[
{
"location": "dortmund",
"contact": "achim"
},
{
"location": "madrid",
"contact": "santos"
}
]
```
### JSON Example (from users.json)
```bash
curl http://localhost:8000/api/users
```
Response:
```json
{
"users": [
{
"name": "John",
"email": "john@example.com"
},
{
"name": "Jane",
"email": "jane@example.com"
}
]
}
```
## Adding New Files
1. Place CSV or JSON files in the `source` directory
2. Files will be automatically accessible via `/api/{filename}`
3. No restart required
## File Format Support
- CSV files: Must have a header row with column names
- JSON files: Must contain valid JSON data
## Using the API in External Applications
### Python Example
Here's how to consume the API data in a Python script:
```python
import requests
import pandas as pd
from pprint import pprint
# Base URL of the API
API_BASE_URL = 'http://localhost:8000'
# Example 1: Get users data
response = requests.get(f"{API_BASE_URL}/api/users")
users_data = response.json()
pprint(users_data)
# Example 2: Get contacts and convert to DataFrame
response = requests.get(f"{API_BASE_URL}/api/contacts")
contacts_data = response.json()
contacts_df = pd.DataFrame(contacts_data)
print(contacts_df)
# Example 3: Extract specific information
contacts_response = requests.get(f"{API_BASE_URL}/api/contacts")
contacts = contacts_response.json()
locations = [contact['location'] for contact in contacts]
print(f"Available locations: {locations}")
# Example 4: Filtering data
users_response = requests.get(f"{API_BASE_URL}/api/users")
users_data = users_response.json()
filtered_users = [user for user in users_data.get('users', [])
if user.get('name') == 'John']
print(f"Filtered users: {filtered_users}")
```
Output:
```
{'users': [{'name': 'John', 'email': 'john@example.com'},
{'name': 'Jane', 'email': 'jane@example.com'}]}
location contact
0 dortmund achim
1 madrid santos
Available locations: ['dortmund', 'madrid']
Filtered users: [{'name': 'John', 'email': 'john@example.com'}]
```
## Manual Container Setup
### Docker
```bash
# Build the image
docker build -t static2api:latest .
# Run the container
docker run --name static2api \
-p 8000:8000 \
-v "./source":/home/appuser/app/source \
--security-opt no-new-privileges:true \
--cap-drop ALL \
--user 1000:1000 \
-d static2api:latest
```
### Podman
```bash
# Build the image
podman build -t static2api:latest .
# Run the container
podman run --name static2api \
-p 8000:8000 \
-v "./source":/home/appuser/app/source:Z \
--security-opt no-new-privileges:true \
--cap-drop ALL \
--user 1000:1000 \
-d static2api:latest
```
## Container Management
### View Logs
```bash
docker logs static2api
# or
podman logs static2api
```
### Stop Container
```bash
docker stop static2api
# or
podman stop static2api
```
### Remove Container
```bash
docker rm static2api
# or
podman rm static2api
```