Freigeben über


Verwenden von REST-APIs von einem Back-End aus

 

Veröffentlicht: Februar 2016

Wie in erläutert Registrierungsverwaltung, in der Regel das Back-End-Anwendung Benachrichtigungen versendet und möglicherweise die registrierungsverwaltung. Da bereits ein REST-Wrapper für Node.js in Azure SDK für Knoten vorhanden ist, wird in diesem Abschnitt Beispiele in Java.

Senden von Benachrichtigungen

Die REST-API zum Senden von Benachrichtigungen ist eine einfache POST-Anweisung für /IhrHub/Nachrichten mit besonderen Headern. Wenn Benachrichtigungen in einem systemeigenen Plattformformat gesendet werden, ist der Nachrichtentext der zu sendende plattformspezifische Nachrichtentext. Die zusätzlichen Header lauten folgendermaßen:

  • ServiceBusNotification-Format: Gibt an, dass die Plattform (wenn eine systemeigene Benachrichtigung gesendet wird) oder "Vorlage" eine Vorlagenbenachrichtigung senden soll.

  • ServiceBusNotification-Tags (optional): Gibt das Tag (oder den Tagausdruck) an, das die Zielsammlung der Registrierungen definiert. Wenn dieser Header nicht vorhanden ist, nimmt der Benachrichtigungshub eine Broadcastübertragung an alle Registrierungen vor.

Andere Header werden unterstützt, plattformspezifische Funktionen gemäß der REST-APIs für Benachrichtigungshubs Dokumentation.

Der folgende Java-Code sendet eine systemeigene Benachrichtigung an Windows Store-Apps (mithilfe des Apache-HttpClients):

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(); } }  

Der folgende Code sendet auf ähnliche Weise eine Vorlagenbenachrichtigung:

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; }  

Weitere Informationen über Senden von Benachrichtigungen an andere Plattformen finden Sie unter REST-APIs für Benachrichtigungshubs.

Erstellen und Aktualisieren von Registrierungen

Für das Erstellen und Aktualisieren von Registrierungen ist eine Serialisierung und Deserialisierung des Registrierungs-XML-Formats erforderlich. Die Erstellen einer Registrierung API-Thema wird die XML-Formate zum Erstellen verschiedener Registrierungstypen (systemeigene und vorlagenregistrierungen für jede Plattform).

Wichtig

Die XML-Elemente müssen genau die gezeigte Reihenfolge aufweisen.

Im folgenden finden Sie ein Beispiel zum Erstellen einer Registrierungs in Java erstellen die Registrierung XML-Nutzlast mithilfe einfache zeichenfolgenverkettungen und Apache Digester zum Analysieren des Ergebnisses. Wie bereits zuvor angemerkt, funktioniert jeder XML-Serialisierungs- oder -Deserialisierungsansatz.

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(); } }  

Die getXml() Methode für systemeigene Windows-Registrierungen lautet wie folgt:

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(); }

Sie können die Methoden für andere Registrierungstypen auf einfache Weise aus den Beispielen in Ableiten der Erstellen einer Registrierung API-Thema.

Die Antwort enthält das Ergebnis der Erstellung einschließlich schreibgeschützter Eigenschaften wie z. B. RegistrationId, ETag, und ExpirationTime. Das folgende Codebeispiel analysiert das Ergebnis mithilfe 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); }  

Beachten Sie, dass die Create aufrufen, gibt ein registrationId, das verwendet wird, abrufen, aktualisieren und Löschen der Registrierung.

Hinweis

Der vorhergehende Codeausschnitt wird vorausgesetzt, dass eine Unterklasse von Registration namens WindowsRegistrationDescription.

Können Sie eine Registrierung aktualisieren, indem Sie Ausgeben einer PUT Aufrufen /yourhub/Registrations / {RegistrationId}. Die If-Match Header wird zum Bereitstellen einer ETag (unterstützt durch vollständige Parallelität) oder einfach als "*" immer überschrieben. Wenn die If-Match Header nicht vorhanden ist, wird der Vorgang führt einen "Upsert" (immer überschreiben die aktuelle Registrierung, oder erstellen eine der bereitgestellten RegistrationId wenn er nicht vorhanden ist). Beispiel:

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(); } }  

Registrierung löschen wird ein ähnlicher Vorgang.

Abrufen von Registrierungen

Wenn Sie eine Registrierung abrufen möchten, geben Sie einen GET-Aufruf auf die /registrations/{registrationId}. Sie rufen eine Auflistung von Registrierungen wie in den folgenden REST-APIs angegeben ab:

Sie haben dann die Möglichkeit, geben Sie einen $top zurückgegebenen Parameter, der die Anzahl der Registrierungen beschränkt. Wenn weitere Registrierungen für diese Abfrage vorhanden sind, wird eine X-MS-ContinuationToken Header zurückgegeben wird, können Sie an nachfolgende Aufrufe, um den Vorgang fortzusetzen, Abrufen der verbleibenden Registrierungen erfolgreich sein. Beachten Sie außerdem, dass das Format des Nachrichtentexts nun ein XML-Atom-Feed ist, wie in den zuvor erwähnten API-Themen gezeigt.

Der folgende Java-Code ruft alle Registrierungen mit einem Tag ab:

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(); } }  

In diesem Code wird eine CollectionResult umfasst eine Reihe von Registrierungen zusammen mit einem optionalen Fortsetzungstoken.

Der folgende code verwendet 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); }