44
The Anatomy of Apps How iPhone, Android & Facebook Apps Consume APIs Ed Anuff @edanuff Sam Ramji @sramji Brian Mulloy @landlessness Apigee @apigee

Anatomy of Apps

  • Upload
    kedry

  • View
    36

  • Download
    2

Embed Size (px)

Citation preview

Page 1: Anatomy of Apps

The Anatomy of AppsHow iPhone, Android & Facebook Apps Consume APIs

Ed Anuff@edanuff

Sam Ramji@sramji

Brian Mulloy@landlessness Apigee

@apigee

Page 2: Anatomy of Apps

groups.google.com/group/api-craft

Page 3: Anatomy of Apps

youtube.com/apigee

Page 4: Anatomy of Apps

IRC Channel#api-craft

New!

Page 5: Anatomy of Apps

AppUser

APITeamAPIApp World of

APIsApp

StoreInternalSystems

AppDeveloper

Page 7: Anatomy of Apps

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: Anatomy of Apps

AppUser

APITeamAPIApp World of

APIsApp

StoreInternalSystems

AppDeveloper

Page 9: Anatomy of Apps

Start with a basic HTTP request

Page 10: Anatomy of Apps

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: Anatomy of Apps

Parse the data

Page 12: Anatomy of Apps

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: Anatomy of Apps

Resource Object Mapping

Page 14: Anatomy of Apps

RouteMapUse

Page 15: Anatomy of Apps

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: Anatomy of Apps

// Handled with introspection

Map

Android Spring Mobile

Page 17: Anatomy of Apps

Dog dog = responseEntity.getBody()

Use

Android Spring Mobile

Page 18: Anatomy of Apps

#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: Anatomy of Apps

@implementation Dog+ (NSDictionary*)elementToPropertyMappings { return [NSDictionary dictionaryWithKeysAndObjects: @"name", @"color", nil];}@end

Map

iOS RestKit

Page 20: Anatomy of Apps

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: Anatomy of Apps

resource :dogs

Route

Ruby on Rails ActiveResource

Page 22: Anatomy of Apps

class Dog < ActiveResource::Base self.site = "http://api.apizoo.com/v1"end

Map

Ruby on Rails ActiveResource

Page 23: Anatomy of Apps

dog = Dog.new name: ‘Rover’, color: ‘red’

dog.save

dog.destroy

Use

Ruby on Rails ActiveResource

Page 24: Anatomy of Apps

Cache the response in a database

Page 25: Anatomy of Apps

Roll your own

Usage

Android Jersey + Jackson

Page 26: Anatomy of Apps

#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: Anatomy of Apps

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: Anatomy of Apps

Simple to do list

Page 29: Anatomy of Apps

Problem: we want new capabilities in our app not supported by APIs.

Page 31: Anatomy of Apps

usergrid_ sdk

Android

Use RESTKit

iOS

Probably not applicable

Ruby on Rails

Page 32: Anatomy of Apps

What about offline cases

Page 33: Anatomy of Apps

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: Anatomy of Apps

Get authorization out of the way

Assumption: the APIs we consume use OAuth 2

Page 35: Anatomy of Apps

Roll your own

Android

Page 36: Anatomy of Apps

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: Anatomy of Apps

@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: Anatomy of Apps

AndroidBuilt-in JSON, etc.Spring Mobile (bundles Jersey & Jackson)

iOSJSONKitRestKitCore Data

Ruby on RailsYAJLActiveResourceOauth

Page 39: Anatomy of Apps

Coming Up: March Miniseries on Apps & APIs

Page 40: Anatomy of Apps

Questions?

Page 41: Anatomy of Apps

THANK YOUSubscribe to API webinars at:youtube.com/apigee

Page 42: Anatomy of Apps

THANK YOUChat on IRC#api-craft

Page 43: Anatomy of Apps

THANK YOUQuestions and ideas to:groups.google.com/group/api-craft

Page 44: Anatomy of Apps

THANK YOUContact us at:

@[email protected]

@[email protected]

@[email protected]