My favorites | Português | Sign in

Guia do desenvolvedor da API do OpenSocial

(API do OpenSocial v0.8.1)

Este guia o ajudará a desenvolver aplicativos OpenSocial. Para tirar o máximo proveito deste guia, você deve estar familiarizado com a API do Gadgets e com JavaScript. Este guia também fornece links para outros documentos que trazem mais informações.

Ele foi modificado para refletir as alterações da atualização da API do OpenSocial 0.7. As seções atualizadas possuem o indicador Novo! ou Atualizado para ajudá-lo a identificar as práticas de programação que foram alteradas desde a última versão.

Sumário

  1. Criação de um aplicativo social
  2. Importação da biblioteca do OpenSocial
  3. Acesso a pessoas e perfis
    1. Obtenção de informações básicas
    2. Código completo para listar amigos
  4. Uso de dados persistentes
  5. Postagem de atividades
  6. Controle de permissão
  7. Para saber mais

Atualizado Criação de um aplicativo social

Um site que pode hospedar aplicativos OpenSocial é chamado de recipiente do OpenSocial. Um aplicativo social é um aplicativo executado em um recipiente do OpenSocial.

Para criar um aplicativo OpenSocial, é necessário ter conhecimento da linguagem JavaScript. Como os aplicativos OpenSocial são desenvolvidos como gadgets, é preciso que você saiba como um gadget é estruturado e, para criar seu aplicativo social, você precisará saber mais sobre a API JavaScript do OpenSocial. (Se preferir, você pode criar aplicativos OpenSocial usando uma API RESTful ou RPC.)

Muitos recipientes oferecem outros recursos além dos apresentados na especificação do OpenSocial que você pode usar em seus gadgets. Para saber mais sobre esses recursos específicos do recipiente, consulte a documentação do recipiente listada no Guia Primeiros passos. Além disso, muitos recipientes oferecem ambientes de teste chamados sandboxes, nos quais você pode testar seus gadgets com segurança.

O foco da API do OpenSocial está nas pessoas. Os gadgets OpenSocial ajudam os usuários a compartilharem suas atividades uns com os outros e a acessarem informações de seus amigos. A API do OpenSocial possui três áreas principais de recursos:

  • Pessoas e relacionamentos. Membros de redes sociais possuem amigos. Os aplicativos OpenSocial usam as conexões entre as pessoas e seus amigos.
  • Persistência. Aplicativos OpenSocial podem utilizar o recurso Persistência, isto é, a capacidade de armazenar dados que poderão ser recuperados quando o aplicativo for executado novamente.
  • Atividades. As pessoas usam aplicativos sociais para informar às outras o que estão fazendo: indo ao cinema, postando fotos, e assim por diante.

Muitas chamadas da API do OpenSocial são assíncronas: ou seja, a chamada é retornada imediatamente, mas a ação solicitada pela chamada não ocorre imediatamente. Em vez disso, a chamada cria uma solicitação ao servidor para recuperar ou atualizar informações. Quando você executa uma chamada assíncrona, você passa uma função de retorno de chamada. Quando os dados são retornados do servidor, o OpenSocial chama sua função de retorno de chamada.

Para obter mais informações sobre os conceitos descritos nesta seção, consulte os seguintes documentos:

Atualizado Importação da biblioteca do OpenSocial

Todo gadget tem a seguinte estrutura:

<?xml version="1.0" encoding="UTF-8" ?>
<Module>
 <ModulePrefs title="Standard gadget structure">
 </ModulePrefs>
 <Content type="html">
 <![CDATA[
      Gadget content and features here
 ]]>
 </Content>
</Module>

Ao criar um gadget que usa OpenSocial, você precisa adicionar a linha abaixo à seção ModulePrefs:

  <Require feature="opensocial-0.8"/>

Ela faz com que a estrutura de um gadget OpenSocial seja:

<?xml version="1.0" encoding="UTF-8" ?>
<Module>
 <ModulePrefs title="Standard gadget structure">
  <Require feature="opensocial-0.8"/>
 </ModulePrefs>
 <Content type="html">
 <![CDATA[
      Gadget content and features here
 ]]>
 </Content>
</Module>

Atualizado Acesso a pessoas e perfis

Vamos começar com um exemplo simples que lista os nomes dos seus amigos. Primeiro, é importante compreender as funções definidas pela API do OpenSocial:

  • Viewer (Visualizador): o usuário conectado no navegador. Como visualizador, você pode visualizar sua própria página ou o perfil de outro usuário.
  • Owner (Proprietário): o usuário a quem o perfil ou aplicativo em questão pertence.
  • Friends (Amigos): os usuários que o proprietário ou visualizador adicionou como amigos no recipiente.

O exemplo ''List Friends'' (Listar amigos) discutido nesta seção identifica o visualizador e seus amigos e exibe uma lista de amigos do visualizador. Ele ilustra como obter e operar dados em um aplicativo do OpenSocial. As etapas básicas são:

  1. Criação da especificação do gadget.
  2. Criação do esqueleto do aplicativo.
  3. Criação da solicitação.
  4. Criação da resposta.

Estas etapas são discutidas abaixo em mais detalhes.

Criação da especificação do gadget

A primeira etapa no desenvolvimento de um gadget é a criação de sua especificação padrão:

<?xml version="1.0" encoding="UTF-8" ?>
<Module>
 <ModulePrefs title="List Friends Example">

 <Require feature="opensocial-0.8"/>
 </ModulePrefs>
 <Content type="html">
 <![CDATA[
   <script type="text/javascript">
   </script>
   <div id="message"> </div>

 ]]>
 </Content>
</Module>

Criação do esqueleto do aplicativo

Em seguida, criamos o esqueleto do aplicativo. Ele é composto por duas funções JavaScript que usaremos no gadget:

  • Uma função request, que usaremos para solicitar o proprietário e seus amigos.
  • Uma função de retorno de chamada response, que o OpenSocial chama com os nomes dos amigos do proprietário.

Criaremos as bases para essas funções aqui e as detalharemos nas próximas seções. O elemento final do esqueleto do aplicativo é uma chamada de função que garante que a função request seja executada após o aplicativo ser carregado.

Veja o esqueleto do aplicativo:

<script type="text/javascript">

  /**
   * Request the OWNER and OWNER's friends.
   */
  function request() {
  };

  /**
   * Parses the response and generates html to list the names of the owner and
   * his or her friends.
   *
   * @param {Object} dataResponse Friend information that was requested.
   */
  function response(dataResponse) {
  };
  // Execute the request function when the application is finished loading.
  gadgets.util.registerOnLoadHandler(request);
</script>

Criação da solicitação

Em seguida, nós detalharemos a função request, que chama o OpenSocial para obter o proprietário e seus amigos. Esta função:

  • Cria um objeto idspec chamando newIdSpec().
  • Cria uma solicitação (na variável req) chamando opensocial.newDataRequest().
  • Chama req.add() para adicionar as funções newFetchPersonRequest() e newFetchPeopleRequest() à solicitação.
  • Chama req.send() para iniciar a solicitação, passando response como a função de retorno de chamada.

Ao usar a função newFetchPeopleRequest, você cria um objeto IdSpec que é passado como o argumento da função. O IdSpec que você usa varia de acordo com os dados que deseja recuperar. A tabela abaixo mostra como criar objetos IdSpec para várias solicitações:

Para solicitar... Use este código
VIEWER_FRIENDS var idspec = opensocial.newIdSpec({ "userId" : "VIEWER", "groupId" : "FRIENDS" });
OWNER_FRIENDS var idspec = opensocial.newIdSpec({ "userId" : "OWNER", "groupId" : "FRIENDS" });

Este é o código para a função request():

/**
 * Request the OWNER and OWNER's friends.
 */
function request() {
  var idspec = opensocial.newIdSpec({ "userId" : "OWNER", "groupId" : "FRIENDS" });
  var req = opensocial.newDataRequest();
  req.add(req.newFetchPersonRequest("OWNER"), "get_owner");
  req.add(req.newFetchPeopleRequest(idspec), "get_friends");
  req.send(response);
};

Observação:Você pode usar strings literais como atalhos para propriedades enums de JavaScript que representam campos e métodos do OpenSocial. Por exemplo, em vez de usar

  opensocial.IdSpec.PersonId.OWNER

você pode simplesmente usar

  "OWNER"

como no exemplo acima. Para descobrir a string que corresponde a uma propriedade enum, consulte a documentação da propriedade enum na Referência da API JavaScript.

Para obter mais informações sobre newFetchPersonRequest e newFetchPeopleRequest, consulte o artigo Solicitação de dados no OpenSocial.

Criação da resposta

Nesta seção, criaremos a função response. O servidor chama response() para manipular os dados – o proprietário e seus amigos, desta forma:

  • Crie as variáveis do proprietário e dos amigos e chame dataResponse.get() para inicializá-las com os valores retornados pelo servidor.
  • Comece criando um HTML que inclua o nome do proprietário e dos amigos.
  • Acesse toda a coleção de amigos usando a função each().
  • Chame getDisplayName() para cada amigo para adicionar o nome do amigo à saída HTML.
  • Chame person.getDisplayName() para acessar cada um dos amigos e adicione o nome do amigo ao HTML.
  • Defina a propriedade innerHTML do gadget para o HTML recém criado, chamando document.getElementById('message').innerHTML = html.
/**
 * Parses the response and generates html to list the names of the owner and
 * his or her friends.
 *
 * @param {Object} dataResponse Friend information that was requested.
 */
function response(dataResponse) {
  var owner = dataResponse.get('get_owner').getData();
  var friends = dataResponse.get('get_friends').getData(); 
  var html = 'Friends of ' + owner.getDisplayName();
  html += ':<br><ul>';
  friends.each(function(person) {
      html += '<li>' + person.getDisplayName() + '</li>';
  });
  html += '</ul>';
  document.getElementById('message').innerHTML = html;
};

Código completo para listar amigos

Esta seção combina os blocos de código anteriores em uma listagem completa para o aplicativo List Friends discutido nesta seção. A função response() obtém o proprietário e seus amigos e depois insere o nome do proprietário em uma string HTML para exibição. A função então acessa os amigos e adiciona o nome de cada amigo ao HTML. Finalmente, o HTML que contém os nomes do proprietário e de seus amigos é inserido na tag div para exibição.

Lista completa:

<?xml version="1.0" encoding="UTF-8" ?>
<Module>
  <ModulePrefs title="List Friends Example">
    <Require feature="opensocial-0.8"/>
  </ModulePrefs>
  <Content type="html">
  <![CDATA[
    <script type="text/javascript">
      /**
       * Request the OWNER and OWNER's friends.
       */
      function request() {
        var idspec = opensocial.newIdSpec({ "userId" : "OWNER", "groupId" : "FRIENDS" });
        var req = opensocial.newDataRequest();
        req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.OWNER), "get_owner");
        req.add(req.newFetchPeopleRequest(idspec), "get_friends");
        req.send(response);
      };

      /**
       * Parses the response and generates html to list the names of the owner and
       * his or her friends.
       *
       * @param {Object} dataResponse Friend information that was requested.
       */
      function response(dataResponse) {
        var owner = dataResponse.get('get_owner').getData();
        var friends = dataResponse.get('get_friends').getData(); 
        var html = 'Friends of ' + owner.getDisplayName();
        html += ':<br><ul>';
        friends.each(function(person) {
          html += '<li>' + person.getDisplayName() + '</li>';
        });
        html += '</ul>';
        document.getElementById('message').innerHTML = html;
      };

      // Execute the request function when the application is finished loading.
      gadgets.util.registerOnLoadHandler(request);

    </script>
    <div id="message"> </div>
  ]]>
  </Content>
</Module>

Atualizado Uso de dados persistentes

A API do OpenSocial suporta salvar e recuperar dados por usuário e por aplicativo. O código de amostra desta seção:

  • Gera dados para serem salvos e os armazena em três variáveis: data1, um número aleatório de 0 a 5, data2, um número aleatório de 0 a 100, e data3, o carimbo de data e hora atual.
  • Salva os dados no perfil do visualizador, salvando data1 em AppField1, data2 em AppField2 e data3 em AppField3.
  • Envia a solicitação.

Este fragmento de código mostra como salvar os dados nos dados persistentes compartilhados:

/**
 * Generate 3 fields of random data and saves them to the persistent data store.
 *
 */
function populateMyAppData() {
  var req = opensocial.newDataRequest();
  var data1 = Math.random() * 5;
  var data2 = Math.random() * 100;
  var data3 = new Date().getTime();
  
  req.add(req.newUpdatePersonAppDataRequest("VIEWER", "AppField1", data1));
  req.add(req.newUpdatePersonAppDataRequest("VIEWER", "AppField2", data2));
  req.add(req.newUpdatePersonAppDataRequest("VIEWER", "AppField3", data3));
};

O próximo fragmento de código recupera os dados armazenados através das seguintes etapas:

  • Especifica os nomes das chaves usadas para armazenar os dados.
  • Adiciona uma chamada newFetchPersonAppDataRequest à solicitação, passando os nomes das chaves como parâmetros.
  • Chama req.send para enviar a solicitação ao servidor.
/**
 * Use newFetchPersonAppDataRequest() to read data from the store.
 *
 */
function requestMyData() {
  var req = opensocial.newDataRequest();
  var fields = [ "AppField1", "AppField2", "AppField3" ];
  var p = {};
  
  p[opensocial.IdSpec.Field.USER_ID[]] = opensocial.IdSpec.PersonId.VIEWER;
  var idSpec = opensocial.newIdSpec(p);
  req.add(req.newFetchPersonAppDataRequest(idSpec, fields), "viewer_data");
  req.send(handleRequestMyData);
}

Aqui está o código completo do aplicativo, que define valores para os três campos, armazena-os e depois os recupera. Esta listagem também adiciona funções para gerar a saída na variável htmlout e depois insere esta variável HTML em um div para exibição.

<?xml version="1.0" encoding="UTF-8" ?> 
<Module>
  <ModulePrefs title="Data Persistence Example" > 
    <Require feature="opensocial-0.8"/>
  </ModulePrefs>
  <Content type="html">
  <![CDATA[

  <script type="text/javascript"> 
   gadgets.util.registerOnLoadHandler(populateMyAppData);
   var htmlout = "";
   var me = null;

   /**
    * Set user data
    */
   function populateMyAppData() {
     var req = opensocial.newDataRequest();
     var data1 = Math.random() * 5;
     var data2 = Math.random() * 100;
     var data3 = new Date().getTime();
     htmlout += "Setting AppField1 to " + data1 + "<br />";
     req.add(req.newUpdatePersonAppDataRequest("VIEWER", "AppField1", data1)) + "<br />";
     htmlout += "Setting AppField2 to " + data2 + "<br />";
     req.add(req.newUpdatePersonAppDataRequest("VIEWER", "AppField2", data2)) + "<br />";
     htmlout += "Setting AppField3 to " + data3 + "<br />";
     req.add(req.newUpdatePersonAppDataRequest("VIEWER", "AppField3", data3)) + "<br />";
     req.send(handlePopulateMyAppData);
   }

   /**
    * Handle responses from update person app data requests
    */
   function handlePopulateMyAppData(data) {
     if (data.hadError()) {
       htmlout += data.getErrorMessage();
     }
     requestMyData();
   }
   
   /**
    * Fetch app data
    */
   function requestMyData() {
     var req = opensocial.newDataRequest();
     var fields = [ "AppField1", "AppField2", "AppField3" ];
     req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer");
     req.add(req.newFetchPersonAppDataRequest("VIEWER", fields), "viewer_data");
     req.send(handleRequestMyData);
   }

   /**
    * Handle responses from app data requests
    */
   function handleRequestMyData(data) {
     var mydata = data.get("viewer_data");
     var viewer = data.get("viewer");
     me = viewer.getData();

     if (mydata.hadError()) {
       htmlout += data.getErrorMessage();
       return;
     }
     // Do something with the returned data - note the getData call
     doSomethingWithMyData(mydata.getData());
   }

   /**
   * Operate on user data
   */
   function doSomethingWithMyData(data) {
     //Data is indexed by user id, and represents an object where keys 
     //correspond with the app data fields.
     var mydata = data[me.getId()];
     var div = document.getElementById('content_div');
     htmlout += "My AppField1 data is: " + mydata["AppField1"] + "<br />";
     htmlout += "My AppField2 data is: " + mydata["AppField2"] + "<br />";
     htmlout += "My AppField3 data is: " + mydata["AppField3"] + "<br />";
     div.innerHTML = htmlout;
   }
   
 </script>
 <div id="content_div"></div>
  ]]> 
  </Content>
</Module>

Observação: Os dados armazenados em um aplicativo OpenSocial estão sempre na forma de strings. Para a maioria das finalidades, é mais prático que esta string possua codificação JSON. Como o OpenSocial adiciona automaticamente códigos de escape HTML a todos os dados retornados, incluindo dados de aplicativo, é necessário excluir os códigos de escape dos objetos JSON em dados persistentes antes de analisá-los. Por exemplo:

var unescapedString = gadgets.util.unescapeString(jsondata); 
var obj = gadgets.json.parse(unescapedString);

Limpeza de dados persistentes

Existem casos em que seu aplicativo pode precisar excluir uma chave de dados persistentes. Para apagar uma chave e seu valor, use o método newRemovePersonAppDataRequest:

var req = opensocial.newDataRequest();
req.add(
    req.newRemovePersonAppDataRequest("VIEWER", "myKey"),
    "clear_data");
req.send(set_callback);

Quando esta solicitação é realizada, a chave myKey e seu valor armazenado são apagados dos dados persistentes.

É possível apagar diversas chaves ao mesmo tempo passando uma matriz de chaves a este método:

var req = opensocial.newDataRequest();
req.add(
    req.newRemovePersonAppDataRequest("VIEWER", ["key1", "key2", "key3"]),
    "clear_data");
req.send(set_callback);

Quando esta solicitação é realizada, as chaves key1, key2, key3 e seus valores armazenados são apagados dos dados persistentes.

Para maiores informações sobre a limpeza de dados persistentes, consulte este artigo sobre o uso de dados persistentes.

Atualizado Atividades

A API do OpenSocial permite usar um fluxo de atividades para compartilhar atividades com seus amigos. Um fluxo de atividades é um feed no qual cada entrada representa uma ação realizada pelo usuário. Uma atividade pode ser qualquer coisa, desde modificar o estado de um aplicativo até escrever uma crítica on-line de um filme.

Se você solicitar prioridade de atividade HIGH (alta), o aplicativo solicitará a permissão do usuário para postar as atividades em seu nome, caso ainda não tenha permissão. Se você solicitar prioridade LOW (baixa), a chamada não fará nada se o aplicativo não tiver permissão de postagem.

  • Chame newActivity para criar uma nova atividade contendo o texto especificado como título.
  • Chame requestCreateActivity para enviar a atividade ao servidor, passando uma função de retorno de chamada.
  • Na função de retorno de chamada, manipule um erro caso seja retornado pelo servidor.

Este exemplo simples ilustra como criar uma atividade:

<?xml version="1.0" encoding="UTF-8" ?> 
<Module>
  <ModulePrefs title="Activities - v0.8" >
    <Require feature="opensocial-0.8"/>
  </ModulePrefs> 
  <Content type="html">
  <![CDATA[ 
  <div id="content_div"></div>
  <script type="text/javascript">

  var div = document.getElementById('content_div');

  /**
   * Create the new activity and send it to the server.
   */
  function postActivity(text) {  
    var params = {};  
    params[opensocial.Activity.Field.TITLE] = text;
    var activity = opensocial.newActivity(params); 
    opensocial.requestCreateActivity(activity, opensocial.CreateActivityPriority.HIGH, callback);
    div.innerHTML = "Activity title is: " + activity.getField(opensocial.Activity.Field.TITLE);
  };        
  
  /**
  * Server calls this function to indicate whether the activity post succeeded or failed.
  */
  function callback(status) {
    if (status.hadError())
    {
      alert("Error creating activity.");
    }
    else 
    {
      alert("Activity successfully created.");
    }
  };
  
  /**
   * Start the process of posting an activity.
   */
  function startActivity; {
    postActivity("This is a sample activity, created at " + new Date().toString());
  };

  //Call startActivity as soon as the gadget finishes loading.
    gadgets.util.registerOnLoadHandler(startActivity);
  </script>
  ]]> 
  </Content>
</Module>

Atualizado Controle de permissão

A API do OpenSocial suporta o controle de permissão nos aplicativos. Quando um aplicativo usa uma solicitação de dados para obter um visualizador a partir do servidor, essa solicitação só recebe uma resposta se o aplicativo tiver acesso. Se o aplicativo não tiver acesso, é retornado um dos códigos de erro padrão, opensocial.ResponseItem.Error.UNAUTHORIZED. Um aplicativo também pode verificar seu acesso antecipadamente, usando a nova chamada opensocial.hasPermission. Se o acesso for negado, use opensocial.requestPermission para solicitar a permissão especificada ao visualizador. É possível que alguns recipientes sempre concedam e outros sempre neguem acesso ao visualizador, mas esta decisão cabe ao recipiente.

Este trecho ilustra como usar a API de controle de permissão:

<?xml version="1.0" encoding="UTF-8" ?>

<Module>
  <ModulePrefs title="Checking for Permission" >

    <Require feature="opensocial-0.8"/>
  </ModulePrefs>
  <Content type="html">
  <![CDATA[
    <h2>Owner:</h2>
    <div id="owner-output">No data.</div>

    <h2>Viewer:</h2>
    <div id="viewer-output">No data.</div>
    <script type="text/javascript">
      /**
       * Request permission for the VIEWER if the app does not have it.
       */
      function requestPermission() {
        if (opensocial.hasPermission(opensocial.Permission.VIEWER)) {
          requestData();
        } else {
          var reason = "To demonstrate permission capabilities";

          opensocial.requestPermission(opensocial.Permission.VIEWER, reason, onPermissionRequested);
        }
      };

      /**
       * Handle the response for the request for VIEWER information.
       */
      function onPermissionRequested(response) {
        if (response.hadError()) {
          switch(response.getErrorCode()) {
            case opensocial.ResponseItem.Error.NOT_IMPLEMENTED :
              alert("Requesting permission is not implemented on this container.");
              break;

            default:
              alert("There was a problem requesting permission: " + response.getErrorMessage());
              break;
          };
        }
        requestData();

      };

      /**
       * Request the OWNER (and VIEWER if we have permission).
       */
      function requestData() {
        var req = opensocial.newDataRequest();
        req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.OWNER), "owner");

        // If we have permission to see the viewer's info, then add it to the request.
        if (opensocial.hasPermission(opensocial.Permission.VIEWER)) {
          req.add(req.newFetchPersonRequest(opensocial.IdSpec.PersonId.VIEWER), "viewer");

        }
        req.send(showData);
      };

      /**
       * Shows the response from the request for Person data.
       */
      function showData(data) {
        var owner = data.get("owner").getData();
        var ownerOutput = document.getElementById("owner-output");

        showPerson(owner, ownerOutput);
        if (opensocial.hasPermission(opensocial.Permission.VIEWER)) {
          var viewer = data.get("viewer").getData();
          var viewerOutput = document.getElementById("viewer-output");
          showPerson(viewer, viewerOutput);
        }
      }

      /**
       * Prints information about a person.
       */
      function showPerson(person, div) {
        var name = person.getDisplayName();
        var thumb = person.getField(opensocial.Person.Field.THUMBNAIL_URL);
        var html = '<img src="' + thumb + '"/>' + name;
        div.innerHTML = html;
      }

      //Execute requestData when the page is done loading
      gadgets.util.registerOnLoadHandler(requestPermission);
    </script>
  ]]>
  </Content>
</Module>

Para saber mais

Consulte estes recursos adicionais para saber mais sobre a API do OpenSocial:

Voltar ao início

Histórico de revisões

Revisão Atualizado Descrição
OpenSocial 0.8.1 Setembro de 2008 A maioria das seções foi atualizada. As instruções do tipo Require foram alteradas para 0.8. A amostra de acesso agora usa IdSpec. Foram adicionadas informações sobre a limpeza de dados persistentes. Amostra de permissões atualizada.
OpenSocial 0.7 Abril de 2008 Novo documento.