the anatomy of apps - how iphone, android & facebook apps consume apis
DESCRIPTION
Building mobile apps is different from building web apps. Developers need to understand the unique demands that mobile apps place on APIs and considerations across different client and back-end platforms. Mobile apps also introduce new issues for security and scalability. WARNING: These slides contain lots of code. We Will Discuss » Why building mobile apps is different A roundup of different client libraries and frameworks Considerations for selecting mobile back-end platformsTRANSCRIPT
![Page 1: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/1.jpg)
The Anatomy of AppsHow iPhone, Android & Facebook Apps Consume APIs
Ed Anuff@edanuff
Sam Ramji@sramji
Brian Mulloy@landlessness Apigee
@apigee
![Page 2: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/2.jpg)
groups.google.com/group/api-craft
![Page 3: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/3.jpg)
youtube.com/apigee
![Page 4: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/4.jpg)
IRC Channel#api-craft
New!
![Page 5: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/5.jpg)
AppUser
APITeam
APIAppWorld of
APIsApp
StoreInternalSystems
AppDeveloper
![Page 6: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/6.jpg)
/dogs
/owners
RESTful API Design - Second Editionhttp://www.youtube.com/watch?v=QpAhXa12xvU
Dogs API
OAuth 2.0
Authorization
![Page 7: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/7.jpg)
Build an iPhone App, an Android App and a Facebook Web App*
*Ruby on Rails app hosted on Herokuhttp://devcenter.heroku.com/articles/facebook
![Page 8: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/8.jpg)
AppUser
APITeam
APIAppWorld of
APIsApp
StoreInternalSystems
AppDeveloper
![Page 9: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/9.jpg)
Start with a basic HTTP request
![Page 10: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/10.jpg)
HttpClient client = new DefaultHttpClient();HttpGet httpGet = new HttpGet("http://api.apizoo.com/v1/dogs");
HttpResponse response = client.execute(httpGet);
Android
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:@"http://api.apizoo.com/v1/dogs"]];
NSData *response = [NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
iOS
require 'net/http'response = Net::HTTP.get(‘api.apizoo.com/v1’, ‘/dogs’)
Ruby on Rails
![Page 11: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/11.jpg)
Parse the data
![Page 12: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/12.jpg)
JSONObject dogs = new JSONObject(response);
Android
import "JSONKit.h"NSDictionary *dogs = [response objectFromData];
iOS
require 'yajl'parser = Yajl::Parser.newdogs = parser.parse(response) # returns a hash
Ruby on Rails
![Page 13: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/13.jpg)
Resource Object Mapping
![Page 14: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/14.jpg)
RouteMapUse
![Page 15: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/15.jpg)
requestEntity = new HttpEntity<Object>(requestHeaders);ResponseEntity<Dog> responseEntity = restTemplate.exchange("http://api.apizoo.com/v1/dogs/15", HttpMethod.GET, requestEntity, Dog.class);
Route
Android Spring Mobile
![Page 16: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/16.jpg)
// Handled with introspection
Map
Android Spring Mobile
![Page 17: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/17.jpg)
Dog dog = responseEntity.getBody()
Use
Android Spring Mobile
![Page 18: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/18.jpg)
#import <RestKit/RestKit.h>RKObjectManager* manager = [RKObjectManager objectManagerWithBaseURL:@"http://api.apizoo.com/v1"];
RKDynamicRouter* router = [[RKDynamicRouter new] autorelease];
manager.router = router;
[router routeClass:[Dog class] toResourcePath:@"/dogs" forMethod:RKRequestMethodPOST];
[router routeClass:[Dog class] toResourcePath:@"/dogs/(dogID)"];
Route
iOS RestKit
![Page 19: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/19.jpg)
@implementation Dog+ (NSDictionary*)elementToPropertyMappings { return [NSDictionary dictionaryWithKeysAndObjects: @"name", @"color", nil];}@end
Map
iOS RestKit
![Page 20: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/20.jpg)
Dog* dog = [Dog object]; dog.name = @"Rover";Dog.color = @"red"; [[RKObjectManager sharedManager] postObject:dog delegate:self];
[[RKObjectManager sharedManager] deleteObject:dog delegate:self];
Use
iOS RestKit
![Page 21: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/21.jpg)
resource :dogs
Route
Ruby on Rails ActiveResource
![Page 22: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/22.jpg)
class Dog < ActiveResource::Base self.site = "http://api.apizoo.com/v1"end
Map
Ruby on Rails ActiveResource
![Page 23: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/23.jpg)
dog = Dog.new name: ‘Rover’, color: ‘red’
dog.save
dog.destroy
Use
Ruby on Rails ActiveResource
![Page 24: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/24.jpg)
Cache the response in a database
![Page 25: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/25.jpg)
Roll your own
Usage
Android Jersey + Jackson
![Page 26: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/26.jpg)
#import <RestKit/CoreData/CoreData.h>RKObjectManager* manager = [RKObjectManager objectManagerWithBaseURL:@"http://api.apizoo.com/v1"];
manager.objectStore = [RKManagedObjectStore objectStoreWithStoreFilename:@"DogApp.sqlite"];
@implementation Dog + (NSString*)primaryKeyProperty { return @"dogID"; } @end
Usage
iOS RestKit + Core Data
![Page 27: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/27.jpg)
class DogResource < ActiveResource::Base self.site = http://api.apizoo.com/v1end
class Dog < ActiveRecord::Base # the before methods call DogResource methods before_create :create_resource before_update :update_resource before_destroy :destroy_resourceend
Usage
Ruby on Rails ActiveResource + ActiveRecord
![Page 28: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/28.jpg)
Simple to do list
![Page 29: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/29.jpg)
Problem: we want new capabilities in our app not supported by APIs.
![Page 30: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/30.jpg)
Usergrid - Data & Querieshttp://www.youtube.com/watch?v=zLl56sU5Bt0
![Page 31: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/31.jpg)
usergrid_ sdk
Android
Use RESTKit
iOS
Probably not applicable
Ruby on Rails
![Page 32: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/32.jpg)
What about offline cases
![Page 33: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/33.jpg)
Roll your own
Android
-(BOOL)reachable {Reachability *r = [Reachability reachabilityWithHostName:@"api.apizoo.com/v1"];
NetworkStatus internetStatus = [r currentReachabilityStatus];
if(internetStatus == NotReachable) { return NO;}return YES;}
iOS
Probably not applicable
Ruby on Rails
![Page 34: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/34.jpg)
Get authorization out of the way
Assumption: the APIs we consume use OAuth 2
![Page 35: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/35.jpg)
Roll your own
Android
![Page 36: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/36.jpg)
RKObjectManager* objectManager = [RKObjectManager sharedManager];
objectManager.client.baseURL = @”api.apizoo.com/v1";objectManager.client.OAuth2AccessToken = @"YOUR ACCESS TOKEN";
objectManager.client.authenticationType = RKRequestAuthenticationTypeOAuth2;
iOS RestKit
![Page 37: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/37.jpg)
@consumer=OAuth::Consumer.new("key","secret", site: "api.apizoo.com/v1")
@[email protected]_request_tokensession[:request_token]=@request_tokenredirect_to @request_token.authorize_url@access_token=@request_token.get_access_token
Ruby on Rails Oauth Gem
![Page 38: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/38.jpg)
AndroidBuilt-in JSON, etc.Spring Mobile (bundles Jersey & Jackson)
iOSJSONKitRestKitCore Data
Ruby on RailsYAJLActiveResourceOauth
![Page 39: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/39.jpg)
Coming Up: March Miniseries on Apps & APIs
![Page 40: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/40.jpg)
Questions?
![Page 41: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/41.jpg)
THANK YOUSubscribe to API webinars at:
youtube.com/apigee
![Page 42: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/42.jpg)
THANK YOUChat on IRC#api-craft
![Page 43: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs](https://reader036.vdocument.in/reader036/viewer/2022062513/554f5e1eb4c9058a148b45d1/html5/thumbnails/43.jpg)
THANK YOUQuestions and ideas to:
groups.google.com/group/api-craft