アップロードが成功したら、そのリクエストに対するレスポンスコードは、リソースのアクション要求のレスポンスコードとして関連づけられるでしょう。しかしながら、ファイルサイズの制限違反のために失敗した場合、413(“Request Entity Too Large”)のエラーコードが返されるべきです。そのファイルアップロードに関連づけられてリクエストされたアクションはまた、実行されないでしょう。
OpenSocial v0.9にて追加となった「Clarify timing of callback execution in JS API」仕様について紹介します。コールバック関数の呼び出しに関する規定についてですが、このようなちょっとしたことでも、OpenSocialアプリケーション開発者にとっては非常に重要です。
—
[Clarify timing of callback execution in JS API]
今までのOpenSocial APIでは、コールバック関数が呼び出されるタイミングについて、実装がはっきりしないという問題がありました。
例えば、requestPermission(permissions, reason, opt_callback)関数のケースを考えてみましょう。この関数の実装をサポートしないコンテナは、’not implemented’という結果でopt_callback関数を同期的に呼び出します。一方、この関数を解決するためにXHRを使って実装が行われる場合、そのコールバック関数は非同期的に呼び出されるでしょう。これは、コールバック関数の実行のタイミングにおいて、ガジェットはコンテナの実装依存を気にしなければならないことを意味しています。全てのコールバック関数の呼び出しが非同期的に行われることを保証することで、開発者はクロスコンテナでの振る舞いの違いを意識する必要がなくなるでしょう。
本仕様では、コールバック関数の呼び出しを伴う全てのAPIについて、以下の文章を追加することで、コールバック関数が非同期的に呼び出されることを保証します。
The callback function will not be called until after the existing callstack has completed execution.
(このコールバック関数は、既存のコールスタックが完全に実行された後までは呼び出されることはないでしょう。)
本仕様に関しては、window.setTimeout(, 0); を使うことで、手間をかけることなく達成することができるでしょう。
OpenSocial v0.9において追加された仕様「Align Portable Contacts and REST」について紹介しましょう。この仕様は、OpenSocialとPortable Contactsの互換性について語られたものです。
—
[Align Portable Contacts and REST]
Portable Contactsは、アドレス帳やフレンドリストなどにアクセスするための安全な方法をユーザに提供することを開発者が容易に行えるように、とデザインされた仕様です。特に、いかなるサイトで提供可能な、共通のアクセスパターンやコンタクトスキーマ、よく知られた認証やアクセスルール、いかなるサイトでも対応可能な標準ライブラリ、そして絶対的な最小複雑性などを、最も軽量な形で可能とするツールチェインを開発者に要求する形でもたらします。
OpenSocial v0.9では、Portable Contacts仕様とOpenSocial RESTful API仕様において、それらの互換性を確立するための調整が行われました。本仕様追加において、RESTful APIに以下の章が追加されます。これと同時に、Portable Contacts仕様側でも、OpenSocialとの互換性に関する記述が追加されています。
—
Compatibility with Portable Contacts
This version of the OpenSocial RESTful protocol specification is currently wire-compatible with the Portable Contacts version 1.0 overlapping portion of OpenSocial. Specifically, any compliant OpenSocial 0.9 People Provider is also a compliante Portable Contacts 1.0 Provider, because they are specified to use the same Authorization methods (OAuth), Additional Path Information, Query Parameters, and Contact Schema. The OpenSocial and Portable Contacts communities chose to wire-align our respective specs in order to maximize widespread adoption of a single API for accessing people data. It is our intention to maintain this compatibility going forward, so long as it is feasible, and so long as the changes required are compatible with the Goals and Approach of this spec. Although Portable Contacts is an independent spec, with a more limited scope than OpenSocial, any proposed changes to either this OpenSocial RESTful Protocol spec or the Portable Contacts spec should be considered in the context of both communities, and we should strive not to break compatibility unless it is truly necessary, e.g. if the goals of the two communities diverge significantly in the future.
—
Portale Contactsとの互換性
OpenSocial RESTful protocol仕様のこのバージョンでは、現在OpenSocialの一部分をオーバーラッピングする形でPortable Contacts version 1.0と硬い互換性があります。特に、いかなるOpenSocial 0.9に準拠したPeople Providerは、Portable Contacts 1.o Providerにもなり得ます。なぜなら、それらは同じ認証メソッド(OAuth)、追加パス情報、クエリパラメータ、そしてコンタクトスキーマを使うように指定されているからです。OpenSocialとPortable Contactsコミュニティは、Peopleデータにアクセスするための単一のAPIが最大限の広さで採用されるために、私たちのそれぞれの仕様を硬く調整することを選択しました。それは、将来的にこれらの仕様をとても長く実現可能にし、そしてこの仕様のゴールやアプローチについて要求される変更を互換とするための、この互換性を維持していくことについての我々の意志です。Portable Contactsは独立した仕様であり、OpenSocialよりもより限定されたスコープではありますが、このOpenSocial RESTful Protocol仕様やPortable Contacts仕様のどちらにいかなる変更の提案がされたとしても、両方のコミュニティにおけるコンテキストにおいて考慮されるべきであり、そして我々は、例えば将来有意に2つのコミュニティのゴールがそれぞれ枝分かれするなどのことが真に必要とされるまでは、互換性が壊されないように努力すべきです。
—
Portable Contacts仕様との互換性を図るために調整された結果のXML Schema文書は、「Resolve schema with Portable Contacts」という別の仕様にて定義されます。
function requestAlbums() {
var idspec_params = {};
idspec_params[opensocial.IdSpec.Field.USER_ID] = opensocial.IdSpec.Field.PersonId.OWNER;
var idspec = opensocial.newIdSpec(idspec_params);
var params = {};
req = new opensocial.newDataRequest();
req.add(req.newFetchAlbumsRequest(idspec, params), ‘albums’);
req.send(onLoadAlbums);
}
/* list albums items */
function onLoadAlbums(dataResponse) {
var html = ‘List of albums:
‘;
var albums = dataResponse.get(‘albums’).getData();
albums.each(function(album) {
html += ‘
function listMediaItems(album) {
var albumId = album.getField(opensocial.Album.ID);
var idspec_params = {};
idspec_params[opensocial.IdSpec.Field.USER_ID] = opensocial.IdSpec.Field.PersonId.OWNER;
var idspec = opensocial.newIdSpec(idspec_params);
var req = new opensocial.newDataRequest();
var params = {};
req.add(req.newFetchMediaItemsRequest(idspec, albumId, params), ‘mediaitems’);
req.send(onLoadMediaItems);
}
/** list mediaitem details */
function onLoadMediaItems(dataResponse) {
var html = ‘List of MediaItems:
‘;
var mediaitems = dataResponse.get(‘mediaitems’).getData();
mediaitems.each(function(mediaitem) {
html += ‘
‘ + mediaitem.getField(opensocial.MediaItem.Field.CAPTION);
html += ‘
userId: ユーザID
groupId:
@self: ユーザ(ユーザID)のAlbum
@friends, @all、またはグループID: ユーザのグループ内の全ての人々が所有するAlbum [これのサポートはオプションです]
optionalAlbumId: 特定のAlbumを参照するためのAlbum ID
optionalMediaItemId: Album内の特定のMediaItemを参照するためのMediaItem ID
操作:
GET /album/@me/@self は、Albumの配列を取得します
POST /album/@me/@self は、新しいAlbumを作成します
GET /album/@me/@self/albumId は、特定のAlbumのみを返します
PUT /album/@me/@self/albumId は、Albumを更新します
DELETE /album/@me/@self/albumId は、Albumを削除します
GET /album/@me/@self/albumId/mediaitem は、Album内のMediaItemを返します
POST /album/@me/@self/albumId/mediaitem は、新しいMediaItemの作成に使われます
GET /album/@me/@self/slbumId/mediaitem/mediaItemId は、MediaItemを返します
PUT /album/@me/@self/slbumId/mediaitem/mediaItemId は、MediaItemを更新します
DELETE /album/@me/@self/slbumId/mediaitem/mediaItemId は、MediaItemを削除します
■■ Examples
IDが44332211のAlbumを得るための GET /album/@me/@self/44332211 は、以下をもたらします。
{
“id” : “44332211″,
“thumbnail_url” : “http://pages.example.org/albums/4433221-tn.png”,
“caption” : “Example Album”,
“description” : “This is an example album, and this text is an example description”,
“location” : { “latitude”: 0, “longitude”: 0 },
“owner_id” : “example.org:55443322″
}
IDが11223344のMediaItemを得るための GET /album/@me/@self/44332211/mediaitem/11223344 は、以下をもたらします。
{
“method” : “album.create”,
“id” : “my_album_create_request”,
“params”: {
“userid” : “@me”,
“groupid” : “@self”,
“album” : {
“thumbnail_url” : “http://pages.example.org/albums/4433221-tn.png”,
“caption” : “Example Album”,
“description” : “This is an example album, and this text is an example description”,
“location” : { “latitude”: 0, “longitude”: 0 },
}
}
}