Une alternative à JSONPlaceholder où les écritures sont enregistrées

Les mêmes types de ressources, mais les écritures sont enregistrées, les mauvaises entrées rejetées et les erreurs disponibles à la demande.

Exemples exécutés pour la dernière fois contre l’API le

JSONPlaceholder simule ses écritures : un POST renvoie id: 101, mais un GET sur cet id renvoie 404, et un DELETE laisse l’enregistrement en place. Si votre application doit relire ce qu’elle vient d’écrire, utilisez https://api.testingapis.com/apiconnectez-vous pour voir. Elle propose les mêmes types de ressources (posts, commentaires, albums, photos, todos et utilisateurs), et les créations, modifications et suppressions sont enregistrées. Elle rejette aussi les entrées invalides avec un 400 et peut faire échouer n’importe quelle requête à la demande, pour construire et tester les états d’erreur. Gratuite, sans clé, et ouverte aux requêtes de toute origine.

Des écritures qui sont enregistrées

Voici ce que fait JSONPlaceholder d’un nouveau post :

Terminal
$ curl -X POST https://jsonplaceholder.typicode.com/posts \
  -H "Content-Type: application/json" \
  -d '{"title":"hello","body":"world","userId":1}'
{ "title": "hello", "body": "world", "userId": 1, "id": 101 }

$ curl -i https://jsonplaceholder.typicode.com/posts/101
HTTP/1.1 404 Not Found

Les mêmes étapes ici : créer un post, le relire, le modifier, le supprimer et vérifier qu’il a disparu.

Terminal
$ curl -X POST https://api.testingapis.com/api/Posts \
  -H "Content-Type: application/json" \
  -d '{"userId":101,"title":"Hello from the guide","body":"Checking that writes persist."}'
{"message":"Post created successfully","data":{"id":16,"userId":101,"title":"Hello from the guide","body":"Checking that writes persist.","tags":[],"publishedAt":"2026-10-07T02:58:58Z","likes":0}}

$ curl https://api.testingapis.com/api/Posts/16
{"id":16,"userId":101,"title":"Hello from the guide","body":"Checking that writes persist.","tags":[],"publishedAt":"2026-10-07T02:58:58Z","likes":0}

$ curl -X PUT https://api.testingapis.com/api/Posts/16 \
  -H "Content-Type: application/json" \
  -d '{"userId":101,"title":"Edited title","body":"Checking that writes persist."}'
{"message":"Post updated successfully","data":{"id":16,"userId":101,"title":"Edited title",...}}

$ curl -X DELETE https://api.testingapis.com/api/Posts/16
{"message":"Post deleted successfully"}

$ curl -i https://api.testingapis.com/api/Posts/16
HTTP/1.1 404 Not Found

{"status":404,"error":"Not Found","message":"Post with ID 16 does not exist."}

Correspondance des routes

JSONPlaceholdertestingapis.comEnregistrements
/posts/api/posts15 (JSONPlaceholder : 100)
/posts/1/comments/api/posts/1/commentsCommentaires du post 1
/comments/api/commentsdocs50 (500)
/albums/api/albumsdocs10 (100)
/albums/1/photos/api/albums/1/photosconnectez-vous pour voir5 par album
/photos/api/photosdocs50 (5 000)
/todos/api/todos30 (200)
/users/api/peopledocs20 (10), avec adresse, coordonnées et entreprise
/users/1/posts/api/posts/user/101Les id d’utilisateur commencent à 101

Les chemins ne tiennent pas compte de la casse : /api/posts et /api/Posts sont identiques. Il y a moins d’enregistrements que sur JSONPlaceholder, mais chacun a plus de champs. Les posts ont des tags, des likes et une date de publication, les todos une priorité et une échéance, et les personnes une adresse et une entreprise imbriquées. La documentation de l’API liste 13 autres types de ressources, des produits et paniers aux livres, films et pays.

GET/api/posts/1

Une mauvaise entrée reçoit une erreur

JSONPlaceholder accepte n’importe quel corps, même vide. Ici, un champ obligatoire manquant renvoie un 400 avec un message, si bien que la branche d’erreur de votre formulaire a quelque chose de réel à afficher :

Terminal
$ curl -i -X POST https://jsonplaceholder.typicode.com/posts -H "Content-Type: application/json" -d '{}'
HTTP/1.1 201 Created

{ "id": 101 }

$ curl -i -X POST https://api.testingapis.com/api/Posts -H "Content-Type: application/json" -d '{"title":""}'
HTTP/1.1 400 Bad Request

{"status":400,"error":"Bad Request","message":"Missing required field: title"}

Des erreurs et des réponses lentes à la demande

Ajoutez ?error=500 à n’importe quelle requête pour qu’elle échoue avec ce statut, ou ?delay=3 pour qu’elle réponde avec trois secondes de retard. Ensemble, ?delay=2&error=503 affiche un état de chargement suivi d’une erreur. Le guide des réponses d’erreur couvre les timeouts, les nouvelles tentatives et les limites de débit.

GET/api/todos/1?error=503

Filtres, tri et pagination

Les deux API filtrent les listes par champ, comme avec ?userId=101, et toutes deux trient, recherchent et paginent. Les noms des paramètres diffèrent :

JSONPlaceholdertestingapis.com
Filtrer?userId=1?userId=101
Paginer?_page=2&_limit=10?page=2&limit=10
Trier?_sort=id&_order=desc?sort=id&order=desc
Rechercher?q=word?q=word
TotalX-Total-CountX-Total-Count, X-Total-Pages

Faire basculer une application

Les lectures renvoient directement l’enregistrement, comme JSONPlaceholder. Les écritures l’enveloppent avec un message, sous la forme { message, data }, et les id d’utilisateur commencent à 101. Ce sont les deux changements dont la plupart des applications ont besoin :

JavaScript
// Before
const BASE = "https://jsonplaceholder.typicode.com";
const post = await (await fetch(`${BASE}/posts/1`)).json();

const created = await (await fetch(`${BASE}/posts`, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ userId: 1, title: "Hi", body: "There" }),
})).json();

// After
const BASE = "https://api.testingapis.com/api";
const post = await (await fetch(`${BASE}/posts/1`)).json();

const { data: created } = await (await fetch(`${BASE}/posts`, {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ userId: 101, title: "Hi", body: "There" }),
})).json();
Cet exemple utilise des points d’accès réservés aux membres connectés.Se connecterCréer un compte gratuit

Quand JSONPlaceholder reste le meilleur choix

  • Vous avez besoin de grandes listes, comme 5 000 photos pour tester le défilement virtuel.
  • Vous suivez un tutoriel qui utilise exactement les id et les champs de JSONPlaceholder.
  • Vous ne faites que lire des données et n’avez jamais besoin qu’une écriture apparaisse ensuite.

Pour aller plus loin, la leçon sur le test CRUD montre comment vérifier que chaque création, modification et suppression a vraiment eu lieu.