opensocial intro

57
1 OpenSocial

Upload: pamela-fox

Post on 06-May-2015

2.567 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: OpenSocial Intro

1

OpenSocial

Page 2: OpenSocial Intro

2

OpenSocial’s goal:Make the web more social

2

Page 3: OpenSocial Intro

3

The social internet

A social website..

•Provides a feature that becomes more engaging as the number of users

grows.

•Uses relationships between people to present users interesting information.

Page 4: OpenSocial Intro

4

The social internet

Some social websites...

Page 5: OpenSocial Intro

5

The social internet

A social website..

•Has overhead to manage users and relationships.

•Grows slowly because users must sign up to use the site.

What if we remove the overhead?

•Developers can focus

on providing

features, not

managing users.

Page 6: OpenSocial Intro

6

The social internet

A social network..

•Manages large numbers of users and relationships.

•Is slow to add new features.

Page 7: OpenSocial Intro

7

The social internet

Many social networks...

Page 8: OpenSocial Intro

8

The social internet

How do we add new features to social networks?

•Make the social network a platform.

•Give creative developers the tools to add the features themselves.

Page 9: OpenSocial Intro

9

The social internet

A social application...

•Lets the social network manage users and relationships.

•Adds new features to the social network.

•Lets users “install” the application without signing up for new accounts.

•Grows quickly because users are already communicating with each other.

Page 10: OpenSocial Intro

10

The social internet

Lots of social apps...

Page 11: OpenSocial Intro

1111

Need for a social APIHow do we put apps in social networks?

Page 12: OpenSocial Intro

12

A day in the life of a social app developer

Page 13: OpenSocial Intro

13

A day in the life of a social app developer

Page 14: OpenSocial Intro

14

Introduction to OpenSocial

Numbers:

•19+ implemented Containers

•40+ committed Containers

•3000+ applications

•400,000,000+ of users

In China:

Page 15: OpenSocial Intro

15

The OpenSocial APIs

Client-side:

•Gadgets XML

•Gadgets JavaScript

•OpenSocial JavaScript

Server-side:

•RESTful protocol

•RPC protocol

Versions:

•0.6 - Client-side APIs introduced

•0.7 - Server-side APIs introduced

•0.81 (current) - Server-side APIs finalized

Page 16: OpenSocial Intro

1616

GadgetsNot widgets, not sprockets, not gidgets, not wadgets

Page 17: OpenSocial Intro

17

Gadgets

A gadget spec:

•Is an XML file.

•Defines metadata about an OpenSocial app.

•Is highly cacheable and does not need a high performance server.

Gadgets use existing web standards

•XML to define metadata.

•HTML for markup.

•JavaScript for interactivity.

•CSS for presentation.

Page 18: OpenSocial Intro

18

Gadgets

A gadget server:

•Takes the gadget spec as input.

•Performs optimizations on the gadget spec.

•Outputs HTML, JavaScript, and CSS as one document.

Page 19: OpenSocial Intro

19

Gadgets

A container:

•Displays the social network’s user interface.

•Opens an IFrame to the rendered gadget.

Containers and gadgetservers are both run by the social network, butdo not need to be onthe same machine, oreven domain.

Page 20: OpenSocial Intro

20

Gadgets

Example gadget XML spec:

•Uses HTML to print “Hello World”.

•Colors the text red with CSS.

•Alerts annoying message with JavaScript.

<?xml version="1.0" encoding="UTF-8" ?><Module> <ModulePrefs title="Hello World!"> <Require feature="dynamic-height" /> </ModulePrefs> <Content type="html"><![CDATA[ <h1>Hello World</h1> <style type="text/css"> h1 { color: #dd0000; } </style> <script type="text/javascript“> alert(“Hello More!”); </script> ]]> </Content></Module>

Live Demo

Page 21: OpenSocial Intro

21

Gadgets

JavaScript utility functions for gadgets:

•gadgets.io.makeRequest()Make cross-domain AJAX calls to remote servers.

•gadgets.json.parse() and gadgets.json.stringify()Native JSON support.

•gadgets.util.escapeString() Make text safe for display via innerHTML.

•gadgets.util.registerOnLoadHandler()Execute code when the page is finished loading.

Page 22: OpenSocial Intro

22

Gadgets

A gadget can require additional JS libraries (“features”).

•minimessage – Display short messages to the user.

•tabs – Create a tabbed user interface

•dynamic-height - Change the size of your gadget in the container.

•views - Navigate between different surfaces of the container.

•skins - Make your gadget change its styles to match the container.

•Containers may offer custom features...

<?xml version="1.0" encoding="UTF-8" ?><Module> <ModulePrefs title="Hello World!"> <Require feature="dynamic-height" /> </ModulePrefs> <Content type="html"> <![CDATA[ ... ]]> </Content></Module>

Live Demo

Page 23: OpenSocial Intro

23

Gadgets

What are views?

•Gadgets can render in different locations on a container.

•Rendering area changes from small to large.

•Certain pages might be public, some are private.

•Containers may have different policies depending on the page,

especially when the gadget displays ads.

•Views provide a way for gadgets to provide different functionality depending

on where it is rendered.

Page 24: OpenSocial Intro

24

Gadgets

iGoogle "home" view:

•On iGoogle, the "home" view is a small,

private page that does not allow ads.

Page 25: OpenSocial Intro

25

Gadgets

25

iGoogle "canvas" view:

•Large private view, allows ads.

Page 26: OpenSocial Intro

26

Gadgets

Working with views in the gadget XML:

•<Content> sections are repeated for each view.

•Add a view="view name" attribute to each section.

•Content sections may support multiple views, for example

view="home,canvas"

<?xml version="1.0" encoding="UTF-8" ?><Module><ModulePrefs title="Hello World!"> <Require feature=“views" /> </ModulePrefs> <Content type="html" view="home"><![CDATA[ ... ]]> </Content> <Content type="html" view="canvas"> <![CDATA[ ... ]]> </Content></Module>

Live Demo

Page 27: OpenSocial Intro

27

Gadgets

<?xml version="1.0" encoding="UTF-8" ?><Module> <ModulePrefs title="Hello Social!"> <Require feature="opensocial-0.8" /> </ModulePrefs> <Content type="html"> <![CDATA[ ... ]]> </Content></Module>

The OpenSocial JavaScript API is a gadget feature, too!

Live Demo

Page 28: OpenSocial Intro

2828

The OpenSocial JavaScript API

Page 29: OpenSocial Intro

29

Making Gadgets Social Gadgets can become social with OpenSocial JavaScript API OpenSocial API has three core services:

People & Friends •Access profile information•Access friends information Activities •See what you’re friends are up to•Share what you are doing Persistence •Provide state without a server •Share data with your friends

Page 30: OpenSocial Intro

30

The OpenSocial JavaScript API

Representing users:

•Client-side, users must work with the VIEWER and the OWNER.

Page 31: OpenSocial Intro

31

The OpenSocial JavaScript API

Multiple personalities:

•When you visit your own profile, you are both the VIEWER and the OWNER.

Page 32: OpenSocial Intro

32

The OpenSocial JavaScript APIOpenSocial requests:

•An OpenSocial DataRequest is created.

•Requests are added to the DataRequest.

•The DataRequest is sent to the server asynchronously.

•When the request finishes, the supplied callback will be called.

function request() { var req = opensocial.newDataRequest(); req.add(req.newFetchPersonRequest("OWNER"), "get_owner"); req.add(req.newFetchPersonRequest("VIEWER"), "get_viewer"); req.add(req.newFetchActivitiesRequest("VIEWER"), "vactivities"); req.add(req.newFetchPersonAppDataRequest("OWNER", "*"), "odata"); ... req.send(response);};

function response(data) { ... };

gadgets.util.registerOnLoadHandler(request);

Page 33: OpenSocial Intro

33

The OpenSocial JavaScript API

OpenSocial responses:

•Responses are bundled according to the keys specified in the request.

•Check for an error at the global response level.•Check for an error at the specific response level.•Use getData() to retrieve the actual information in a request.

function response(data) { if (data.hadError()) { if (data.get("get_owner").hadError()) { ... } if (data.get("get_viewer").hadError()) { ... } ... } var owner = data.get("get_owner").getData(); var viewer = data.get("get_viewer").getData();};

Page 34: OpenSocial Intro

34

The OpenSocial JavaScript API

Working with people:

• opensocial.Person - JavaScript representation of a user.

Page 35: OpenSocial Intro

35

The OpenSocial JavaScript API

Request one person:

req.add(req.newFetchPersonRequest(idspec, opt_params), "key");

• idspec can be either “VIEWER”, “OWNER” or an ID number.• opt_params contains extra request parameters, such as which profile

fields to fetch.

newFetchPersonRequest responses:

var owner = data.get("key").getData();alert(owner.getDisplayName());

• Data contains a single opensocial.Person object.

• Person objects can contain lots of information, such as addresses, companies, phone numbers, favorite movies, and thumbnail urls.

Page 36: OpenSocial Intro

36

The OpenSocial JavaScript API

Methods available on an OpenSocial Person:

• getDisplayName()Gets a text display name for this person; guaranteed to return a useful string.

• getField(key, opt_params)Gets data for this person that is associated with the specified key.

• getId()Gets an ID is permanently associated with this person.

• isOwner()Returns true if this person object represents the owner of the current page.

• isViewer()Returns true if this person object represents the currently logged in user.

Live Demo

Page 37: OpenSocial Intro

37

• ABOUT_ME• ACTIVITIES• ADDRESSES• AGE• BODY_TYPE• BOOKS• CARS• CHILDREN• CURRENT_LOCATION• DATE_OF_BIRTH• DRINKER• EMAILS• ETHNICITY• FASHION• FOOD• GENDER• HAPPIEST_WHEN• HAS_APP• HEROES• HUMOR• ID• INTERESTS

• JOB_INTERESTS• JOBS• LANGUAGES_SPOKEN• LIVING_ARRANGEMENT• LOOKING_FOR• MOVIES• MUSIC• NAME• NETWORK_PRESENCE• NICKNAME• PETS• PHONE_NUMBERS• POLITICAL_VIEWS• PROFILE_SONG• PROFILE_URL• PROFILE_VIDEO• QUOTES• RELATIONSHIP_STATUS• RELIGION• ROMANCE• SCARED_OF• SCHOOLS

The OpenSocial JavaScript API

An OpenSocial Person's fields:• SEXUAL_ORIENTATION• SMOKER• SPORTSSTATUSTAGS• THUMBNAIL_URL• TIME_ZONE• TURN_OFFS• TURN_ONS• TV_SHOWS• URLS

Page 38: OpenSocial Intro

38

The OpenSocial JavaScript API

Working with people:

• A Collection represents many opensocial.Person objects.

Page 39: OpenSocial Intro

39

The OpenSocial JavaScript API

Request many people:

var idspec = opensocial.newIdSpec({ “userId” : “OWNER”, “groupId” : “FRIENDS”});req.add(req.newFetchPeopleRequest(idspec, opt_params), "key");

• idspec is an object that can represent groups of people. “userId” can be “VIEWER” or “OWNER” or an ID, and “groupId” can be “SELF”, “FRIENDS”, or the name of a group.

• opt_params contains extra request parameters, such as which profile fields to fetch, and how to order or filter the returned people.

Process the response:var owner_friends = data.get("key").getData();owner_friends.each(function (person) { alert(person.getDisplayName());});

• Data contains a Collection of opensocial.Person objects.

Live Demo

Page 40: OpenSocial Intro

40

The OpenSocial JavaScript API

Working with data:• Persistent data gives apps key, value storage directly on the container. • String only, but conversion to JSON allows for storage of complex

objects.• Storage per app per user - scales well with growth.• Ideal for settings, customizations.

Page 41: OpenSocial Intro

41

The OpenSocial JavaScript API

Set persistent data:

req.add(req.newUpdatePersonAppDataRequest(idspec, key, value));

• idspec can only be “VIEWER”.• key is the name under which this data will be stored.• value is a string representing the data to store.

Page 42: OpenSocial Intro

42

The OpenSocial JavaScript API

Fetch persistent data:var idspec = opensocial.newIdSpec({ "userId" : "OWNER", "groupId" : "SELF"});req.add(req.newFetchPersonAppDataRequest(idspec, keys), "key");req.add(req.newFetchPersonRequest("OWNER"), "ownerkey");

• idspec is an object that can represent groups of people, the same as newFetchPeopleRequest.

• keys is a list of persistent data keys to retrieve the data for.• The owner is requested because the data returned is indexed by user ID

and we want the owner’s data.

newFetchPersonAppDataRequest responses:

var app_data = data.get("key").getData();var value = app_data[owner.getId()][key];

Page 43: OpenSocial Intro

43

The OpenSocial JavaScript API

Fetch persistent data:

{ "1234567890" : { "key1" : "value1" }, "2345678901" : { "key1" : "value2" }}

• Data is returned as an object indexed by ID number, then as an object indexed by key name, even if there is only data returned for one user!{ "1234567890" : { "key1" : "value1" } }

• Multiple people:

{ "1234567890" : { "key1" : "value1", "key2" : "value2" }}

• One person, multiple keys:

Live Demo

Page 44: OpenSocial Intro

44

The OpenSocial JavaScript API

Working with activities:• API to post information about what users are doing with your app.• Many containers have support for images and some HTML.• Channel to grow your application.

orkut MySpace hi5

Page 45: OpenSocial Intro

45

The OpenSocial JavaScript API

Post an activity:

function postActivity(text) {    var params = {};    params[opensocial.Activity.Field.TITLE] = text;   var activity = opensocial.newActivity(params);    opensocial.requestCreateActivity(activity,      opensocial.CreateActivityPriority.HIGH, callback);};

• Assign the activity text to the TITLE field.• Call opensocial.newActivity() to create a new Activity instance.• Call opensocial.requestCreateActivity() to post the activity to the

container.

Live Demo

Page 46: OpenSocial Intro

4646

RESTful and RPC protocolsServers talking to servers

Page 47: OpenSocial Intro

47

RESTful and RPC protocolsOpens new development models

•Background processing.

•Easier Flash integration.

•Mobile applications.

Page 48: OpenSocial Intro

48

RESTful and RPC protocols

Communication methods:

•RESTful (Representational State Transfer)

•RPC (Remote Procedure Call)

Formats:

•XML

•JSON

•AtomPub

Page 49: OpenSocial Intro

49

RESTful and RPC protocols

REST:

•Resources are URLs.

/people/{guid}/@all

• All people connected to the given user:Example - People:

/people/{guid}/@friends

• All friends of the given user:

/people/{guid}/@self

• Profile of the given user:

/people/@me/@self

• Profile of the authenticated user:

/people/@supportedFields

• Supported Person fields:

Page 50: OpenSocial Intro

50

RESTful and RPC protocols

• Response format (JSON, XML, AtomPub)

• Request extra fields

• Filtering:

• Paging:

fields={-join|,|field}.

filterBy={fieldname} filterOp={operation}filterValue={value}updatedSince={xsdDateTime}networkDistance={networkDistance}

count={count} sortBy={fieldname} sortOrder={order} startIndex={startIndex}

format={format}

Querystring parameters customize requests:

Page 51: OpenSocial Intro

51

<person xmlns="http://ns.opensocial.org/2008/opensocial"> <id></id><displayName></displayName><name><unstructured>Jane Doe</unstructured></name> <gender>female</gender></person>

RESTful and RPC protocols

REST responses (Person):

{"id" : "example.org:34KJDCSKJN2HHF0DW20394", "displayName" : "Janey", "name" : {"unstructured" : "Jane Doe"}, "gender" : "female"}

JSON:

XML:

Page 52: OpenSocial Intro

52

RESTful and RPC protocols

REST responses (Person):

AtomPub:

<entry xmlns="http://www.w3.org/2005/Atom"> <content type="application/xml"> <person xmlns="http://ns.opensocial.org/2008/opensocial"> <name><unstructured>Jane Doe</unstructured></name><gender>female</gender></person></content><title/><updated>2003-12-13T18:30:02Z</updated><author/><id>urn:guid:example.org:34KJDCSKJN2HHF0DW20394</id></entry>

Page 53: OpenSocial Intro

53

RESTful and RPC protocols

REST:

•Perform operations using different HTTP methods on each URL.

CRUD:

•Create

•Retrieve

•Update

•Delete

HTTP:

•POST

•GET

•PUT

•DELETE

Page 54: OpenSocial Intro

54

RESTful and RPC protocols

REST has some disadvantages:

•Batch support requires multiple HTTP requests, or a contrived URL

scheme.

•Specifying multiple users via querystring is difficult. Is

?uid=1234,5678 the same resource as ?uid=5678,1234 ?

Page 55: OpenSocial Intro

55

RESTful and RPC protocols

RPC:

•One endpoint - parameters specify methods to call.

•Batch support.

•Specify collections of users through passed arguments, not URLs.

POST /rpc HTTP/1.1Host: api.example.orgAuthorization: <Auth token>Content-Type: application/json{ "method" : "people.get", "id" : "myself" "params" : { "userid" : "@me", "groupid" : "@self" }}

Example - Fetch current user:

• Request

HTTP/1.x 207 Multi-StatusContent-Type: application/json{ "id" : "myself" "result" : { "id" : "example.org:34KJDCSKJN2HHF0DW20394", "name" : { "unstructured" : "Jane Doe"}, "gender" : "female" }}

• Response

Page 56: OpenSocial Intro

56

RESTful and RPC protocols

Authentication:Both protocols use OAuth to identify users and apps.

Depending on what the application needs to do, it can use two-legged

or three-legged OAuth.

Two-legged OAuth:

•The application authenticates directly with the container.

•Perform non-user specific operations:• Update persistent data for app users.• Can request information for users who have shared their profile

information with the app.

Three-legged OAuth:

•The user tells the container to give profile access to the application.

•Perform user specific operations:• Post activities.• Fetch friends of the current user.

Page 57: OpenSocial Intro

57

RESTful and RPC protocols

Client libraries are being created for PHP, Java, Python, Ruby.

•Help you connect to OpenSocial containers, and work with social

data on your server.

Sample: Login, get thumbnail and friends.

OpenSocialClient c = new OpenSocialClient("myspace.com");

c.setProperty(OpenSocialClient.Properties.REST_BASE_URI, "http://api.myspace.com/v2/");c.setProperty(OpenSocialClient.Properties.CONSUMER_SECRET, <MYSPACE_SECRET>);c.setProperty(OpenSocialClient.Properties.CONSUMER_KEY, <MYSPACE_APP_KEY>);c.setProperty(OpenSocialClient.Properties.VIEWER_ID, <YOUR_MYSPACE_ID>);

OpenSocialPerson p = c.fetchPerson(<YOUR_MYSPACE_ID>);OpenSocialField f = p.getField("thumbnailUrl");System.out.println(f.getStringValue());

Collection<OpenSocialPerson> friends = c.fetchFriends(<YOUR_MYSPACE_ID>);for (OpenSocialPerson friend : friends) {

System.out.println(friend.getDisplayName());}