Skip to content

Instantly share code, notes, and snippets.

@pgrimaud
Last active January 26, 2021 16:00
Show Gist options
  • Save pgrimaud/bd7b1cd12a685885ea08a0caeca7e88a to your computer and use it in GitHub Desktop.
Save pgrimaud/bd7b1cd12a685885ea08a0caeca7e88a to your computer and use it in GitHub Desktop.
Mini API
<?php
# Lancer le projet rapidement : php -S 127.0.0.1:8000
# Features
# - Login via API
# - Requête HTTP de type POST
# - /login
# - récupérer la liste des comptes via API
# - Requête HTTP de type GET
# - soumettre une transaction via API
# - Requête HTTP de type POST
# Par manque de temps, ces données sont écrites en dur pour s'abstraire de la couche de persistance (sql par exemple)
const USER = 'pierre';
const PASSWORD = 'password1234';
const ACCOUNTS = [
'PEL' => 15000,
'LDD' => 11000,
'ASSU_VIE' => 35000
];
header('Content-Type: application/json');
$path = $_SERVER['PATH_INFO'] ?? '/';
# $path = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '/'
switch ($path) {
case '/login':
// on vérifie que la méthode HTTP est bien POST
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// on vérifie les identifiants
$user = $_POST['user'] ?? null;
$password = $_POST['password'] ?? null;
// si les informations soumises sont bonnes
if ($user === USER && $password === PASSWORD) {
// je suis connecté et je génère un token
$token = md5(USER . PASSWORD);
echo json_encode([
'result' => [
'token' => $token
],
'code' => 200
]);
} else {
// erreur de login ou de password
header("HTTP/1.0 401 Unauthorized");
echo json_encode([
'result' => 'Error 401 : wrong login or password',
'code' => 401
]);
}
} else {
// les autres méthodes ne sont pas autorisées
header("HTTP/1.0 405 Method not allowed");
echo json_encode([
'result' => 'Error 405 : method ' . $_SERVER['REQUEST_METHOD'] . ' not allowed',
'code' => 405
]);
}
break;
case '/accounts':
// on vérifie que la méthode HTTP est bien GET
if ($_SERVER['REQUEST_METHOD'] === 'GET') {
// on vérifie que le token passé en paramètre est bon
$apiKey = $_GET['token'] ?? null;
$token = md5(USER . PASSWORD);
// si l'apikey soumise en paramètres GET est la même que le token, on est identifié
if ($apiKey === $token) {
// on affiche la liste des comptes
echo json_encode([
'result' => [
'accounts' => ACCOUNTS
],
'code' => 200
]);
} else {
// erreur d'api key
header("HTTP/1.0 401 Unauthorized");
echo json_encode([
'result' => 'Error 401 : wrong or missing api key',
'code' => 401
]);
}
} else {
// les autres méthodes ne sont pas autorisées
header("HTTP/1.0 405 Method not allowed");
echo json_encode([
'result' => 'Error 405 : method ' . $_SERVER['REQUEST_METHOD'] . ' not allowed',
'code' => 405
]);
}
break;
case '/transactions':
// on vérifie que la méthode HTTP est bien POST
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// on vérifie que le token passé en paramètre est bon
$apiKey = $_GET['token'] ?? null;
$token = md5(USER . PASSWORD);
// si l'apikey soumise en paramètres GET est la même que le token, on est identifié
if ($apiKey === $token) {
// on vérifie les informations soumises
$amount = $_POST['amount'] ?? 0;
$account = $_POST['account'] ?? null;
// if (isset(ACCOUNTS[$account]))
if (array_key_exists($account, ACCOUNTS)) {
// le compte existe, je peux affiche le nouveau solde
echo json_encode([
'result' => [
$account => ACCOUNTS[$account] + $amount,
],
'code' => 200
]);
} else {
// le compte n'existe pas
header("HTTP/1.0 404 Not Found");
echo json_encode([
'result' => 'Error 404 : ' . $account . ' account not found',
'code' => 404
]);
}
} else {
// erreur d'api key
header("HTTP/1.0 401 Unauthorized");
echo json_encode([
'result' => 'Error 401 : wrong or missing api key',
'code' => 401
]);
}
} else {
// les autres méthodes ne sont pas autorisées
header("HTTP/1.0 405 Method not allowed");
echo json_encode([
'result' => 'Error 405 : method ' . $_SERVER['REQUEST_METHOD'] . ' not allowed',
'code' => 405
]);
}
break;
// la route n'est pas trouvée, donc c'est une erreur 404
default:
header("HTTP/1.0 404 Not Found");
echo json_encode([
'result' => 'Error 404 : ' . $path . ' not found',
'code' => 404
]);
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment