PC + WiFi Mobile + WiFi Mobile + LTE Mobile + HSDPA+ Mobile + 2G min 0.993 2 15 42 203 avg 3.435 19 90 60 227 max 30.678 460 811 956 2000 stddev 2.22 17 x 55 84 down 139.90 18.57 14.47 5.73 0.08 up 86.19 18.23 5.73 3.68 0.1
GET /users/123
{ "name": "John Doe", "age": 25, "links": [ { "rel": "self", "href": "/users/123" }, { "rel": "account", "href": "/accounts/987" }, { "rel": "address", "href": "/addresses/555" } ] }
GET /addresses/555
{ "street": "Sesame", "no": 25, "zipCode": "12-321", "state": "NY", "country": "US" }
GET /users/123
{ "name": "John Doe", "age": 25, "country": "US" }
GET /users/123?fields=[name,age,address[country]]
{ "name": "John Doe", "age": 25, "country": "US" }
Connection: Keep-Alive
Complete model
{ "person": { "id": 12345, "firstName": "John", "lastName": "Doe", "age": 25, "phones": { "home": "800-123-4567", "work": "888-555-0000", "cell": "877-123-1234" }, "email": [ "jd@example.com", "jd@example.org" ], "dateOfBirth": "1980-01-02T00:00:00.000Z", "registered": true, "emergencyContacts": [ { "name": "", "phone": "", "email": "", "relationship": "spouse|parent|child|other" } ], "address": { "street": "Sesame", "no": 25, "zipCode": "12-321", "state": "NY", "country": "US" } } }
Trimmed model
{ "firstName": "John", "lastName": "Doe", "age": 25, "country": "US" }
Full: 222910 bytes GZIP: 32128 bytes (14%)
{ "people": [ { "firstName": "Jason", "lastName": "Page", "username": "jasonp", "isMale": true, "phone": "142-808-3743", "nid": "12252671714" }, { "firstName": "Nathaniel", "lastName": "Chaney", "username": "nchaney", "isMale": true, "phone": "481-659-731", "nid": "55122958778" }, { "firstName": "Alexis", "lastName": "Christensen", "username": "alexisc", "isMale": false, "phone": "802-046-8689", "nid": "13240667404" }, { "firstName": "Sophie", "lastName": "Duke", "username": "sophied", "isMale": false, "phone": "316-701-3331", "nid": "96071009282" }, { "firstName": "Aria", "lastName": "Wolf", "username": "ariaw", "isMale": false, "phone": "682-172-2915", "nid": "12231830224" }, { "firstName": "Sebastian", "lastName": "Hogan", "username": "sebastianh", "isMale": true, "phone": "096-033-8930", "nid": "65082565494" }, { "firstName": "Austin", "lastName": "Rice", "username": "austinr", "isMale": true, "phone": "558-871-007", "nid": "91102544132" }, { "firstName": "Elijah", "lastName": "Savage", "username": "esavage", "isMale": true, "phone": "009-900-8985", "nid": "10301742394" }, { "firstName": "Colton", "lastName": "Morris", "username": "cmorris", "isMale": true, "phone": "029-957-8223", "nid": "84062095076" }, { "firstName": "Juan", "lastName": "Bass", "username": "jbass", "isMale": true, "phone": "701-810-3457", "nid": "10311068954" }, { "firstName": "Brody", "lastName": "Reese", "username": "breese", "isMale": true, "phone": "320-610-636", "nid": "82112959596" }, { "firstName": "Stella", "lastName": "Bernard", "username": "sbernard", "isMale": false, "phone": "134-462-1924", "nid": "03272935528" }, { "firstName": "Isaac", "lastName": "Webb", "username": "iwebb", "isMale": true, "phone": "136-000-422", "nid": "10231649814" }, { "firstName": "Jackson", "lastName": "Bryan", "username": "jacksonb", "isMale": true, "phone": "629-900-7729", "nid": "83071189716" }, { "firstName": "Liam", "lastName": "Beard", "username": "lbeard", "isMale": true, "phone": "327-639-010", "nid": "86050552116" }, { "firstName": "Parker", "lastName": "Duffy", "username": "pduffy", "isMale": true, "phone": "484-829-6473", "nid": "56122687578" }, { "firstName": "Lucy", "lastName": "Moody", "username": "lucym", "isMale": false, "phone": "723-670-5321", "nid": "77051444320" }, { "firstName": "Aaliyah", "lastName": "Leonard", "username": "aleonard", "isMale": false, "phone": "005-293-048", "nid": "08281195048" }, { "firstName": "Brody", "lastName": "Norris", "username": "brodyn", "isMale": true, "phone": "789-653-2217", "nid": "58050880078" }, { "firstName": "Juan", "lastName": "Valenzuela", "username": "juanv", "isMale": true, "phone": "060-065-140", "nid": "93052612612" }, { "firstName": "Jocelyn", "lastName": "Collins", "username": "jcollins", "isMale": false, "phone": "010-257-964", "nid": "65083166064" }, { "firstName": "Bentley", "lastName": "Welch", "username": "bentleyw", "isMale": true, "phone": "068-620-269", "nid": "09293076518" } ] }
Full: 48 bytes GZIP: 60 bytes (125%)
{ "firstName": "Arianna", "lastName": "Mcknight" }
GET /people/
{ "people": [ { "firstName": "Jason", "lastName": "Page", "username": "jasonp", "isMale": true, "phone": "142-808-3743", "nid": "12252671714" }, { "firstName": "Nathaniel", "lastName": "Chaney", "username": "nchaney", "isMale": true, "phone": "481-659-731", "nid": "55122958778" }, { "firstName": "Alexis", "lastName": "Christensen", "username": "alexisc", "isMale": false, "phone": "802-046-8689", "nid": "13240667404" }, { "firstName": "Sophie", "lastName": "Duke", "username": "sophied", "isMale": false, "phone": "316-701-3331", "nid": "96071009282" }, { "firstName": "Aria", "lastName": "Wolf", "username": "ariaw", "isMale": false, "phone": "682-172-2915", "nid": "12231830224" }, { "firstName": "Sebastian", "lastName": "Hogan", "username": "sebastianh", "isMale": true, "phone": "096-033-8930", "nid": "65082565494" }, { "firstName": "Austin", "lastName": "Rice", "username": "austinr", "isMale": true, "phone": "558-871-007", "nid": "91102544132" }, { "firstName": "Elijah", "lastName": "Savage", "username": "esavage", "isMale": true, "phone": "009-900-8985", "nid": "10301742394" }, { "firstName": "Colton", "lastName": "Morris", "username": "cmorris", "isMale": true, "phone": "029-957-8223", "nid": "84062095076" }, { "firstName": "Juan", "lastName": "Bass", "username": "jbass", "isMale": true, "phone": "701-810-3457", "nid": "10311068954" }, { "firstName": "Brody", "lastName": "Reese", "username": "breese", "isMale": true, "phone": "320-610-636", "nid": "82112959596" }, { "firstName": "Stella", "lastName": "Bernard", "username": "sbernard", "isMale": false, "phone": "134-462-1924", "nid": "03272935528" }, { "firstName": "Isaac", "lastName": "Webb", "username": "iwebb", "isMale": true, "phone": "136-000-422", "nid": "10231649814" }, { "firstName": "Jackson", "lastName": "Bryan", "username": "jacksonb", "isMale": true, "phone": "629-900-7729", "nid": "83071189716" }, { "firstName": "Liam", "lastName": "Beard", "username": "lbeard", "isMale": true, "phone": "327-639-010", "nid": "86050552116" }, { "firstName": "Parker", "lastName": "Duffy", "username": "pduffy", "isMale": true, "phone": "484-829-6473", "nid": "56122687578" }, { "firstName": "Lucy", "lastName": "Moody", "username": "lucym", "isMale": false, "phone": "723-670-5321", "nid": "77051444320" }, { "firstName": "Aaliyah", "lastName": "Leonard", "username": "aleonard", "isMale": false, "phone": "005-293-048", "nid": "08281195048" }, { "firstName": "Brody", "lastName": "Norris", "username": "brodyn", "isMale": true, "phone": "789-653-2217", "nid": "58050880078" }, { "firstName": "Juan", "lastName": "Valenzuela", "username": "juanv", "isMale": true, "phone": "060-065-140", "nid": "93052612612" }, { "firstName": "Jocelyn", "lastName": "Collins", "username": "jcollins", "isMale": false, "phone": "010-257-964", "nid": "65083166064" }, { "firstName": "Bentley", "lastName": "Welch", "username": "bentleyw", "isMale": true, "phone": "068-620-269", "nid": "09293076518" } ] }
GET /people?fields=[firstName, lastName]
{ "people": [ { "firstName": "Kennedy", "lastName": "Cote" }, { "firstName": "Jocelyn", "lastName": "Parsons" }, { "firstName": "Mia", "lastName": "Key" }, { "firstName": "Jackson", "lastName": "Whitney" }, { "firstName": "Nevaeh", "lastName": "Torres" }, { "firstName": "Samuel", "lastName": "Best" }, { "firstName": "Ellie", "lastName": "Hooper" }, { "firstName": "Kevin", "lastName": "White" }, { "firstName": "Xavier", "lastName": "Wooten" }, { "firstName": "Naomi", "lastName": "Chan" }, { "firstName": "Owen", "lastName": "Ramsey" }, { "firstName": "Victoria", "lastName": "Hunter" }, { "firstName": "Harper", "lastName": "Boone" }, { "firstName": "Nicholas", "lastName": "Mcknight" }, { "firstName": "Kaylee", "lastName": "Stone" }, { "firstName": "Hudson", "lastName": "Schultz" }, { "firstName": "Thomas", "lastName": "Copeland" }, { "firstName": "Madeline", "lastName": "Odom" }, { "firstName": "Colton", "lastName": "Humphrey" }, { "firstName": "Alexis", "lastName": "Chandler" } ] }
PLAIN 171120 bytes GZIP 30855 bytes
<people> <person> <firstname>Grayson</firstname> <lastname>Wilkins</lastname> <username>graysonw</username> <ismale>true</ismale> <phone>197-391-9087</phone> <nid>39113050916</nid> </person> <person> <firstname>Nathaniel</firstname> <lastname>Page</lastname> <username>npage</username> <ismale>true</ismale> <phone>922-083-8066</phone> <nid>87061196536</nid> </person> <person> <firstname>Annabelle</firstname> <lastname>Parks</lastname> <username>aparks</username> <ismale>false</ismale> <phone>860-706-550</phone> <nid>10221048164</nid> </person> <person> <firstname>Carlos</firstname> <lastname>Robbins</lastname> <username>crobbins</username> <ismale>true</ismale> <phone>633-199-3647</phone> <nid>85022650976</nid> </person> <person> <firstname>Sebastian</firstname> <lastname>Mckenzie</lastname> <username>sebastianm</username> <ismale>true</ismale> <phone>031-821-2542</phone> <nid>08221481578</nid> </person> <person> <firstname>Aiden</firstname> <lastname>Mercado</lastname> <username>aidenm</username> <ismale>true</ismale> <phone>413-006-9553</phone> <nid>01302174138</nid> </person> <person> <firstname>Jacob</firstname> <lastname>Terry</lastname> <username>jacobt</username> <ismale>true</ismale> <phone>674-749-7019</phone> <nid>09312515478</nid> </person> <person> <firstname>Hannah</firstname> <lastname>Hart</lastname> <username>hhart</username> <ismale>false</ismale> <phone>489-395-5946</phone> <nid>62042618284</nid> </person> <person> <firstname>Jaxon</firstname> <lastname>Wagner</lastname> <username>jaxonw</username> <ismale>true</ismale> <phone>500-770-244</phone> <nid>71081634910</nid> </person> <person> <firstname>Chloe</firstname> <lastname>Sanders</lastname> <username>csanders</username> <ismale>false</ismale> <phone>714-971-5327</phone> <nid>12302121384</nid> </person> <person> <firstname>Christopher</firstname> <lastname>Brennan</lastname> <username>christopherb</username> <ismale>true</ismale> <phone>272-938-005</phone> <nid>06253116718</nid> </person> <person> <firstname>Lydia</firstname> <lastname>Montoya</lastname> <username>lmontoya</username> <ismale>false</ismale> <phone>106-629-312</phone> <nid>13221541804</nid> </person> <person> <firstname>Adrian</firstname> <lastname>Carver</lastname> <username>acarver</username> <ismale>true</ismale> <phone>355-762-7781</phone> <nid>97111290392</nid> </person> <person> <firstname>Samuel</firstname> <lastname>Mccullough</lastname> <username>samuelm</username> <ismale>true</ismale> <phone>382-502-589</phone> <nid>66123176094</nid> </person> <person> <firstname>Landon</firstname> <lastname>Grimes</lastname> <username>lgrimes</username> <ismale>true</ismale> <phone>082-649-575</phone> <nid>10272237014</nid> </person> <person> <firstname>Isabella</firstname> <lastname>Merrill</lastname> <username>isabellam</username> <ismale>false</ismale> <phone>795-762-4257</phone> <nid>12292864824</nid> </person> <person> <firstname>Landon</firstname> <lastname>Dale</lastname> <username>ldale</username> <ismale>true</ismale> <phone>959-023-135</phone> <nid>41081330132</nid> </person> <person> <firstname>Madeline</firstname> <lastname>Spence</lastname> <username>mspence</username> <ismale>false</ismale> <phone>116-600-1377</phone> <nid>54070686488</nid> </person> <person> <firstname>Damian</firstname> <lastname>Henderson</lastname> <username>damianh</username> <ismale>true</ismale> <phone>091-797-810</phone> <nid>37091971136</nid> </person> <person> <firstname>Dominic</firstname> <lastname>Hurley</lastname> <username>dominich</username> <ismale>true</ismale> <phone>842-593-567</phone> <nid>12281078514</nid> </person> <person> <firstname>Mackenzie</firstname> <lastname>Cooper</lastname> <username>mcooper</username> <ismale>false</ismale> <phone>335-422-488</phone> <nid>12292859744</nid> </person> <person> <firstname>Carson</firstname> <lastname>Barnes</lastname> <username>cbarnes</username> <ismale>true</ismale> <phone>649-653-776</phone> <nid>13231549814</nid> </person> <person> <firstname>Elizabeth</firstname> <lastname>Sutton</lastname> <username>esutton</username> <ismale>false</ismale> <phone>205-975-232</phone> <nid>86070205666</nid> </person> </people>
PLAIN 121115 bytes (70%) GZIP 29553 bytes (96%)
{ "people": [ { "firstName": "Jason", "lastName": "Page", "username": "jasonp", "isMale": true, "phone": "142-808-3743", "nid": "12252671714" }, { "firstName": "Nathaniel", "lastName": "Chaney", "username": "nchaney", "isMale": true, "phone": "481-659-731", "nid": "55122958778" }, { "firstName": "Alexis", "lastName": "Christensen", "username": "alexisc", "isMale": false, "phone": "802-046-8689", "nid": "13240667404" }, { "firstName": "Sophie", "lastName": "Duke", "username": "sophied", "isMale": false, "phone": "316-701-3331", "nid": "96071009282" }, { "firstName": "Aria", "lastName": "Wolf", "username": "ariaw", "isMale": false, "phone": "682-172-2915", "nid": "12231830224" }, { "firstName": "Sebastian", "lastName": "Hogan", "username": "sebastianh", "isMale": true, "phone": "096-033-8930", "nid": "65082565494" }, { "firstName": "Austin", "lastName": "Rice", "username": "austinr", "isMale": true, "phone": "558-871-007", "nid": "91102544132" }, { "firstName": "Elijah", "lastName": "Savage", "username": "esavage", "isMale": true, "phone": "009-900-8985", "nid": "10301742394" }, { "firstName": "Colton", "lastName": "Morris", "username": "cmorris", "isMale": true, "phone": "029-957-8223", "nid": "84062095076" }, { "firstName": "Juan", "lastName": "Bass", "username": "jbass", "isMale": true, "phone": "701-810-3457", "nid": "10311068954" }, { "firstName": "Brody", "lastName": "Reese", "username": "breese", "isMale": true, "phone": "320-610-636", "nid": "82112959596" }, { "firstName": "Stella", "lastName": "Bernard", "username": "sbernard", "isMale": false, "phone": "134-462-1924", "nid": "03272935528" }, { "firstName": "Isaac", "lastName": "Webb", "username": "iwebb", "isMale": true, "phone": "136-000-422", "nid": "10231649814" }, { "firstName": "Jackson", "lastName": "Bryan", "username": "jacksonb", "isMale": true, "phone": "629-900-7729", "nid": "83071189716" }, { "firstName": "Liam", "lastName": "Beard", "username": "lbeard", "isMale": true, "phone": "327-639-010", "nid": "86050552116" }, { "firstName": "Parker", "lastName": "Duffy", "username": "pduffy", "isMale": true, "phone": "484-829-6473", "nid": "56122687578" }, { "firstName": "Lucy", "lastName": "Moody", "username": "lucym", "isMale": false, "phone": "723-670-5321", "nid": "77051444320" }, { "firstName": "Aaliyah", "lastName": "Leonard", "username": "aleonard", "isMale": false, "phone": "005-293-048", "nid": "08281195048" }, { "firstName": "Brody", "lastName": "Norris", "username": "brodyn", "isMale": true, "phone": "789-653-2217", "nid": "58050880078" }, { "firstName": "Juan", "lastName": "Valenzuela", "username": "juanv", "isMale": true, "phone": "060-065-140", "nid": "93052612612" }, { "firstName": "Jocelyn", "lastName": "Collins", "username": "jcollins", "isMale": false, "phone": "010-257-964", "nid": "65083166064" }, { "firstName": "Bentley", "lastName": "Welch", "username": "bentleyw", "isMale": true, "phone": "068-620-269", "nid": "09293076518" } ] }
// PersonDataDownloader.m #import "PersonDataDownloader_M.h" #import "Person.h" #import "TaskCallsSynchronizer.h" @interface PersonDataDownloader_M () @property(nonatomic, strong) TaskCallsSynchronizer *synchronizer; @end @implementation PersonDataDownloader_M - (void)downloadDataForPerson:(Person *)person { self.synchronizer = [TaskCallsSynchronizer new]; self.synchronizer.completionHandler = ^(NSArray *taskDataObjects, NSArray *taskResponses) { // Merge downloaded data here and perform the rest... }; self.synchronizer.errorHandler = ^(NSArray *errors) { NSLog(@"All calls went bad..."); }; NSURLSessionDataTask *personalInfoTask = [self personalInfoTaskForPerson:person synchronizer:self.synchronizer]; NSURLSessionDataTask *accountNumberTask = [self accountNumberTaskForPerson:person synchronizer:self.synchronizer]; [self.synchronizer addTask:personalInfoTask withName:@"InfoTask"]; [self.synchronizer addTask:accountNumberTask withName:@"AccountTask"]; [personalInfoTask resume]; [accountNumberTask resume]; } #pragma mark - Tasks - (NSURLSessionDataTask *)personalInfoTaskForPerson:(Person *)person synchronizer:(TaskCallsSynchronizer *)synchronizer { NSURLSession *session = [NSURLSession sharedSession]; __typeof(synchronizer) __weak weakSynchronizer = synchronizer; NSURLSessionDataTask *personalInfoTask = [session dataTaskWithURL:[self urlForPersonsPersonalInfo:person] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSString *taskName = @"InfoTask"; if (data && !error) { [weakSynchronizer completeTaskWithName:taskName data:data response:response]; } else { [weakSynchronizer errorDidOccur:error forTaskWithName:taskName]; } }]; return personalInfoTask; } - (NSURLSessionDataTask *)accountNumberTaskForPerson:(Person *)person synchronizer:(TaskCallsSynchronizer *)synchronizer { NSURLSession *session = [NSURLSession sharedSession]; __typeof(synchronizer) __weak weakSynchronizer = synchronizer; NSURLSessionDataTask *accountNumberTask = [session dataTaskWithURL:[self urlForPersonsAccountNumber:person] completionHandler:^(NSData *data, NSURLResponse *response, NSError *error) { NSString *taskName = @"AccountTask"; if (data && !error) { [weakSynchronizer completeTaskWithName:taskName data:data response:response]; } else { [weakSynchronizer errorDidOccur:error forTaskWithName:taskName]; } }]; return accountNumberTask; } #pragma mark - URLs - (NSURL *)urlForPersonsPersonalInfo:(Person *)person { NSString *urlString = [NSString stringWithFormat:@"http://e1.com/persons/%ld", (long)person.id]; return [[NSURL alloc] initWithString:urlString]; } - (NSURL *)urlForPersonsAccountNumber:(Person *)person { NSString *urlString = [NSString stringWithFormat:@"http://e2.com/accounts/%ld", (long)person.id]; return [[NSURL alloc] initWithString:urlString]; } @end // TaskCallSynchronizer.m #import "TaskCallsSynchronizer.h" @interface TaskCallsSynchronizer () @property(nonatomic, readonly) NSMapTable *tasksMap; @property(nonatomic, readonly) NSMutableArray *dataObjects; @property(nonatomic, readonly) NSMutableArray *responses; @property(nonatomic, readonly) NSMutableArray *errors; @property(nonatomic) BOOL errorEncountered; @end @implementation TaskCallsSynchronizer - (id)init { self = [super init]; if (self) { _tasksMap = [NSMapTable strongToWeakObjectsMapTable]; _dataObjects = [NSMutableArray array]; _responses = [NSMutableArray array]; _errors = [NSMutableArray array]; } return self; } - (void)addTask:(NSURLSessionDataTask *)task withName:(NSString *)name { [self.tasksMap setObject:task forKey:name]; } - (void)completeTaskWithName:(NSString *)name data:(NSData *)data response:(NSURLResponse *)response { @synchronized (self) { NSURLSessionDataTask *task = [self.tasksMap objectForKey:name]; BOOL isDownloadStateValid = task.state != NSURLSessionTaskStateCompleted && !self.errorEncountered; if (isDownloadStateValid) { NSLog(@"Ups, something's wrong."); } else { [self.dataObjects addObject:data]; [self.responses addObject:response]; [self.tasksMap removeObjectForKey:name]; if ([self.tasksMap count] == 0 && self.completionHandler) { self.completionHandler(self.dataObjects, self.responses); } } } } - (void)errorDidOccur:(NSError *)error forTaskWithName:(NSString *)name { @synchronized (self) { self.errorEncountered = YES; [self.errors addObject:error]; [self.tasksMap removeObjectForKey:name]; if ([self.tasksMap count] == 0 && self.errorHandler) { self.errorHandler(self.errors); } } } @end
protected void onResume() { super.onResume(); try { download(); } catch (Exception e) { Log.e(TAG, "Error while downloading data", e); } } public void download() throws ExecutionException, InterruptedException { Future<Response<JsonObject>> personFuture = Ion. with(this). load("http://e1.com/persons/123"). asJsonObject().withResponse(); Future<Response<JsonObject>> accountFuture = Ion. with(this). load("http://e2.com/accounts/456"). asJsonObject(). withResponse(); Response<JsonObject> personResponse = personFuture.get(); Response<JsonObject> accountResponse = accountFuture.get(); if (personResponse.getException() != null && accountResponse.getException() != null) { JsonObject person = personResponse.getResult().getAsJsonObject(); JsonObject account = personResponse.getResult().getAsJsonObject(); String firstName = person.getAsJsonPrimitive("firstName").toString(); String lastName = person.getAsJsonPrimitive("lastName").toString(); String accountNo = account.getAsJsonPrimitive("accountNo").toString(); } else { Log.e(TAG, "Error while downloading account", accountResponse.getException()); Log.e(TAG, "Error while downloading person", personResponse.getException()); } }
def parts = [ "http://e1.com/persons/123": ['firstName', 'lastName'], "http://e2.com/accounts/456": ['accountNo'], ] def output = withPool(2) { return parts.collectParallel({ url, fields -> def json = new JsonSlurper().parse(url as URL) return fields.collect ({ field -> ["$field": json[field]] }) }).flatten().sum() }
POST /following
{ "from": 123, "to": 456 }
POST /users/456/follow
Expires: Sat, 26 Jul 1997 05:00:00 GMT
GET /users?page=:page_number
Arthur Bob Celine Daniel Eve Fred GeorgePage size 3
Page 1: Arthur Bob Celine
Delete: Bob
Page 1: Arthur Bobby Daniel
Page 2: Eve Fred George
{ // ... "nextPage": "/users?since=5476238046501" }