Acabamos de lançar o Couchbase Mobile 1.1 e, com essa nova versão, há muitos novos recursos. Nesta postagem do blog, daremos uma olhada nos webhooks do Sync Gateway e pensaremos em alguns exemplos concretos para usá-los.
Webhooks
Antes da versão 1.1, a única maneira de adicionar lógica personalizada na forma de plug-ins ao Sync Gateway era ouvir o feed de alterações. Embora essa abordagem ainda funcione, ela não é a mais fácil de configurar. Com os webhooks, você pode simplesmente fornecer uma função de filtro e o URL para publicar o evento. Em seguida, você trata o evento com a função linguagem de back-end de sua escolha (NodeJS, Java, Go, Ruby...).
Os webhooks podem ser usados para muitos casos de uso diferentes:
- MensagensNotificações direcionadas para informar os usuários sobre eventos importantes.
- Programação: inicia grandes tarefas que podem estar sendo executadas em um web worker.
- Lógica personalizadaSync Function: amplie os recursos da Sync Function usando um webhook para executar tarefas adicionais no documento.
Na seção a seguir, você se concentrará na criação do recurso de notificação por push de um aplicativo de notícias para informar os usuários quando novos artigos que correspondem aos tópicos de interesse deles forem publicados. Este tutorial foi extraído da seção Couchbase por exemplo repositório.
Considerações sobre a arquitetura
A notificação por push é uma indicação visual para que o usuário saiba que há um novo conteúdo disponível, mas também pode ser para que o próprio aplicativo extraia os novos artigos do servidor:
O motivo pelo qual estamos usando a Web Push API em vez de uma replicação pull contínua com o Sync Gateway para verificar se há novos artigos é que ela pode funcionar mesmo quando o navegador está fechado. Em comparação com um soquete da Web ou polling longo, que só será mantido ativo enquanto o navegador e a página da Web forem mantidos abertos.
Cenários
Há diferentes cenários para o envio de uma notificação por push:
- Mensagens de grupoEsse conceito foi introduzido no GCM para enviar notificações a até 20 dispositivos simultaneamente. Ele é muito adequado para enviar notificações a todos os dispositivos que pertencem a um único usuário.
- Para cima e para baixoPor exemplo, um usuário atualizou um documento e outros usuários devem ser notificados sobre isso por meio de uma notificação por push.
Modelo de dados
Vamos começar com o menor documento, um documento de perfil que contém tokens de registro dos dispositivos e tópicos de interesse do usuário:
1 2 3 4 5 6 7 8 9 10 |
{ "tipo": "profile" (perfil), "name" (nome): "Oliver", "assinatura": "livre", // outros valores "expired", "premium" "tópicos": ["g20", "ciência", "nsa", "design"], "registration_ids": ["AP91DIwQ", "AP91W9kX"] } |
E o documento Artigo pode ter as seguintes propriedades:
1 2 3 4 5 6 7 8 9 |
{ "tipo": "artigo", "título": "Ferramentas de design para desenvolvedores", "content" (conteúdo): "...", "tópico": "design" } |
Mensagens de grupo
Imagine um cenário em que um usuário esteja inscrito em uma conta freemium e insira um código de convite para acessar o plano premium por um tempo limitado. Seria bom enviar uma notificação a todos os dispositivos do usuário para buscar o conteúdo adicional.
Breve: Envie uma notificação única para usuários freemium que também tenham um código de convite para desbloquear outros dispositivos.
Faça o download do 1.1 versão do Sync Gateway. Você encontrará o binário do Sync Gateway no diretório caixa e exemplos de arquivos de configuração na pasta exemplos pasta. Copie o exampleconfig.json na raiz do seu projeto:
1 2 3 4 |
cp ~/Downloads/couchbase-sincronização-portal/exemplos/exampleconfig.json /caminho/para/projeto/sincronização-portal-configuração.json |
Adicione três usuários no arquivo de configuração:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
{ "log": ["CRUD", "HTTP+"], "bancos de dados": { "db": { "servidor": "walrus:", "usuários": { "zack": { "senha": "letmein" }, "ali": { "senha": "letmein" }, "adam": { "senha": "letmein" }, "CONVIDADO": {"desativado": verdadeiro} } } } } |
Adicione um web hook com as seguintes propriedades no db objeto:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
"event_handlers": { "document_changed": [ { "handler": "webhook", "url": "http://localhost:8000/invitecode", "filtro": `função(doc) { se (doc.tipo == "profile" (perfil) &lificador;&lificador; doc.código_convite) { retorno verdadeiro; } retorno falso; }` } ] } |
Inicie o Sync Gateway:
1 2 3 4 |
$ ~/Downloads/couchbase-sincronização-portal/caixa/sincronização_portal ./sincronização-portal-configuração.json |
Criar um novo arquivo main.go para lidar com o webhook:
1 2 3 4 5 6 7 8 9 |
func principal() { http.HandleFunc("/invitecode", func(w http.Escritor de respostas, r *http.Solicitação) { registro.Println("ping") }) registro.Fatal(http.Ouvir e servir(":8000", nulo)) } |
Inicie o servidor Go:
1 2 3 4 |
$ ir executar principal.ir |
Usando o curl, faça uma solicitação POST para :4984/db/bulk_doc para salvar 3 documentos de perfil simultaneamente:
1 2 3 4 5 6 |
enrolar -H 'Content-Type: application/json' -vX POST http://localhost:4985/db/_bulk_docs --dados @perfis.json |
OBSERVAÇÃO: Para economizar espaço na linha de comando, a opção -dados especifica que o corpo da solicitação está em profiles.json.
Observe que somente o documento do perfil de Ali é enviado para o ponto de extremidade do webhook:
Na próxima seção, você configurará um segundo web hook para notificar todos os usuários quando um novo artigo que corresponda ao interesse deles for publicado.
Para cima e para baixo
Adicione outra entrada de webhook que filtre apenas documentos do tipo artigo:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
{ "handler": "webhook", "url": "http://localhost:8000/new_article", "filtro": `função(doc) { se (doc.tipo == "artigo") { retorno verdadeiro; } retorno falso; }` } |
Adicione outro manipulador em seu servidor Go:
1 2 3 4 5 6 |
http.HandleFunc("/new_article", func(w http.Escritor de respostas, r *http.Solicitação) { registro.Println("ping") }) |
Verifique se o webhook está funcionando como esperado adicionando um documento de artigo:
1 2 3 4 5 6 |
enrolar -H 'Content-Type: application/json' -vX POST http://localhost:4985/db/_bulk_docs --dados @artigos.json |
OBSERVAÇÃO: O conteúdo de articles.json pode ser encontrado aqui.
Nesse caso, é preciso trabalhar um pouco mais para descobrir qual conjunto de usuários deve ser notificado. Esse é um bom caso de uso para usar uma visualização para indexar os documentos de perfil e emitir o tópico como a chave e as IDs de registro como o valor para cada tópico na matriz de tópicos.
Para registrar uma exibição, podemos usar o PUT do Sync Gateway /_design/ddocname com a definição da visualização no corpo da solicitação:
1 2 3 4 5 6 |
enrolar -H 'Content-Type: application/json' -vX PUT http://localhost:4985/db/_design/extras --dados @visualização.json |
OBSERVAÇÃO: O conteúdo de view.json pode ser encontrado aqui.
Observe que o artigo que postamos acima tem design em seu tópico e o único usuário inscrito nesse tópico é o Adam. Consequentemente, se você consultar essa visualização com a chave "design", apenas um par (chave, valor) deverá retornar com o tópico como chave e os tokens de dispositivo como valor:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
enrolar -H 'Content-Type: application/json' -vX OBTER ':4985/db/_design/extras/_view/user_topics?key="design"' < HTTP/1.1 200 OK < Conteúdo-Comprimento: 95 < Conteúdo-Tipo: aplicativo/json * Servidor Couchbase Sincronização Gateway/1.1.0 é não na lista negra < Servidor: Couchbase Sincronização Gateway/1.1.0 < Data: Quarta, 17 Junho 2015 17:46:35 GMT < * Conexão #0 para o host intacto {"total_rows":1,"rows" (linhas):[{"id":"4caa204e81b118cf23500f320e138aa8","chave":"design","valor":nulo}]} |
Agora, você pode editar o manipulador em main.go para consultar posteriormente o tópicos_do_usuário com a chave sendo o tópico do artigo:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
http.HandleFunc("/new_article", func(w http.Escritor de respostas, r *http.Solicitação) { registro.Println("ping") var dados mapa[string]interface{} corpo, _ := ioutil.LerTudo(r.Corpo) json.Unmarshal(corpo, &lificador;dados) tópico := dados["tópico"].(string) registro.Printf("Consulta de perfis de usuário inscritos no %s", tópico) var stringUrl string = fmt.Sprintf("http://localhost:4985/db/_design/extras/_view/user_topics?key="%s"", tópico) res, erro := http.Obter(stringUrl) se erro != nulo { fmt.Imprimir(erro) retorno } se res != nulo { var resultado mapa[string]interface{} corpo, _ = ioutil.LerTudo(res.Corpo) json.Unmarshal(corpo, &lificador;resultado) registro.Printf("Resultado da consulta user_topics %v", resultado["rows" (linhas)].([]interface {})) } }) |
Executar o bulk_doc novamente e você verá a lista de tokens de dispositivo a serem usados nos registros:
Conclusão
Neste tutorial, você aprendeu a usar Web Hooks no cenário de notificações por push do GCM e usou as visualizações do Couchbase Server para acessar informações adicionais no Webhook Time™ :).
Bom tutorial. Talvez seja hora de atualizar nosso código GCM/APNS
Hi,
Obrigado pela boa documentação.
Existe alguma maneira de obter o anexo por meio de webhook ou implementação de plug-in, já que estamos procurando criar um histórico de revisão do anexo?
Obrigado,
Satinder
Olá, obrigado pelo tutorial. Gostaria de saber como lidar com as exclusões. Já que o syncgateway fornece apenas os atributos id, rev e deleted.
Tenho vários tipos de documentos em um único bucket e estou interessado em sincronizar (ou seja, incluir exclusões) apenas um tipo específico.
Parece que isso deve ser feito na função de sincronização http://developer.couchbase.com.... Sinta-se à vontade para fazer perguntas nos fóruns para entrar em seu caso de uso com um pouco mais de detalhes https://forums.couchbase.com/c…
[...] Webhooks, um novo mecanismo de integração, fornece notificações de alteração para que você possa integrar facilmente o Couchbase Mobile com aplicativos de linha de negócios, serviços de terceiros, etc. Você pode ler mais no blog do Dev Advocate James Nocentini [...]