Partilhar via


Usar APIs REST de um back-end

 

Como explicado na gerenciamento de registro, geralmente o back-end do aplicativo envia notificações e pode executar o gerenciamento de registros. Porque já existe um wrapper REST para Node. js no Azure SDK para nó, esta seção mostra exemplos em Java.

Enviar notificações

O API REST para enviar notificações é um POST simples no /yourHub/messages, com cabeçalhos especiais. Ao enviar notificações em um formato nativo da plataforma, o corpo é o corpo específico de plataforma a ser enviado. Os cabeçalhos adicionais são:

  • Formato ServiceBusNotification: Especifica que a plataforma (se enviar uma notificação nativa) ou “modelo” é para enviar uma notificação modelo.

  • ServiceBusNotification-Tags (opcional): Especifica a marca (ou expressão de marca) definindo o conjunto de destino dos registros. Se esse cabeçalho não estiver presente, o hub de notificação transmite para todos os registros.

Outros cabeçalhos são suportados para funcionalidades específicas de plataforma, conforme especificado no APIs REST dos Hubs de Notificação documentação.

O código Java a seguir envia uma notificação nativa aos aplicativos Windows Store (usando o Apache HttpClient):

public Notification createWindowsNotification(String body) { Notification n = new Notification(); n.body = body; n.headers.put("ServiceBusNotification-Format", "windows"); if (body.contains("<toast>")) n.headers.put("X-WNS-Type", "wns/toast"); if (body.contains("<tile>")) n.headers.put("X-WNS-Type", "wns/tile"); if (body.contains("<badge>")) n.headers.put("X-WNS-Type", "wns/badge"); if (body.startsWith("<")) { n.contentType = ContentType.APPLICATION_XML; } return n; } public void sendNotification(Notification notification, String tagExpression) { HttpPost post = null; try { URI uri = new URI(endpoint + hubPath + "/messages"+APIVERSION); post = new HttpPost(uri); post.setHeader("Authorization", generateSasToken(uri)); if (tagExpression != null && !"".equals(tagExpression)) { post.setHeader("ServiceBusNotification-Tags", tagExpression); } for (String header: notification.getHeaders().keySet()) { post.setHeader(header, notification.getHeaders().get(header)); } post.setEntity(new StringEntity(notification.getBody())); HttpResponse response = httpClient.execute(post); if (response.getStatusLine().getStatusCode() != 201) { String msg = ""; if (response.getEntity() != null && response.getEntity().getContent() != null) { msg = IOUtils.toString(response.getEntity().getContent()); } throw new RuntimeException("Error: " + response.getStatusLine() + " body: "+msg); } } catch (Exception e) { throw new RuntimeException(e); } finally { if (post != null) post.releaseConnection(); } }  

Da mesma forma, o código a seguir envia uma notificação padrão:

public Notification createTemplateNotification(Map<String, String> properties) { Notification n = new Notification(); StringBuffer buf = new StringBuffer(); buf.append("{"); for (Iterator<String> iterator = properties.keySet().iterator(); iterator.hasNext();) { String key = iterator.next(); buf.append("\""+ key + "\":\""+properties.get(key)+"\""); if (iterator.hasNext()) buf.append(","); } buf.append("}"); n.body = buf.toString(); n.contentType = ContentType.APPLICATION_JSON; n.headers.put("ServiceBusNotification-Format", "template"); return n; }  

Para obter mais informações sobre enviar notificações para outras plataformas, consulte APIs REST dos Hubs de Notificação.

Criar e atualizar registros

Criar e atualizar registros requer a serialização e a desserialização do formato XML do registro. O Criar registro tópico API mostra os formatos XML para criar diferentes tipos de registros (nativo e modelo para cada plataforma).

Importante

Os elementos XML devem estar na ordem exata exibida.

A seguir está um exemplo de como criar um registro no Java, usando concatenações de cadeia de caracteres simples para criar a carga XML de registro, e Apache Digester para analisar o resultado. Como observado anteriormente, qualquer abordagem de serialização ou de desserialização XML funciona.

public Registration createRegistration(Registration registration) { HttpPost post = null; try { URI uri = new URI(endpoint + hubPath + "/registrations"+APIVERSION); post = new HttpPost(uri); post.setHeader("Authorization", generateSasToken(uri)); StringEntity entity = new StringEntity(registration.getXml(),ContentType.APPLICATION_ATOM_XML); entity.setContentEncoding("utf-8"); post.setEntity(entity); HttpResponse response = httpClient.execute(post); if (response.getStatusLine().getStatusCode() != 200) throw new RuntimeException("Error: " + response.getStatusLine()); return Registration.parse(response.getEntity().getContent()); } catch (Exception e) { throw new RuntimeException(e); } finally { if (post != null) post.releaseConnection(); } }  

O getXml() para registros Windows nativos é como segue:

private static final String WNS_NATIVE_REGISTRATION = "<?xml version=\"1.0\" encoding=\"utf-8\"?><entry xmlns=\"http://www.w3.org/2005/Atom\"><content type=\"application/xml\"><WindowsRegistrationDescription xmlns:i=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns=\"https://schemas.microsoft.com/netservices/2010/10/servicebus/connect\">{0}<ChannelUri>{1}</ChannelUri>
</WindowsRegistrationDescription>
</content>
</entry>"; public String getXml() { String xml = WNS_NATIVE_REGISTRATION.replaceFirst("\\{1\\}", channelUri.toString()); xml = xml.replaceFirst("\\{0\\}", getTagsXml()); return xml.toString(); }

É possível derivar facilmente os métodos para outros tipos de registro de exemplos de Criar registro tópico de API.

A resposta contém o resultado da criação, incluindo propriedades somente leitura, como RegistrationId, ETag, e ExpirationTime. O exemplo de código a seguir analisa o resultado usando Apache Digester:

public static Registration parse(InputStream content) throws IOException, SAXException { Digester digester = new Digester(); digester.addObjectCreate("*/WindowsRegistrationDescription", WindowsRegistration.class); digester.addCallMethod("*/RegistrationId", "setRegistrationId", 1); digester.addCallParam("*/RegistrationId", 0); digester.addCallMethod("*/ETag", "setEtag", 1); digester.addCallParam("*/ETag", 0); digester.addCallMethod("*/ChannelUri", "setChannelUri", 1); digester.addCallParam("*/ChannelUri", 0); digester.addCallMethod("*/Tags", "setTagsFromString", 1); digester.addCallParam("*/Tags", 0); digester.addCallMethod("*/BodyTemplate", "setBodyTemplate", 1); digester.addCallParam("*/BodyTemplate", 0); digester.addCallMethod("*/WnsHeader", "addHeader", 2); digester.addCallParam("*/WnsHeader/Header", 0); digester.addCallParam("*/WnsHeader/Value", 1); return digester.parse(content); }  

Observe que o Create chamar retorna um registrationId, que é usado para recuperar, atualizar ou excluir o registro.

Dica

O trecho anterior presume que existe uma subclasse de Registration chamado WindowsRegistrationDescription.

Você pode atualizar um registro emitindo um colocar ligar /yourhub registros / {registrationId}. O If-Match cabeçalho é usado para fornecer uma ETag (suportando simultaneidade otimista) ou simplesmente um "*" para sempre substituir. Se o If-Match cabeçalho não estiver presente, a operação realiza um "upsert" (sempre substituindo o registro atual ou criando um no fornecidos registrationId se não estiver presente). Por exemplo:

public Registration updateRegistration(Registration registration) { HttpPut put = null; try { URI uri = new URI(endpoint + hubPath + "/registrations/"+registration.getRegistrationId()+APIVERSION); put = new HttpPut(uri); put.setHeader("Authorization", generateSasToken(uri)); put.setHeader("If-Match", registration.getEtag()==null?"*":"W/\""+registration.getEtag()+"\""); put.setEntity(new StringEntity(registration.getXml(),ContentType.APPLICATION_ATOM_XML)); HttpResponse response = httpClient.execute(put); if (response.getStatusLine().getStatusCode() != 200) throw new RuntimeException("Error: " + response.getStatusLine()); return Registration.parse(response.getEntity().getContent()); } catch (Exception e) { throw new RuntimeException(e); } finally { if (put != null) put.releaseConnection(); } }  

Excluir registro é uma operação similar.

Recuperar registros

Ao recuperar um registro, emita uma chamada GET no /registrations/{registrationId}. Recupere uma coleção de registros como especificado nas seguintes APIs REST:

Você tem a opção para especificar um $top parâmetro que limita o número de registros retornados. Se houver mais registros para a consulta, uma X-MS-ContinuationToken cabeçalho for retornado, o que você pode passar para chamadas subsequentes para continuar recuperando os registros restantes. Observe também que o formato do corpo agora é um feed Atom XML, como mostrado nos tópicos de API mencionados anteriormente.

O código Java a seguir recupera todos os registros com uma marca;

private CollectionResult retrieveRegistrationByTag() { String queryUri = endpoint + hubPath + "/tags/"+tag+"/registrations"+APIVERSION; HttpGet get = null; try { URI uri = new URI(queryUri); get = new HttpGet(uri); get.setHeader("Authorization", generateSasToken(uri)); HttpResponse response = httpClient.execute(get); if (response.getStatusLine().getStatusCode() != 200) throw new RuntimeException("Error: " + response.getStatusLine()); CollectionResult result = Registration.parseRegistrations(response.getEntity().getContent()); Header contTokenHeader = response.getFirstHeader("X-MS-ContinuationToken"); if (contTokenHeader !=null) { result.setContinuationToken(contTokenHeader.getValue()); } return result; } catch (Exception e) { throw new RuntimeException(e); } finally { if (get != null) get.releaseConnection(); } }  

Nesse código, uma CollectionResult encapsula um conjunto de registros junto com um token de continuação opcional.

O código a seguir usa Apache Digester:

public static CollectionResult parseRegistrations(InputStream content) throws IOException, SAXException { Digester digester = new Digester(); // add all rules for parsing single registrations digester.addObjectCreate("feed", CollectionResult.class); digester.addSetNext("*/WindowsRegistrationDescription", "addRegistration"); // add rules for other types of registrations (if required) return digester.parse(content); }