Essais de l'API d'expédition
Ce guide fournit des approches de test spécifiques et des exemples pour l'API Equinix Shipments, en s'appuyant sur les principes généraux de test d'API.
Aperçu de l'API Shipments
L'API Shipments vous permet de planifier et de gérer par programmation les envois entrants et sortants vers les centres de données Equinix IBX, notamment:
- Planification des envois entrants (réception des colis)
- Planification des envois sortants (envoi de colis)
- Mise à jour des détails d'expédition
- Gestion des renseignements sur le suivi des envois
- Gestion des renseignements sur les transporteurs et des numéros de suivi
Note importante: Tous les envois entrants et sortants doivent être prévus 24 heures à l'avance. L'API Equinix est un système de production qui génère de véritables demandes d'expédition. Suivez toujours ces bonnes pratiques de test afin d'éviter toute surcharge de travail.
Flux de travail de test d'expédition
Avant de tester l'API Shipments, assurez-vous d'avoir:
- Identifiants d'API valides avec autorisations de commande d'expéditions
- Accès aux emplacements Equinix IBX où se trouvent vos cages
- Identifiants de cage valides pour vos emplacements d'expédition
- Compréhension des exigences des transporteurs et des formats des numéros de suivi
Création d'une demande d'expédition entrante
import requests
import json
from datetime import datetime, timedelta
# Setup authentication
auth_url = "https://api.equinix.com/oauth2/v1/token"
auth_payload = {
"grant_type": "client_credentials",
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET"
}
auth_response = requests.post(auth_url, data=auth_payload)
token = auth_response.json()["access_token"]
# Test creating an inbound shipment request
base_url = "https://api.equinix.com/colocations/v2"
headers = {
"Authorization": f"Bearer {token}",
"Content-Type": "application/json"
}
# Calculate delivery date (24+ hours in advance as required)
delivery_date = (datetime.utcnow() + timedelta(days=2)).isoformat() + "Z"
# Example: Create an inbound shipment request
inbound_payload = {
"type": "INBOUND",
"requestedDateTime": delivery_date,
"cageId": "SV1:01:001MC3",
"customerReferenceId": "SHIP-REF-12345",
"description": "Server hardware delivery for data center expansion project",
"details": {
"carrier": "DHL",
"carrierTrackingNumbers": [
"1234567890123",
"1234567890124"
],
"numberOfBoxes": 2,
"accountNumber": "12345"
},
"purchaseOrder": {
"type": "EXISTING",
"number": "PO-789456"
},
"attachments": [
{
"id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"name": "packing_list.pdf"
}
],
"contacts": [
{
"type": "TECHNICAL",
"registeredUsers": ["tech.admin@example.com"],
"availability": "WORK_HOURS",
"timezone": "America/New_York"
},
{
"type": "NOTIFICATION",
"registeredUsers": ["notifications@example.com"]
}
]
}
create_response = requests.post(
f"{base_url}/orders/shipments",
headers=headers,
data=json.dumps(inbound_payload)
)
# Verify response
assert create_response.status_code == 201, f"Failed to create shipment: {create_response.text}"
# Extract order ID from Location header
order_number = create_response.json()["OrderNumber"]
print(f"Successfully created inbound shipment with order ID: {order_number}")
Création d'une demande d'expédition sortante
# Example: Create an outbound shipment request
outbound_payload = {
"type": "OUTBOUND",
"requestedDateTime": delivery_date,
"cageId": "SV1:01:001MC3",
"customerReferenceId": "OUT-SHIP-67890",
"description": "Returning defective network equipment to vendor",
"details": {
"carrier": "FEDEX",
"carrierTrackingNumbers": [
"987654321098"
],
"numberOfBoxes": 1,
"pickupLocation": "Main cage entrance",
"specialInstructions": "Handle with care - contains sensitive electronic equipment"
},
"purchaseOrder": {
"type": "EXEMPTED"
},
"contacts": [
{
"type": "TECHNICAL",
"registeredUsers": ["shipping@example.com"],
"availability": "ANYTIME"
}
]
}
outbound_response = requests.post(
f"{base_url}/orders/shipments",
headers=headers,
data=json.dumps(outbound_payload)
)
assert outbound_response.status_code == 201, f"Failed to create outbound shipment: {outbound_response.text}"
order_number = outbound_response.json()["OrderNumber"]
print("Successfully created outbound shipment request with order ID: {order_number}")
Scénarios d'erreurs de test
Testez toujours la gestion des erreurs de votre implémentation d'API:
# Test with invalid carrier
invalid_carrier_payload = {
"type": "INBOUND",
"requestedDateTime": delivery_date,
"cageId": "SV1:01:001MC3",
"details": {
"carrier": "INVALID_CARRIER", # Invalid carrier
"carrierTrackingNumbers": ["1234567890"],
"numberOfBoxes": 1
},
"contacts": [
{
"type": "TECHNICAL",
"registeredUsers": ["test@example.com"]
}
]
}
error_response = requests.post(
f"{base_url}/orders/shipments",
headers=headers,
data=json.dumps(invalid_carrier_payload)
)
# Verify error response
assert error_response.status_code == 400, f"Expected error but got: {error_response.status_code}"
error_data = error_response.json()
assert any("carrier" in error["errorMessage"].lower() for error in error_data), "Expected carrier validation error"
# Test with insufficient advance notice (less than 24 hours)
insufficient_time_payload = {
"type": "INBOUND",
"requestedDateTime": (datetime.utcnow() + timedelta(hours=12)).isoformat() + "Z", # Only 12 hours advance
"cageId": "SV1:01:001MC3",
"details": {
"carrier": "DHL",
"carrierTrackingNumbers": ["1234567890"],
"numberOfBoxes": 1
},
"contacts": [
{
"type": "TECHNICAL",
"registeredUsers": ["test@example.com"]
}
]
}
time_error_response = requests.post(
f"{base_url}/orders/shipments",
headers=headers,
data=json.dumps(insufficient_time_payload)
)
assert time_error_response.status_code == 400, f"Expected time validation error but got: {time_error_response.status_code}"
Meilleures pratiques pour les tests d'API d'expédition
- Règle des 24 heures d'avance: Planifiez toujours vos expéditions au moins 24 heures à l'avance.
- Numéros de suivi valides: Utilisez des formats de numéros de suivi réalistes pour chaque transporteur.
- Informations de contact correctes: Assurez-vous que vos contacts sont disponibles pendant les plages horaires de livraison.
- Accès aux cages: Vérifiez les identifiants des cages et les autorisations d’accès avant les tests.
- Expéditions internationales: Veuillez tenir compte des exigences douanières pour les livraisons internationales.
- Instructions spéciales: Tester en respectant diverses exigences de manipulation particulières
- Pièces jointes: Test de téléchargement de pièces jointes pour les listes de colisage et les instructions spéciales
- Fuseaux horaires: Gérer correctement les conversions de fuseaux horaires pour la planification.
- Bons de commande: Tester différents types de bons de commande (NOUVEAUX, EXISTANTS, EXEMPTÉS)
Considérations relatives à l'automatisation
Lors de la création d'une automatisation autour de l'API Shipments:
- Mettre en œuvre une validation pour l'exigence de planification préalable de 24 heures.
- Intégrer une validation propre à l'opérateur pour les formats de numéros de suivi
- Inclure une gestion appropriée des erreurs pour les problèmes de disponibilité et de capacité des opérateurs
- Mettre en place des récepteurs de webhook pour les mises à jour de statut des envois
- Configurer la journalisation d'audit pour toutes les transactions d'expédition
- Validez l'accès à la cage et les autorisations avant de créer des demandes
- Assurer une bonne gestion des fuseaux horaires pour les sites internationaux