Ontwerp een flexibele API voor mijn toepassing
description
Met deze prompt kan de gebruiker een op maat gemaakte API ontwerpen die schaalbaar en onderhoudbaar is, afgestemd op hun specifieke projectwensen. Het helpt hen om te leren hoe ze robuuste interfaces kunnen bouwen volgens de beste praktijken, wat leidt tot efficiëntere samenwerking en uitbreidbaarheid.
prompt
Help me een flexibele API te ontwerpen voor mijn toepassing die de volgende functionaliteit ondersteunt: <beschrijf de fun ...
try_prompt
generate_helper
disclaimerOnPageApi
tags
ai_answers
provider: openai
model: gpt-4.1-nano
Natuurlijk! Hieronder vind je een stapsgewijze uitleg en een voorbeeldimplementatie van een flexibele API voor het aanmaken, bijwerken en ophalen van bestellingen in Python, gebruikmakend van Flask (een populair webframework).
**Stapsgewijze uitleg**
1. **Bepaal de data structuur**
Definieer wat een bestelling bevat, bijvoorbeeld:
- bestelnummer (ID)
- klantnaam
- producten (lijst)
- totaalbedrag
- status
2. **Kies een opslagmethode**
Voor eenvoud gebruiken we een in-memory dictionary. In productie zou je een database gebruiken.
3. **Maak de API endpoints**
- POST /bestellingen: voor het aanmaken van een nieuwe bestelling
- GET /bestellingen/<id>: voor het ophalen van een bestelling
- PUT /bestellingen/<id>: voor het bijwerken van een bestelling
4. **Implementeer de logica**
- Validatie van invoer
- Aanmaak en bijwerking van data
- Ophalen van data
5. **Test de API**
Gebruik tools zoals Postman of curl.
---
**Voorbeeldimplementatie in Python met Flask**
```python
from flask import Flask, request, jsonify, abort
app = Flask(__name__)
# In-memory opslag voor bestellingen
bestellingen = {}
volgnummer = 1
# Endpoint voor het aanmaken van een bestelling
@app.route('/bestellingen', methods=['POST'])
def create_bestelling():
global volgnummer
data = request.get_json()
# Basis validatie
if not data or 'klantnaam' not in data or 'producten' not in data:
return jsonify({"error": "Onvoldoende gegevens"}), 400
bestelling_id = volgnummer
volgnummer += 1
bestelling = {
'id': bestelling_id,
'klantnaam': data['klantnaam'],
'producten': data['producten'],
'totaal': data.get('totaal', 0),
'status': data.get('status', 'In behandeling')
}
bestellingen[bestelling_id] = bestelling
return jsonify(bestelling), 201
# Endpoint voor het ophalen van een bestelling
@app.route('/bestellingen/<int:bestelling_id>', methods=['GET'])
def get_bestelling(bestelling_id):
bestelling = bestellingen.get(bestelling_id)
if not bestelling:
abort(404, description="Bestelling niet gevonden")
return jsonify(bestelling)
# Endpoint voor het bijwerken van een bestelling
@app.route('/bestellingen/<int:bestelling_id>', methods=['PUT'])
def update_bestelling(bestelling_id):
data = request.get_json()
bestelling = bestellingen.get(bestelling_id)
if not bestelling:
abort(404, description="Bestelling niet gevonden")
# Bijwerken van velden indien aanwezig
if 'klantnaam' in data:
bestelling['klantnaam'] = data['klantnaam']
if 'producten' in data:
bestelling['producten'] = data['producten']
if 'totaal' in data:
bestelling['totaal'] = data['totaal']
if 'status' in data:
bestelling['status'] = data['status']
return jsonify(bestelling)
if __name__ == '__main__':
app.run(debug=True)
```
**Samenvatting:**
- We gebruiken POST om nieuwe bestellingen te maken
- GET om bestaande bestellingen op te halen
- PUT om bestellingen bij te werken
Voor verdere flexibiliteit kun je extra velden en validaties toevoegen, en je opslag aanpassen naar een database.
provider: deepseek
model: deepseek-chat
Ik help je graag met het ontwerpen van een flexibele API voor bestellingen. Hier is een stapsgewijze uitleg en voorbeeldimplementatie in Python.
## Stap 1: API Design Principes
**RESTful endpoints:**
- `POST /orders` - Nieuwe bestelling aanmaken
- `GET /orders` - Alle bestellingen ophalen
- `GET /orders/{order_id}` - Specifieke bestelling ophalen
- `PUT /orders/{order_id}` - Bestelling bijwerken
- `DELETE /orders/{order_id}` - Bestelling verwijderen
## Stap 2: Data Model
```python
from pydantic import BaseModel, Field
from typing import List, Optional
from datetime import datetime
from enum import Enum
class OrderStatus(str, Enum):
PENDING = "pending"
PROCESSING = "processing"
SHIPPED = "shipped"
DELIVERED = "delivered"
CANCELLED = "cancelled"
class OrderItem(BaseModel):
product_id: str
quantity: int
price: float
name: str
class OrderCreate(BaseModel):
customer_id: str
items: List[OrderItem]
shipping_address: str
class OrderResponse(OrderCreate):
id: str
status: OrderStatus
created_at: datetime
updated_at: datetime
total_amount: float
```
## Stap 3: FastAPI Implementatie
```python
from fastapi import FastAPI, HTTPException, status
from fastapi.middleware.cors import CORSMiddleware
import uuid
from datetime import datetime
app = FastAPI(title="Order Management API", version="1.0.0")
# CORS middleware voor frontend integratie
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
# In-memory database (vervang dit met echte database)
orders_db = {}
@app.post("/orders", response_model=OrderResponse, status_code=status.HTTP_201_CREATED)
async def create_order(order: OrderCreate):
"""Maak een nieuwe bestelling aan"""
order_id = str(uuid.uuid4())
total_amount = sum(item.price * item.quantity for item in order.items)
order_data = {
"id": order_id,
"customer_id": order.customer_id,
"items": [item.dict() for item in order.items],
"shipping_address": order.shipping_address,
"status": OrderStatus.PENDING,
"created_at": datetime.now(),
"updated_at": datetime.now(),
"total_amount": total_amount
}
orders_db[order_id] = order_data
return order_data
@app.get("/orders", response_model=List[OrderResponse])
async def get_orders(
customer_id: Optional[str] = None,
status: Optional[OrderStatus] = None,
limit: int = 100,
offset: int = 0
):
"""Haal bestellingen op met optionele filters"""
filtered_orders = list(orders_db.values())
if customer_id:
filtered_orders = [o for o in filtered_orders if o["customer_id"] == customer_id]
if status:
filtered_orders = [o for o in filtered_orders if o["status"] == status]
return filtered_orders[offset:offset + limit]
@app.get("/orders/{order_id}", response_model=OrderResponse)
async def get_order(order_id: str):
"""Haal een specifieke bestelling op"""
if order_id not in orders_db:
raise HTTPException(status_code=404, detail="Bestelling niet gevonden")
return orders_db[order_id]
@app.put("/orders/{order_id}", response_model=OrderResponse)
async def update_order(order_id: str, status: OrderStatus):
"""Update de status van een bestelling"""
if order_id not in orders_db:
raise HTTPException(status_code=404, detail="Bestelling niet gevonden")
orders_db[order_id]["status"] = status
orders_db[order_id]["updated_at"] = datetime.now()
return orders_db[order_id]
@app.delete("/orders/{order_id}", status_code=status.HTTP_204_NO_CONTENT)
async def delete_order(order_id: str):
"""Verwijder een bestelling"""
if order_id not in orders_db:
raise HTTPException(status_code=404, detail="Bestelling niet gevonden")
del orders_db[order_id]
return None
```
## Stap 4: Gebruiksvoorbeelden
**1. Nieuwe bestelling aanmaken:**
```python
import requests
BASE_URL = "http://localhost:8000"
# Nieuwe bestelling
order_data = {
"customer_id": "cust_123",
"shipping_address": "Straatnaam 123, 1000 Amsterdam",
"items": [
{
"product_id": "prod_001",
"name": "Laptop",
"quantity": 1,
"price": 999.99
},
{
"product_id": "prod_002",
"name": "Muis",
"quantity": 2,
"price": 25.50
}
]
}
response = requests.post(f"{BASE_URL}/orders", json=order_data)
print(response.json())
```
**2. Bestellingen ophalen:**
```python
# Alle bestellingen
response = requests.get(f"{BASE_URL}/orders")
# Bestellingen van specifieke klant
response = requests.get(f"{BASE_URL}/orders?customer_id=cust_123")
# Bestellingen met status filter
response = requests.get(f"{BASE_URL}/orders?status=processing")
```
## Stap 5: Uitvoeren en Testen
```bash
# Installeer dependencies
pip install fastapi uvicorn
# Start de server
uvicorn main:app --reload --host 0.0.0.0 --port 8000
# Bekijk API documentatie
# http://localhost:8000/docs
```
## Flexibiliteit Features:
1. **Filtering**: Ondersteunt filtering op customer_id en status
2. **Paginering**: Limit en offset parameters voor grote datasets
3. **Validatie**: Automatische data validatie met Pydantic
4. **Error Handling**: Duidelijke foutmeldingen met HTTP status codes
5. **CORS**: Ondersteuning voor cross-origin requests
6. **Documentatie**: Automatische OpenAPI/Swagger docs
Deze API is gemakkelijk uit te breiden met extra functionaliteit zoals betalingen, verzendtracking, of integratie met externe services.
error: Generation failed [deepseek] prompt_id=1177 locale=fr err=DeepSeek connection/timeout