Esempio di programmazione a turni

L'esempio seguente mostra come chiamare l'API con la libreria requests Python, utilizzando una chiave API per l'autenticazione. Per utilizzarla:

  • Installa la libreria requests Python. Dalla riga di comando: pip install requests.
  • Salva il seguente programma Python sul tuo computer e assegnagli il nome example.py.
  • Salva il file example_request.json nella stessa directory del programma (questa è una richiesta JSON di esempio).
  • Crea un file credentials.json nella stessa directory del programma con {"key": "your_api_key"}
  • Esegui l'esempio dalla riga di comando: python example.py.

# example.py
import json
import requests

def run_example():
    """Calls the OR API to solve a shift scheduling problem."""
    
    # Endpoint for the workforce scheduling solver in the OR API.
    end_point = "https://optimization.googleapis.com/v1/scheduling:solveShiftScheduling"
    
    # Read the API Key from a JSON file with the format:
    # {"key": "your_api_key"}
    with open("credentials.json") as f:
        credentials = json.load(f)
        api_key = credentials["key"]

    # Load the JSON file with the request.
    with open("example_request.json", "r") as f:
        json_request = json.load(f)

    # Call the API post method.
    response = requests.post(f"{end_point}?key={api_key}", json=json_request)

    # Process the response.
    if response.ok:
        solution = json.loads(response.content)
        with open("example_response.json", "w") as f:
            json.dump(solution, f, indent=2)
        print(solution)
    else:
        error = json.loads(response.content)["error"]
        print(f'Status code {error["code"]}: {error["message"]}')

if __name__ == "__main__":
    run_example()

Come si impostano le scadenze?

Una scadenza determina il tempo massimo necessario a una chiamata all'API. Un utente può impostare scadenze sia client che server. Nel contesto dell'API OR, una scadenza del server è quella più utile in quanto indica al server di backend quanto tempo deve per ricevere una richiesta, eseguire il risolutore sottostante e restituire una risposta. Al contrario, le scadenze del client sono utili per impostare il tempo massimo di attesa per l'applicazione client (ovvero l'applicazione che chiama l'API OR) prima del timeout.

Il seguente snippet di codice imposta una scadenza sia per il client sia per il server nelle intestazioni di sessione della richiesta. La scadenza per il client è impostata su 60 secondi. La scadenza del server deve essere inferiore a quella del client per tenere conto dell'overhead di comunicazione. Qui abbiamo impostato la scadenza del server al 95% di quella del client, ma questa può variare a seconda dell'applicazione. Nota che la chiave API è stata spostata anche nelle intestazioni di sessione per rendere più pulita la chiamata session.post(...).



# Call the API post method.
session = requests.Session()
client_deadline_seconds = 60
server_deadline_seconds = 0.95 * client_deadline_seconds
session.headers = {
    "Content-Type": "application/json",
    "Connection": "keep-alive",
    "Keep-Alive": f"timeout={client_deadline_seconds}, max=1",
    "X-Server-Timeout": f"{server_deadline_seconds}",
    "X-Goog-Api-Key": api_key,
}
response = session.post(end_point, json=json_request, timeout=client_deadline_seconds)