JSONPlaceholder is a simple fake REST API for testing and prototyping.
It's like an image placeholder but for web developers.
JSONPlaceholder is powered by JSON Server.
Why?
Most of the time when trying a new library, hacking a prototype or following a tutorial, I found myself in need of some data.
I didn't like the idea of using some public API because I had the feeling that I was spending more time registering a client and understanding a complex API than focusing on my task.
But I liked the idea of image placeholders for web designers. So I decided to code a little Express server inspired by that and here is JSONPlaceholder.
You can find it running here and are free to use it in your developments: http://jsonplaceholder.typicode.com.
Or you can run it locally:
$ npm install -g jsonplaceholder
$ jsonplaceholder
I hope you will find it useful.
Features
- No registration
- Zero-config
- Basic API
- "Has many" relationships
- Filters and nested resources
- Cross-domain (CORS and JSONP)
- Supports GET, POST, PUT, PATCH, DELETE and OPTIONS verbs
- Compatible with Backbone, AngularJS, Ember, ...
Available resources
Let's start with resources, JSONPlaceholder provides the usual suspects:
- Posts http://jsonplaceholder.typicode.com/posts/1
- Comments http://jsonplaceholder.typicode.com/comments/1
- Albums http://jsonplaceholder.typicode.com/albums/1
- Photos http://jsonplaceholder.typicode.com/photos/1
- Users http://jsonplaceholder.typicode.com/users/1
- Todos http://jsonplaceholder.typicode.com/todos/1
How to
Here's some code using jQuery showing what can be done with JSONPlaceholder. Since GitHub loads jQuery, you can simply copy and paste these examples in a console.
Showing a resource
$.ajax('http://jsonplaceholder.typicode.com/posts/1', { method: 'GET' }).then(function(data) { console.log(data); });
Listing resources
$.ajax('http://jsonplaceholder.typicode.com/posts', { method: 'GET' }).then(function(data) { console.log(data); });
Creating a resource
// POST adds a random id to the object sent $.ajax('http://jsonplaceholder.typicode.com/posts', { method: 'POST', data: { title: 'foo', body: 'bar', userId: 1 } }).then(function(data) { console.log(data); }); /* will return { id: 101, title: 'foo', body: 'bar', userId: 1 } */
Note: the resource will not be really created on the server but it will be faked as if.
Updating a resource
$.ajax('http://jsonplaceholder.typicode.com/posts/1', { method: 'PUT', data: { id: 1, title: 'foo', body: 'bar', userId: 1 } }).then(function(data) { console.log(data); }); /* will return { id: 1 title: 'foo', body: 'bar', userId: 1 } */
$.ajax('http://jsonplaceholder.typicode.com/posts/1', { method: 'PATCH', data: { title: 'foo' } }).then(function(data) { console.log(data); }); /* will return { id: 1 title: 'foo', body: 'quia et suscipit [...]', userId: 1 } */
Note: the resource will not be really updated on the server but it will be faked as if.
Deleting a resource
$.ajax('http://jsonplaceholder.typicode.com/posts/1', { method: 'DELETE' });
Note: the resource will not be really deleted on the server but it will be faked as if.
Filtering resources
Basic filtering is supported through query parameters.
// Will return all the posts that belong to the first user $.ajax('http://jsonplaceholder.typicode.com/posts?userId=1').then(function(data) { console.log(data); });
Nested resources
One level of nested route is available.
$.ajax('http://jsonplaceholder.typicode.com/posts/1/comments').then(function(data) { console.log(data); }); // Which is equivalent to /comments?postId=1
Here's the list of available nested routes:
- http://jsonplaceholder.typicode.com/posts/1/comments
- http://jsonplaceholder.typicode.com/albums/1/photos
- http://jsonplaceholder.typicode.com/users/1/albums
- http://jsonplaceholder.typicode.com/users/1/todos
- http://jsonplaceholder.typicode.com/users/1/posts
JSONP request
$.ajax('http://jsonplaceholder.typicode.com/posts/1', { dataType: 'jsonp' }).then(function(data) { console.log(data); });