Mobile API Design Techniques

Preview:

DESCRIPTION

 

Citation preview

Mobile APIDesign & Techniques.

Fred BrunelCTO

Wednesday, 29 February, 12

Wednesday, 29 February, 12

Wednesday, 29 February, 12

Wednesday, 29 February, 12

Why?

Wednesday, 29 February, 12

Though for CPU powerThough for bandwidthLazy designed.Too close to database.

Wednesday, 29 February, 12

A mobile device isLow poweredLow bandwidthRuns on battery!

Wednesday, 29 February, 12

A the network is the weak link.

Wednesday, 29 February, 12

Network conditions change in real-time.

Wednesday, 29 February, 12

We want to keep the best user experience at all time.Nobody wants an unresponsive app.

Wednesday, 29 February, 12

The features of an API has a huge impact on performances.

Wednesday, 29 February, 12

An API is a contract that dictates what can or cannot be done (directly).

Wednesday, 29 February, 12

When the API is too lazy, or incomplete; the burden is put on the mobile app.

Wednesday, 29 February, 12

Any workaround put a stress on the mobile app to use too much network.

Wednesday, 29 February, 12

API = User Interface.

Should be simple and get the job done. Fast.

Wednesday, 29 February, 12

Landlord Report.

Wednesday, 29 February, 12

Simple

Standard CompleteWednesday, 29 February, 12

Simple

Standard CompleteSOAP

XML-RPC

WS-*

Pure RESTWednesday, 29 February, 12

Simple

CompleteWednesday, 29 February, 12

Trust the OSI model.Works everywhere.And it’s plenty enough.

http://en.wikipedia.org/wiki/OSI_model

Wednesday, 29 February, 12

REST-ish API + JSON

Pure REST is a nice to have but not a goal.

Wednesday, 29 February, 12

GET/POST + Action + Params is fine.

PUT/DELETE are nice to have.

Wednesday, 29 February, 12

Twitter is also REST-ish

POST statuses/createPOST statuses/destroy/:idPOST statuses/update

Wednesday, 29 February, 12

REST put an emphasis on actions applied to resources; but the issue is the representation.

Wednesday, 29 February, 12

Simplify the life of the implementor.Be pragmatic.

Wednesday, 29 February, 12

When designing your API payloads, pay attention to consistency and completeness.

Wednesday, 29 February, 12

Consistency means developer know what to expect.Principle of least astonishment.

Wednesday, 29 February, 12

Completeness means less roundtrips.

Wednesday, 29 February, 12

HTTP latency on 3G

~ 1 second.

Every request count.

Wednesday, 29 February, 12

API is NOT a CRUD interface to your SQL database.

It’s a facade.

Wednesday, 29 February, 12

DatabaseFacadeAPIApp

DataRepresentation Raw DataDisplay

Wednesday, 29 February, 12

The facade answer to high-level questions.

Think services, not objects and methods.

Wednesday, 29 February, 12

So, how do we start from here?

Wednesday, 29 February, 12

Most of the time, a mobile API will be use to get information to be displayed on a screen.

Wednesday, 29 February, 12

Reverse Design.

Start from the UINot the data

Wednesday, 29 February, 12

1. Think screens2.Entities to display3.Design entity models4.Design services

Wednesday, 29 February, 12

Wednesday, 29 February, 12

IDTitleTownCountryRatingThumbnail URLGeocodeWebsiteEmailDescription

Wednesday, 29 February, 12

Then, format the representation to be as efficient as possible.

Wednesday, 29 February, 12

Each JSON entity should have the same consistent representation.

Wednesday, 29 February, 12

"person": { "id": 1234, "name": "Fred", "lastname": "Brunel", "company": "WhereCloud"}

Wednesday, 29 February, 12

"book": { "name": "Steve Jobs", "author": "Walter Isaacson", "lenders" = [{ "person_id": 1234, "person_name": "Fred", "person_lastname": "Brunel" }]}

BADWednesday, 29 February, 12

"book": { "name": "Steve Jobs", "author": "Walter Isaacson", "lenders" = [{ "id": 1234, "name": "Fred", "lastname": "Brunel" }]}

GOODWednesday, 29 February, 12

..."user_mentions": [{ "id": 22548447, "id_str": "22548447", "screen_name": "rno", "name": "Arnaud Meunier", "indices": [0, 4]]}...

Wednesday, 29 February, 12

Pick the right granularity.

Denormalize!

Wednesday, 29 February, 12

"result": { ... "categories" = [{ "id": 2 }], "images": [{ "id": 317171 }], "tags": [{ "id": 555 }] ...}

Wednesday, 29 February, 12

"result": { ... "categories": [{ "id": 2 "name" = "food" }], "images" = [{ "id": 317171 "url": "http://image.com/a.png" }], ...}

Wednesday, 29 February, 12

Denormalize the most common fields.Avoid unnecessary roundtrips.

Wednesday, 29 February, 12

Don’t make the app connects to 10 3rd-party systems.Aggregate on the backend.

Wednesday, 29 February, 12

The backend has the power, bandwidth and knowledge.Use it!

Wednesday, 29 February, 12

Make it fast!

Some good techniques to be aware of.

Wednesday, 29 February, 12

JSON is fast to parse, but still, compress everything.

Wednesday, 29 February, 12

Use Cache-Control on every response that can be cached.

Wednesday, 29 February, 12

Partial Responses & Partial Updates

Let the client decides what to get/update.

Wednesday, 29 February, 12

GEThttp://www.google.com/calendar/feeds/zachpm@google.com/private/full?fields=entry(title,gd:when)

Wednesday, 29 February, 12

PATCH /myfeed/1/1/Content-Type: application/xml

<entry xmlns='http://www.w3.org/2005/Atom' xmlns:gd='http://schemas.google...' gd:fields='description'> <title>New title</title></entry>

Wednesday, 29 February, 12

Batch Requests

Send multiple operations, get one answer.

Wednesday, 29 February, 12

Persistent Connections.

Keep a connection nailed up.

Wednesday, 29 February, 12

“If you’re serious about network, you should make your own protocol.”—Fake Alan Kay.

Wednesday, 29 February, 12

The fabric of the Internet is TCP/IP, not HTTP.

Wednesday, 29 February, 12

Make your own Binary Protocol.

Lot faster than text + compression. Sorry!

Wednesday, 29 February, 12

Message-based API

Custom TLVMessagePackProtocolBuffers

Wednesday, 29 February, 12

TAG LENGTH VALUE

32 bits16 bits n bits

TLV TLV TLV TLV TLV

TLV TLV TLV TLV TLV

messages streaming

a message

Wednesday, 29 February, 12

message Person { required string name = 1; required int32 id = 2; optional string email = 3;

enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; }

message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; }

repeated PhoneNumber phone = 4;}

Wednesday, 29 February, 12

Person person;person.set_name("John Doe");person.set_id(1234);person.set_email("jdoe@example.com");fstream output("myfile", ios::out | ios::binary);person.SerializeToOstream(&output);

fstream input("myfile", ios::in | ios::binary);Person person;person.ParseFromIstream(&input);cout << "Name: " << person.name() << endl;cout << "E-mail: " << person.email() << endl;

Wednesday, 29 February, 12

So.

They are tons of efficient solutions and techniques.

Wednesday, 29 February, 12

Remember.Be pragmatic.Be consistentBe complete.Be fast.

Wednesday, 29 February, 12

Thank you.

twitter.com/!runelfred@wherecloud.com

Wednesday, 29 February, 12

Recommended