Aplicativos Java para Facebook no Google App Engine

Criar, implementar e instalar um aplicativo do Facebook no Google App Engine

A ausência de suporte Java nativo™ no Facebook Platform não precisa ser um obstáculo ao desenvolvimento de aplicativos do Facebook de terceiros em linguagem Java. Este artigo mostra como criar um aplicativo do Facebook, implementá-lo em Java e instalá-lo no serviço App Engine, do Google.

Mr Joseph P. McCarthy, Developer, Dun & Bradstreet

Photo of Joseph McCarthyJoseph McCarthy é Java Developer na Dun & Bradstreet, em Dublin. Desde sua graduação pela University of Limerick em Sistemas de Computação e com um diploma em Engenharia da Computação, trabalhou de forma ampla com a tecnologia Java por 10 anos, desenvolvendo tarefas Ant customizadas e trabalhando com diversas APIs públicas, incluindo o Twitter, Facebook e GetGlue.



06/Jul/2012

Criado em fevereiro de 2004, o Facebook é a maior rede social do mundo, com mais de 900 milhões de usuários utilizando o site para compartilhar conteúdo com seus amigos conectados. O Facebook Platform, criado em maio de 2007, possibilita que terceiros desenvolvam aplicativos que sejam integrados ao Facebook. Inicialmente, a plataforma oferecia suporte a uma ampla variedade de linguagens de programação — incluindo Java — mas agora, ela fornece SDKs nativos somente para JavaScript e PHP (bem como suporte para aplicativos em dispositivos iOS e Android). No entanto, o projeto RestFB de software livre mantém a API Java desde sua descontinuação pelo Facebook (consulte Recursos).

O Google App Engine (GAE) é uma Plataforma como Serviço (PaaS) que possibilita que desenvolvedores registrados executem aplicativos criados no Python, Java ou Go na infraestrutura do Google. Este artigo mostra como registrar um aplicativo do Facebook, desenvolvê-lo em Java e instalá-lo gratuitamente no GAE para uso por um usuário conectado ao Facebook. (Observe que o Google impõe um limite diário de recursos que cada aplicativo instalado no GAE pode utilizar.)

O aplicativo simples que será criado por você lista todos os amigos do usuário com seus IDs e fotos do perfil — parecido com a aparência da página anterior de amigos do perfil de um usuário do Facebook. Para desenvolver o aplicativo, é necessário(a):

  • Uma conta do Facebook
  • Uma conta do Google
  • O Eclipse IDE com o plug-in do GAE instalado (consulte Recursos)
  • Familiaridade com o uso do Eclipse

O código de amostra para o aplicativo também está disponível para download.

Registrando o aplicativo

A primeira etapa é registrar seu aplicativo no Facebook e no GAE. É uma boa prática criar o aplicativo nas duas plataformas ao mesmo tempo para assegurar que as informações inseridas sejam correspondentes, como necessário.

Registrar um aplicativo do Facebook

Efetue login no Facebook e ative o aplicativo do desenvolvedor em https://developers.Facebook.com/apps. (Se estiver ativando-o pela primeira vez, é preciso conceder acesso do aplicativo ao seu perfil para que possa continuar.)

Clique em Create New App no canto superior direito da página Apps para exibir o diálogo Create New App, mostrado na Figura 1:

Figura 1. Caixa de diálogo Create New App do Facebook
Caixa de diálogo Create New App do Facebook

Insira um nome válido e um namespace disponível para o seu aplicativo. O namespace é um identificador exclusivo de uma só palavra a ser utilizado em uma URL do aplicativo do Facebook. (Na Figura 1, inseriMy Old Friends como o nome do aplicativo e myoldfriends como o namespace.) Deixe a opção de hosting gratuito fornecido pela Heroku sem selecionar e clique em Continue. Digite o código CAPTCHA no próximo diálogo e clique em Submit para abrir o diálogo de configurações básicas para seu novo aplicativo, como mostrado na Figura 2:

Figura 2. Diálogo de configurações básicas do aplicativo do Facebook
Diálogo de configurações básicas do aplicativo do Facebook

Observe as opções App ID e App Secret, na parte superior da tela (ocultas na Figura 2). O Facebook as utiliza para identificar seu aplicativo. Mantenha-as privadas e não permita que outros desenvolvedores as utilizem, pois elas podem ser utilizadas de forma maliciosa sem o seu conhecimento.

Insira um domínio de aplicativo no campo App Domains . Ele deve ser o domínio do GAE que será registrado para o aplicativo no site do desenvolvedor do GAE, portanto, ele deve terminar com .appspot.com. Por exemplo, na Figura 2, inseri myoldfacebookfriends.appspot.com. Como esse domínio não está mais disponível, será necessário utilizar um diferente. Certifique-se de que ele corresponda ao identificador do aplicativo utilizado ao registrar o aplicativo do GAE.

Em Select how your app integrates with Facebook, selecione Website with Facebook Login e insira a URL de um site que consiste no domínio do GAE inserido no campo App Domains , precedido por http://. (Na Figura 2, inserihttp://myoldfacebookfriends.appspot.com.)

A URL da tela

A URL da tela especificada nas configurações básicas do seu aplicativo informa ao Facebook onde obter o código da página para preencher a Canvas Page — uma tela em branco no Facebook na qual o aplicativo é executado. Quando um usuário solicita a Canvas Page, o Facebook carrega a URL da Tela em um <iframe> nessa página.

Selecione App on Facebook e insira a URL da tela para um servlet no qual o aplicativo será executado. Para esse aplicativo, a URL da tela termina com um ponto de interrogação para indicar que seus parâmetros serão passados por meio da URL de solicitação enviada para ele. A URL da tela segura é a mesma que a URL da tela, exceto que https substitui http. Mais uma vez, o ponto de interrogação ao final da URL é importante. (A URL para o servlet do meu aplicativo é http://myoldfacebookfriends.appspot.com/myoldfacebookfriends, portanto, na Figura 2, inserihttp://myoldfacebookfriends.appspot.com/myoldfacebookfriends? para a URL da tela e https://myoldfacebookfriends.appspot.com/myoldfacebookfriends? para a URL da tela segura.)

Isso é tudo o que é preciso ser feito para configurar um aplicativo no Facebook, mas é uma boa ideia definir algumas das outras configurações, como o ícone do aplicativo e sua categoria, para modificar o modo como ele é apresentado aos usuários.

Registrar o aplicativo com o GAE

Agora que o aplicativo está registrado no Facebook, ele será registrado no GAE.

Conecte-se a esta página de aplicativos no GAE — https://appengine.google.com/ — e clique em Create Application. Em Application Identifier, insira o mesmo nome de domínio do aplicativo utilizado nas configurações básicas do aplicativo do Facebook. (A parte appspot.com já é fornecida.) É possível utilizar o que quiser para o título do aplicativo, que é usado em procuras de aplicativos registrados. Deixe as demais opções com seus padrões.

Figura 3. O diálogo Create an Application para o GAE
O diálogo Create an Application para o GAE

Clique em Create Application para finalizar o processo de registro do GAE.


Desenvolvendo o aplicativo

No Eclipse, crie um novo projeto do GAE clicando em File > New > Web Application Projectou no botão New Web Application Project no menu Google Services and Deployment Tools. Insira um nome do projeto e um nome do pacote. Cancele a seleção de Use Google Web Toolkit. Faça o download do arquivo JAR do RestFB (consulte Recursos) e o inclua na pasta WEB-INF/lib do projeto.

Inclua a definição de servlet para o aplicativo no arquivo web.xml do projeto. A Listagem 1 mostra a definição I utilizada:

Listagem 1. Definição de servlet
<?xml version="1.0" encoding="utf-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5">
<servlet>
<servlet-name>myoldFacebookfriendsServlet</servlet-name>
<servlet-class>com.Facebook.friends.MyOldFacebookFriendsServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>myoldFacebookfriendsServlet</servlet-name>
<url-pattern>/myoldFacebookfriends</url-pattern>
</servlet-mapping>
</web-app>

Observe que o <url-pattern> é o mesmo que na URL da tela no diálogo de configurações básicas do aplicativo do Facebook, mas sem o ponto de interrogação.

Desde outubro de 2011, os aplicativos do Facebook requerem a ativação do Secure Sockets Layer (SSL); ele está desativado por padrão no GAE. Para ativá-lo, inclua a linha abaixo no appengine-web.xml:

<ssl-enabled>true</ssl-enabled>

O signed request do Facebook

Utilizando o método POST do HTTP, o Facebook envia um signed request para o servlet do aplicativo a fim de criar seu conteúdo. Essa solicitação contém uma carga útil codificada de 64 bits que contém, entre outros metadados, o OAuth token para o aplicativo do usuário atual. Isso é incluído na carga útil da solicitação se o usuário tiver concedido acesso ao seu perfil para o aplicativo. É preciso convertê-lo em um objeto Java para que o aplicativo possa utilizá-lo.

A Listagem 2 mostra a origem do signed request para o objeto Java. Omiti todos os métodos get e set para dar mais clareza; eles estão incluídos no download do código fonte (consulte Download).

Listagem 2. O objeto signed-request
import org.apache.commons.codec.binary.Base64;
import org.codehaus.jackson.map.ObjectMapper;

public class FacebookSignedRequest {

   private String algorithm;
   private Long expires;
   private Long issued_at;
   private String oauth_token;
   private Long user_id;
   private FacebookSignedRequestUser user;

   public static class FacebookSignedRequestUser {

      private String country;
      private String locale;
      private FacebookSignedRequestUserAge age;

      public static class FacebookSignedRequestUserAge {
         private int min;
         private int max;

      }
      
   }
   
}

É possível decodificar a carga útil com Base64 na biblioteca Apache Commons Codec. A carga útil decodificada está em JavaScript Object Notation (JSON) e pode ser convertida em um objeto Java utilizando o processador de JSON Jackson. Faça o download de seus arquivos JAR e os inclua no projeto (consulte Recursos). Inclua o método auxiliar estático mostrado na Listagem 3 na classe FacebookSignedRequest para criar o objeto:

Listagem 3. Método auxiliar para codificação e decodificação da carga útil
public static FacebookSignedRequest getSignedRequest(String signedRequest) 
      throws Exception {
   
   String payload = signedRequest.split("[.]", 2)[1];
   payload = payload.replace("-", "+").replace("_", "/").trim();
   String jsonString = new String(Base64.decodeBase64(payload.getBytes()));
   return new ObjectMapper().readValue(jsonString, 
                              FacebookSignedRequest.class);
   
}

Criar o servlet

Agora, é possível começar a codificar o aplicativo que será executado em um servlet. Crie uma nova classe com a mesma assinatura que a definição <servlet-class> noweb.xml. Primeiro, é preciso extrair o OAuth token da carga útil utilizando a classe SignedRequest , conforme mostrado na Listagem 4:

Listagem 4. Extraindo o OAuth token
String signedRequest = (String) request.getParameter("signed_request");
FacebookSignedRequest FacebookSR = null;
try {
   FacebookSR = FacebookSignedRequest.getSignedRequest(signedRequest);
} catch (Exception e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
}
String oauthToken = FacebookSR.getOauth_token();

Se o objeto oauthToken for nulo, o usuário não concedeu acesso ao aplicativo e deve ser direcionado para a URL de autenticação. A URL, que é padrão em todos os aplicativos, segue o formato abaixo:

https://www.Facebook.com/dialog/oauth?client_id=API KEY&redirect_uri=
   https://apps.Facebook.com/Application Namespace/&scope=Permissions

API KEY e Application Namespace na URL de autenticação são os parâmetros exibidos no diálogo de configurações básicas do Facebook para o aplicativo. Permissions é a lista de permissões necessária para seu aplicativo. Todos os aplicativos possuem permissões básicas por padrão e não é necessário incluir nenhuma outra para os propósitos deste artigo. (Consulte Recursos para um link da lista completa de permissões disponíveis.)

É possível customizar a aparência dessa página em Settings > Auth Dialog do aplicativo do desenvolvedor do Facebook. Normalmente, seria possível visualizar o método HttpServletRequest.sendRedirect() do servlet, mas como o aplicativo estará sendo executado em um <iframe> no domínio apps.Facebook.com, um fragmento curto do JavaScript (mostrado na Listagem 5) altera a localização da janela do navegador para a URL do aplicativo:

Listagem 5. Código JavaScript redirecionando para a URL do aplicativo
PrintWriter writer = response.getWriter();
if(oauthToken == null) {
   
     response.setContentType("text/html");
     String authURL = "https://www.Facebook.com/dialog/oauth?client_id="
       + API_KEY
       + "&redirect_uri=https://apps.Facebook.com/myoldfriends/&scope=";
     writer.print("<script> top.location.href='" + authURL + "'</script>");
     writer.close();

}

A Graph API do Facebook

A Graph API possibilita a leitura das propriedades e conexões do gráfico social do Facebook. É possível ler campos específicos, obter imagens de um objeto, examinar um objeto a procura de metadados e obter atualizações e mudanças em tempo real.

Com um OAuth token válido, é possível criar um DefaultFacebookClient a partir da biblioteca do RestFB e utilizá-lo para recuperar dados da Graph API do Facebook utilizando a chamada fetchConnection() . Acesse o Graph Explorer no Facebook em https://developers.Facebook.com/tools/explorer. Selecione o aplicativo que está sendo desenvolvido a partir da caixa suspensa no canto superior direito e clique em Get access token para conceder acesso. Clique nos vários links no cabeçalho Connections para ver os resultados.

Para obter os amigos do usuário, clique no link friends e visualize os resultados. Observe que o valor da URL no explorer é user id/friends. O parâmetro de conexão na chamada de função normalmente utilizaria o mesmo valor que o Graph Explorer. No entanto, como o aplicativo utiliza dados do usuário conectado, é possível substituir o ID do usuário por me, criando o valor me/friends. A chamada retorna o tipo Connection bruto e, como o tipo de classe é User, é preciso incluí-lo como um parâmetro. A chamada final é:

Connection<User> myFriends = FacebookClient.fetchConnection("me/friends", User.class);

O resultado da chamada de método fetchConnection() é mantido em uma List de objetos List na classe Connection . A classe Connection implementa a interface Iterable para que cada objeto List seja obtido na List utilizando o loop for aprimorado:

for (List<User> myFriendsList : myFriends)

Em cada iteração do loop, o objeto myFriendsList contém a lista atual de usuários para essa página de dados retornados. Cada objeto User dessa lista é utilizado para criar uma linha na tabela de usuários que o servlet irá criar. Embora o ID e o nome do usuário possam ser recuperados a partir do objeto User , a foto do perfil não pode. No entanto, o Facebook fornece uma URL para recuperar a foto do perfil de qualquer usuário: https://graph.facebook.com/User ID/picture. Portanto, a URL da foto do perfil é criada substituindo User ID na URL pelo ID do usuário do objeto User . O uso do mesmo objeto PrintWriter , como antes, cria uma tabela com uma linha de cabeçalho na tela:

writer.print("<table><tr><th>Photo</th><th>Name</th><th>Id</th></tr>");

Itere por meio da lista de objetos User , conforme descrito acima, e crie uma nova linha para essa tabela utilizando as variáveis de instância a partir de cada objeto User :

for (List<User> myFriendsList : myFriends) {

   for(User user: myFriendsList)
      writer.print("<tr><td>" + 
         "<img src=\"https://graph.facebook.com/" + user.getId() + "/picture\"/>" +
         "</td><td>" + user.getName() +"</td><td>" + user.getId() + "</td></tr>");

}

Finalmente, feche a guia <table> e o objeto PrintWriter para concluir o servlet:

writer.print("</table>");
writer.close();

A Listagem 7 mostra o método doPost() final do servlet:

Listagem 7. O método doPost()
public void doPost(HttpServletRequest request, HttpServletResponse response) 
  throws ServletException, IOException {
  
  String signedRequest = (String) request.getParameter("signed_request");
  FacebookSignedRequest facebookSR = null;
  try {
    facebookSR = FacebookSignedRequest.getSignedRequest(signedRequest);
  } catch (Exception e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
  }
  String oauthToken = facebookSR.getOauth_token();
  PrintWriter writer = response.getWriter();
  if(oauthToken == null) {
    
    response.setContentType("text/html");
    String authURL = "https://www.facebook.com/dialog/oauth?client_id="
      + Constants.API_KEY + 
      "&redirect_uri=https://apps.facebook.com/myoldfriends/&scope=";
    writer.print("<script> top.location.href='"  + authURL + "'</script>");
    writer.close();

  }
  else {
    
    FacebookClient facebookClient = new DefaultFacebookClient(oauthToken);
    Connection<User> myFriends = facebookClient.fetchConnection("me/friends", 
                                                User.class);
    writer.print("<table><tr><th>Photo</th><th>Name</th><th>Id</th></tr>");
    for (List<User> myFriendsList : myFriends) {

      for(User user: myFriendsList)
        writer.print("<tr><td><img src=\"https://graph.facebook.com/" + 
                 user.getId() + "/picture\"/></td><td>" + user.getName() +
                 "</td><td>" + user.getId() + "</td></tr>");

    }
    writer.print("</table>");
    writer.close();
    
  }

}

Instalando o aplicativo

Após o servlet ser criado, o aplicativo está pronto para ser instalado. Clique no ícone do Google no Eclipse e selecione Deploy to App Engine. Depois de o aplicativo ter sido compilado e transferido por upload para o servidor, você (e qualquer outro usuário do Facebook) pode instalar o aplicativo no Facebook em http://apps.facebook.com/APP ID/ e ver os resultados.


Conclusão

Este artigo demonstrou como registrar, implementar e instalar um aplicativo do Facebook em Java, hospedado no serviço do Google App Engine. Agora que está familiarizado com os conceitos básicos, sugiro que experimente algumas variações.

Em vez de criar o HTML para o conteúdo diretamente na página, é possível implementar uma abordagem Model-View-Controller (MVC) mais tradicional utilizando a chamada RequestDispatcher.forward() padrão em uma página JavaServer Pages (JSP).

É possível criar um aplicativo que utilize algumas das permissões extra com os dados fornecidos pela Graph API. A lista de permissões que um aplicativo precisa é passada para a URL de autenticação incluindo cada uma ao parâmetro de solicitação scope . O RestFB fornece um método auxiliar — StringUtils.join() — para criar a lista de forma correta. É necessária uma única matriz String como um parâmetro; cada entrada da matriz é um nome de permissão.

Finalmente, é possível recriar o aplicativo de amostra utilizando o projeto Facebook-java-api Google Code — uma implementação alternativa da API do Facebook — em vez de RestFB (consulte Recursos).


Download

DescriçãoNomeTamanho
Sample code for this articlej-fb-gaecode.zip5KB

Recursos

Aprender

Obter produtos e tecnologias

Discutir

Comentários

developerWorks: Conecte-se

Los campos obligatorios están marcados con un asterisco (*).


Precisa de um ID IBM?
Esqueceu seu ID IBM?


Esqueceu sua senha?
Alterar sua senha

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


A primeira vez que você entrar no developerWorks, um perfil é criado para você. Informações no seu perfil (seu nome, país / região, e nome da empresa) é apresentado ao público e vai acompanhar qualquer conteúdo que você postar, a menos que você opte por esconder o nome da empresa. Você pode atualizar sua conta IBM a qualquer momento.

Todas as informações enviadas são seguras.

Elija su nombre para mostrar



Ao se conectar ao developerWorks pela primeira vez, é criado um perfil para você e é necessário selecionar um nome de exibição. O nome de exibição acompanhará o conteúdo que você postar no developerWorks.

Escolha um nome de exibição de 3 - 31 caracteres. Seu nome de exibição deve ser exclusivo na comunidade do developerWorks e não deve ser o seu endereço de email por motivo de privacidade.

Los campos obligatorios están marcados con un asterisco (*).

(Escolha um nome de exibição de 3 - 31 caracteres.)

Ao clicar em Enviar, você concorda com os termos e condições do developerWorks.

 


Todas as informações enviadas são seguras.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=80
Zone=Tecnologia Java
ArticleID=823942
ArticleTitle=Aplicativos Java para Facebook no Google App Engine
publish-date=07062012