Ember.js and JavaScript Consultant
ORD ✈ SAN
fake server endpionts
built on microlibraries
enables rapid prototyping
client-side developent parallel or before server-side
create some fixture data
var ANIMALS = { "1": { id: 1, type: 'cat', name: 'Bubbles', age: '10 months', gender: 'female', src: 'http://i.imgur.com/O2WhkzI.jpg' }, "2": { id: 2, type: 'dog', name: 'Michiko', age: '3 months', gender: 'male', src: 'http://i.imgur.com/KNm9a.jpg' } };
define some endpoints
var server = new Pretender(function() { this.get('/animals', function(request) { var animals = Object.keys(ANIMALS).map(function(k) { return ANIMALS[k]; }); var all = JSON.stringify({ "animals": animals }); return [200, {"Content-Type": "application/json"}, all]; }); this.get('/animals/:id', function(request) { var animal = JSON.stringify({ "animal": ANIMALS[request.params.id] }); return [200, {"Content-Type": "application/json"}, animal]; }); });
overrides the native xhr object and mimics its behavior
intercepts requests to server
used to retrieve data from url without page refresh
different protocals and response data types
var xmlhttp; if (window.XMLHttpRequest) { xmlhttp = new XMLHttpRequest(); // code for IE7+, Firefox, Chrome, Opera, Safari } else { xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); // code for IE6, IE5 } xmlhttp.onreadystatechange = function() { if (xmlhttp.readyState == 4 ) { if(xmlhttp.status == 200){ // do something with `xmlhttp.responseText` } else if(xmlhttp.status == 400) { // handle 400 error } else { // handle other errors } } } xmlhttp.open("get", "/animals", true); xmlhttp.send();
$.ajax(), $.get(), $.post()
http protocol
data types json, xml, text, html, script
$.ajax({ url: '/animals', dataType: 'json' }).done(function(data) { // do something })
lightweight router
register different paths to different handlers
pretender uses unique instance for each endpoint
each possible request verb gets its own router
this.registry = { GET: new RouteRecognizer(), PUT: new RouteRecognizer(), POST: new RouteRecognizer(), DELETE: new RouteRecognizer(), PATCH: new RouteRecognizer(), HEAD: new RouteRecognizer() };
register handlers to routers by path and verb
register: function register(verb, path, handler){ handler.numberOfCalls = 0; this.handlers.push(handler); var registry = this.registry[verb]; registry.add([{path: path, handler: handler}]) },
simple example - just index
better example - index, show, create, update, destroy
remove completely or shutdown pretender
server.shutdown();
github.com/hbrysiewicz/sdjs-fakeit
author of pretender and fakexmlhttprequest