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

The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

  • Upload
    apigee

  • View
    6.466

  • Download
    2

Embed Size (px)

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 platforms

Citation preview

Page 1: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

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

groups.google.com/group/api-craft

Page 3: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

youtube.com/apigee

Page 4: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

IRC Channel#api-craft

New!

Page 5: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

AppUser

APITeam

APIAppWorld of

APIsApp

StoreInternalSystems

AppDeveloper

Page 7: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

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

AppUser

APITeam

APIAppWorld of

APIsApp

StoreInternalSystems

AppDeveloper

Page 9: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

Start with a basic HTTP request

Page 10: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

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

Parse the data

Page 12: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

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

Resource Object Mapping

Page 14: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

RouteMapUse

Page 15: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

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

// Handled with introspection

Map

Android Spring Mobile

Page 17: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

Dog dog = responseEntity.getBody()

Use

Android Spring Mobile

Page 18: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

#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

@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

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

resource :dogs

Route

Ruby on Rails ActiveResource

Page 22: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

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

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

Cache the response in a database

Page 25: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

Roll your own

Usage

Android Jersey + Jackson

Page 26: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

#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

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

Simple to do list

Page 29: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

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

Page 31: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

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

What about offline cases

Page 33: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

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

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

Roll your own

Android

Page 36: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

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

@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

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

Coming Up: March Miniseries on Apps & APIs

Page 40: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

Questions?

Page 41: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

THANK YOUSubscribe to API webinars at:

youtube.com/apigee

Page 42: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

THANK YOUChat on IRC#api-craft

Page 43: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

THANK YOUQuestions and ideas to:

groups.google.com/group/api-craft

Page 44: The Anatomy of Apps - How iPhone, Android & Facebook Apps Consume APIs

THANK YOUContact us at:

@[email protected]

@[email protected]

@[email protected]