static2api/README.md

238 lines
4.9 KiB
Markdown

# Static2API
A simple FastAPI application that automatically exposes CSV and JSON files as API endpoints.
# TODO
- [x] show source format as well
- [ ] allow upload of static files (with password)
## 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 parsed data from files in the source directory
- `GET /api/{filename}/src` - Download the original source file
Example:
- `GET /api/contacts` - Returns parsed data from `source/contacts.csv` as JSON
- `GET /api/contacts/src` - Downloads the original `contacts.csv` file
- `GET /api/users` - Returns parsed data from `source/users.json`
- `GET /api/users/src` - Downloads the original `users.json` file
## 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: Download original source files
# Download the original CSV file
csv_response = requests.get(f"{API_BASE_URL}/api/contacts/src")
with open('downloaded_contacts.csv', 'wb') as f:
f.write(csv_response.content)
print("Downloaded contacts.csv")
# Download the original JSON file
json_response = requests.get(f"{API_BASE_URL}/api/users/src")
with open('downloaded_users.json', 'wb') as f:
f.write(json_response.content)
print("Downloaded users.json")
# Example 4: 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 5: 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
Downloaded contacts.csv
Downloaded users.json
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
```