What Is An Embedded Experience?
Embedded experiences allows application developers to embed content from their applications inside OpenSocial 2.0 containers. An embedded experience can be built as an OpenSocial gadget, or it can be a simple web page, but because both are based on standard web technologies like HTML, CSS, and Javascript, any web developer should be able to create an embedded experience. Embedded experiences are backed by a simple data model. Containers and gadgets which support embedded experiences will recognize this data model and can choose to render the embedded experience.
What Type Of Embedded Experience Should I Choose?
As mentioned above, there are two types of embedded experiences, OpenSocial gadgets and web pages. Embedded experiences which point to web pages are the simplest to create, especially if the web page you want to use already exists. Embedded experiences which point to web pages can also be embedded in any container, even if they don't support OpenSocial. You may choose a URL embedded experience if you just want to show static content, which is publicly available on the internet. Good examples of this would be an embedded experience which tracks a package, or an embedded experience which asks a user to fill out a survey. These types of applications are usually public content which does not require authentication to access. However you will also be limited on the type experience you can provide with a web page. You will not be able take advantage of any of the OpenSocial APIs when you are using an URL embedded experience.
Embedded experiences based on gadgets have the ability to be more powerful and take advantage of all the OpenSocial APIs. Probably the number one reason you would choose a gadget over a web page is because the user needs to authenticate to view or take action on the content in the embedded experience. OAuth is part of the OpenSocial specification and it can allow your embedded experience gadget to access secure content once the user has delegated access to the gadget. Embedded experience gadgets can also use any of the OpenSocial APIs. Your gadget can access to the users friends, send messages to other users, or contribute actions to the surrounding container.
What Is This "Data Model"?
The embedded experiences data model is way to represent an embedded experience in JSON or XML. It tells the container everything is needs to know so it can render the embedded experience. The data model has only a couple of properties.
...
All embedded experiences must include EITHER a gadget OR URL in order to be valid embedded experience. The data model MAY choose to include both if the application wants to provide both types of embedded experiences. Services may include any combination of the other properties based on their use cases. Here are some example data models.
URL Embedded Experience
...
XML
...
Code Block | ||||
---|---|---|---|---|
| ||||
<embed> <url>http://example.com/ee.html</url> </embed> |
...
JSON
...
Code Block | ||||
---|---|---|---|---|
| ||||
{ "url": "http://example.com/ee.html" } |
Gadget Embedded Experience
...
XML
...
Code Block | ||||
---|---|---|---|---|
| ||||
<embed> <gadget>http://example.com/EE_Gadget.xml</gadget> </embed> |
...
JSON
...
Code Block | ||||
---|---|---|---|---|
| ||||
{ "gadget": "http://example.com/EE_Gadget.xml" } |
Gadget And URL Embedded Experience
...
XML
...
Code Block | ||||
---|---|---|---|---|
| ||||
<embed> <url>http://example.com/ee.html</url> <gadget>http://example.com/EE_Gadget.xml</gadget> </embed> |
...
JSON
...
Code Block | ||||
---|---|---|---|---|
| ||||
{ "url": "http://example.com/ee.html", "gadget": "http://example.com/EE_Gadget.xml" } |
Gadget Embedded Experience With Context
...
XML
...
Code Block | ||||
---|---|---|---|---|
| ||||
<embed> <gadget>http://example.com/EE_Gadget.xml</gadget> <context> <title>Foo</title> <id>1234</id> </context> </embed> |
...
JSON
...
Code Block | ||||
---|---|---|---|---|
| ||||
{ "gadget": "http://example.com/EE_Gadget.xml", "context": { "title": "Foo", "id": "1234" } } |
Gadget And URL Embedded Experience With Context And Preview Image
...
XML
...
Code Block | ||||
---|---|---|---|---|
| ||||
<embed> <url>http://example.com/ee.html</url> <gadget>http://example.com/EE_Gadget.xml</gadget> <context> <title>Foo</title> <id>1234</id> </context> <previewImage>http://example.com/EE_Preview.png</previewImage> </embed> |
...
JSON
...
Code Block | ||||
---|---|---|---|---|
| ||||
{ "url": "http://example.com/ee.html", "gadget": "http://example.com/EE_Gadget.xml", "context": { "title": "Foo", "id": "1234" } "previewImage": "http://example.com/EE_Preview.png" } |
How Do I Get Started Developing My Own Embedded Experience?
Now that you know what an embedded experience is, and we know what makes up an embedded experience, we are ready to get started building one. In this tutorial we will build a gadget based embedded experience since that is the more complex and interesting type of embedded experience. If your interested in building a URL embedded experience its a simple as building a web page and placing the URL to that page in the data model you want to use. See below on how to embed the data model in emails or activity streams.
...
We could just place this HTML in the gadget use that gadget as out embedded experience. Lets take a look at what an embedded experience gadget and data model would look like using this HTML.
...
Data Model
...
Code Block | ||||
---|---|---|---|---|
| ||||
{ "gadget": "http://example.com/YouTube_EE.xml" } |
...
Gadget XML
...
Code Block | ||||
---|---|---|---|---|
| ||||
<?xml version="1.0" encoding="UTF-8"?> <Module> <ModulePrefs title="YouTube Player" description="YouTube Player Using Embedded Experiences" height="400" width="700"/> <Content type="html"> <![CDATA[ <object width=480" height="285"> <param name="movie" value="http://www.youtube.com/v/9gW2YVBrNVA"></param> <param name="allowFullScreen" value="true"></param> <param name="allowscriptaccess" value="always"></param> <embed src="http://www.youtube.com/v/9gW2YVBrNVA" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="285"> </embed> </object> ]]> </Content> </Module> |
The problem with this embedded experience is that it is very static. What if we wanted to create an embedded experience for a different YouTube video? With our current embedded experience we would have to build a new gadget. Fortunately there is a way to solve this problem.
Using The Embedded Experiences Context
The context property in the embedded experiences data model can be used to make a more abstract embedded experiences gadget. If we wanted to show a different video using the gadget above the only thing we would need to change is the video id in the URLs in the param and embed tags. Based on that, the only data that needs to be abstracted from the gadget above is the YouTube video id. To do this we can change our data model so the context property includes the video id, that way its not hard coded into the gadget. Here is what our new data model will look like.
...
The above embedded experience gadget can now be used to provide an embedded experience for any YouTube video. All we have to do as the application is change the context information in our data model. This is much simpler than having to have a separate gadget for every YouTube video.
Embedding Our Gadget In An Email
Now that we know what our data model is going to look like and we have written our gadget we are ready to start providing embedded experiences. One of the most interesting use cases is to provide a richer experience in emails. The majority of services today send static HTML emails based on a standard called MIME. This is a step above plain text emails but, the HTML has its own limitations as well. Embedded experiences has taken advantage of the MIME email spec to allow applications to send embedded experiences in MIME emails as well. If an application already is sending MIME emails, the changes will be minimal and it will not effect users who are using mail clients which don't support embedded experiences.
...
In our new email you can see we have added another part with the content type of application/embed+json. This is a MIME type the OpenSocial foundation has registered with IANA to represent embedded experiences. In addition to the JSON MIME type the OpenSocial foundation has also registered applicaiton/embed+xml for the XML data model. The content of the MIME part is just our embedded experiences data model. When email clients which support embedded experiences receive this email, they will be looking for a MIME part with the type application/embed+json or application/embed+xml, and if they find it they can choose to render the embedded experience. If a client which does not support embedded experiences receives this email they will choose to render whatever other part they support, most likely the text/html part.
Embedding Our Gadget In An Activity In An Activity Stream
OpenSocial 2.0 supports the ActivityStreams 1.0 specification. OpenSocial also has defined a namespace extension to the ActivityStreams spec which contains OpenSocial specific concepts. The embedded experiences data model can be placed inside the OpenSocial extension. Say we have this activity entry.
...
We can now post this activity to any activity stream and if the container rendering the activity stream supports embedded experiences it can choose to display the embedded experience in the activity stream as well.
Resources
- Embedded Experiences - http://opensocial-resources.googlecode.com/svn/spec/2.0/Core-Gadget.xml#Embedded-Experiences
- OAuth In OpenSocial - http://opensocial-resources.googlecode.com/svn/spec/2.0/Core-Gadget.xml#OAuth
- Data Context - http://opensocial-resources.googlecode.com/svn/spec/2.0/Core-Gadget.xml#DataContext_Client
- OAuth Spec - http://oauth.net/
- Activity Streams Spec - http://activitystrea.ms/
- MIME RFC - http://www.rfc-editor.org/rfc/rfc2046.txt