Przykłady requestów i odpowiedzi
Przykłady dla naszego API, zgodne z technical-conventions.md i założeniami REST API – Założenia v1.0 (pharmind XF): wersja w ścieżce /v1/, rzeczowniki w liczbie mnogiej, kebab-case w ścieżkach, snake_case w parametrach zapytań, camelCase w JSON, PATCH = tylko pola do zmiany, błędy w formacie Problem Details.
1. Odczyt zasobu (GET)
Request:
GET /v1/purchase-orders?user_id=123&start_date=2025-01-01 HTTP/1.1
Host: <base-url>
Authorization: Bearer <token>
Accept: application/json
ks-client: my-system
Response (200 OK):
{
"id": "po-001",
"orderNumber": "PO-2025-001",
"status": "Open",
"createdAt": "2025-01-15T10:00:00Z"
}
Pola w camelCase; parametry zapytań w snake_case. Konkretne zasoby i pola — zgodnie z api-contracts.md.
2. Utworzenie zasobu (POST)
Request:
POST /v1/purchase-orders HTTP/1.1
Host: <base-url>
Authorization: Bearer <token>
Content-Type: application/json
Accept: application/json
{
"supplierId": "sup-001",
"orderDate": "2025-01-15",
"lineItems": [
{
"productId": "prod-001",
"quantity": 10,
"unitPrice": 99.50
}
]
}
Response (201 Created):
{
"id": "po-002",
"orderNumber": "PO-2025-002",
"status": "Open",
"createdAt": "2025-01-15T11:00:00Z"
}
3. Częściowa aktualizacja zasobu (PATCH)
Request: Tylko pola do zmiany (prosty obiekt JSON).
PATCH /v1/invoices/inv-001 HTTP/1.1
Host: <base-url>
Authorization: Bearer <token>
Content-Type: application/json
Accept: application/json
{
"tags": ["tag1", "tag2"],
"documentProcessingStatus": "Processed",
"processingSystem": "ERP"
}
Response (200 OK): Zaktualizowany zasób (pola w camelCase) lub potwierdzenie — zgodnie z kontraktem.
4. Obsługa błędów (Problem Details)
Response (404 Not Found):
{
"status": 404,
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.4",
"title": "Resource not found",
"detail": "Purchase order 'po-999' could not be found",
"instance": "/v1/purchase-orders/po-999"
}
Response (422 Unprocessable Entity):
{
"status": 422,
"type": "https://example.com/errors/validation",
"title": "Validation error",
"detail": "Quantity must be greater than zero",
"instance": "/v1/purchase-orders"
}
Format zgodny z RFC 7807 Problem Details (status, type, title, detail, instance).
5. Statusy HTTP (skrót)
- 200 OK — żądanie zakończone sukcesem.
- 201 Created — zasób utworzony.
- 202 Accepted — przyjęte do przetwarzania.
- 204 No Content — brak body (np. po DELETE).
- 400 Bad Request — nieprawidłowe dane.
- 401 Unauthorized — wymagane logowanie.
- 403 Forbidden — brak uprawnień.
- 404 Not Found — zasób nie istnieje.
- 409 Conflict — konflikt danych.
- 422 Unprocessable Entity — błąd walidacji.
- 429 Too Many Requests — przekroczony limit.
- 500 Internal Server Error — błąd serwera.
6. Paginacja
Request (parametry w snake_case):
Response (200 OK):
{
"items": [
{
"id": "po-001",
"orderNumber": "PO-2025-001",
"status": "Open"
}
],
"totalCount": 150,
"nextPageToken": "eyJwYWdlIjoyfQ=="
}
Nazwy pól (np. nextPageToken, page_size) do ustalenia w konwencjach; pola w JSON w camelCase.
7. Zasób z Identifier i Coding (rozszerzalna identyfikacja, wzorowana na FHIR)
Modele mogą zawierać tablicę identifiers (identyfikatory z różnych systemów) oraz pola typu Coding / CodeableConcept (kody z systemów terminologicznych). Zgodnie z technical-conventions.md.
Response (200 OK) — np. zamówienie zakupu z identyfikatorami i typem dokumentu:
{
"id": "po-001",
"identifiers": [
{
"system": "https://api.example.com/identifiers/purchase-order",
"value": "PO-2025-001",
"use": "official"
},
{
"system": "urn:supplier:erp:order-id",
"value": "SUP-98765",
"use": "secondary"
}
],
"orderNumber": "PO-2025-001",
"documentType": {
"coding": [
{
"system": "https://api.example.com/codes/document-type",
"code": "PO",
"display": "Purchase Order"
}
],
"text": "Purchase Order"
},
"status": {
"coding": [
{
"system": "https://api.example.com/codes/order-status",
"code": "open",
"display": "Open"
}
]
},
"createdAt": "2025-01-15T10:00:00Z"
}
identifiers — wielozakresowa identyfikacja (wewnętrzny numer, numer u dostawcy). documentType i status — CodeableConcept z tablicą coding (system, code, display) i opcjonalnym text.
Wszystkie przykłady odnoszą się do naszego API; po doprecyzowaniu kontraktów w api-contracts.md uzupełnić konkretnymi zasobami i polami.