Introdução às solicitações HTTP de conexões híbridas de retransmissão em Java
Neste início rápido, você cria aplicativos de remetente e recetor Java que enviam e recebem mensagens usando o protocolo HTTP. Os aplicativos usam o recurso Conexões Híbridas do Azure Relay. Para saber mais sobre o Azure Relay em geral, consulte Azure Relay.
Neste guia de início rápido, você executa as seguintes etapas:
- Crie um espaço de nomes de Reencaminhamento com o Portal do Azure.
- Crie uma ligação híbrida nesse espaço de nomes, com o portal do Azure.
- Escrever uma aplicação de consola (serviço de escuta) de servidor para receber mensagens.
- Escrever uma aplicação de consola (remetente) de cliente para enviar mensagens.
- Execute aplicativos.
Pré-requisitos
- Java. Verifique se você está executando o JDK 1.8+
- Maven. Certifique-se de ter o Maven instalado
- SDK do Azure Relay. Revise o Java SDK
- Uma subscrição do Azure. Se não tiver uma, crie uma conta gratuita antes de começar.
Criar um espaço de nomes com o Portal do Azure
Inicie sessão no portal do Azure.
Selecione Todos os serviços no menu à esquerda. Selecione Integração, procure Relés, mova o rato sobre Relés e, em seguida, selecione Criar.
Na página Criar namespace, siga estas etapas:
Escolha uma assinatura do Azure na qual criar o namespace.
Para Grupo de recursos, escolha um grupo de recursos existente no qual colocar o namespace ou crie um novo.
Insira um nome para o namespace Relay.
Selecione a região na qual seu namespace deve ser hospedado.
Selecione Rever + criar na parte inferior da página.
Na página Rever + criar, selecione Criar.
Depois de alguns minutos, você verá a página Retransmissão para o namespace.
Obter credenciais de gestão
Na página Retransmissão, selecione Políticas de acesso compartilhado no menu à esquerda. `
Na página Políticas de acesso compartilhado, selecione RootManageSharedAccessKey.
Em Política SAS: RootManageSharedAccessKey, selecione o botão Copiar ao lado de Cadeia de Conexão Primária. Esta ação copia a cadeia de conexão para a área de transferência para uso posterior. Cole este valor no Bloco de Notas ou noutra localização temporária.
Repita o passo anterior para copiar e colar o valor da Chave primária para uma localização temporária para utilizar mais tarde.
Criar uma ligação híbrida com o Portal do Azure
Na página Retransmissão para seu namespace, siga estas etapas para criar uma conexão híbrida.
No menu à esquerda, em Entidades, selecione Conexões híbridas e, em seguida, selecione + Conexão híbrida.
Na página Criar Conexão Híbrida, insira um nome para a conexão híbrida e selecione Criar.
Criar uma aplicação de servidor (serviço de escuta)
Para ouvir e receber mensagens do Relay, escreva um aplicativo de console Java.
Criar uma aplicação Java
Se você desativou a opção "Requer autorização do cliente" ao criar a retransmissão, poderá enviar solicitações para a URL de conexões híbridas com qualquer navegador. Para aceder a pontos finais protegidos, tem de criar e transmitir um token no cabeçalho ServiceBusAuthorization
, mostrado aqui.
Aqui está uma estrutura de projeto Maven simples e uma classe Java que demonstra o envio de solicitações para uma URL de Conexões Híbridas com autorização de cliente utilizando a biblioteca de Retransmissão do Azure.
Adicionar o pacote Relay
Modifique seu arquivo pom.xml em seu pacote de aplicativo maven para incluir o pacote Azure Relay.
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-relay</artifactId>
<version>0.0.6</version>
</dependency>
Execute mvn dependency:copy-dependencies -DoutputDirectory=lib
em seu projeto mvn para adicionar o arquivo jar de dependência no diretório lib do seu projeto. Ele importa todas as dependências do azure-relay
pacote mvn. Este pacote fornece funções para construir URIs (uniform resource identifiers) e tokens de retransmissão.
Escrever alguns códigos para enviar mensagens
Adicione os arquivos jar de dependência ao ClassPath do seu
Listener.java
arquivo.javac -cp lib/* src/main/java/com/example/listener/Listener.Java
Importe as dependências para sua
Listener.java
classe.import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URI; import java.net.URISyntaxException; import java.util.Scanner; import com.microsoft.azure.relay.HybridConnectionListener; import com.microsoft.azure.relay.RelayConnectionStringBuilder; import com.microsoft.azure.relay.RelayedHttpListenerResponse; import com.microsoft.azure.relay.TokenProvider;
Adicione o seguinte
constants
à parte superior doListener.java
arquivo a umacreateConnectionString
função java para obter os detalhes da conexão híbrida.public static String createConnectionString(){ StringBuilder connectionString = new StringBuilder(); connectionString.append("Endpoint=sb://"); connectionString.append("{namespace}"); connectionString.append(".servicebus.windows.net/;SharedAccessKeyName="); connectionString.append("{keyrule}"); connectionString.append(";SharedAccessKey="); connectionString.append("{key}"); connectionString.append(";EntityPath="); connectionString.append("{path}"); return connectionString.toString(); }
Substitua os marcadores de posição entre parênteses retos pelos valores obtidos quando criou a ligação híbrida.
namespace
- O espaço de nomes do Reencaminhamento. Certifique-se de que utiliza o nome de espaço de nomes totalmente qualificado, por exemplo,{namespace}.servicebus.windows.net
.path
- O nome da ligação híbrida.keyrule
- Nome da sua chave de Políticas de Acesso Compartilhado, que éRootManageSharedAccessKey
por padrão.nst key
- A chave primária do namespace que você salvou anteriormente.
Adicione o seguinte código ao ficheiro
Listener.java
. A função principal deve se parecer com o seguinte código:public static void main( String[] args ) throws URISyntaxException { String CONNECTION_STRING_ENV_VARIABLE_NAME = createConnectionString(); RelayConnectionStringBuilder connectionParams = new RelayConnectionStringBuilder(CONNECTION_STRING_ENV_VARIABLE_NAME); TokenProvider tokenProvider = TokenProvider.createSharedAccessSignatureTokenProvider( connectionParams.getSharedAccessKeyName(), connectionParams.getSharedAccessKey()); HybridConnectionListener listener = new HybridConnectionListener(new URI(connectionParams.getEndpoint().toString() + connectionParams.getEntityPath()), tokenProvider); // The "context" object encapsulates both the incoming request and the outgoing response listener.setRequestHandler((context) -> { String receivedText = ""; if (context.getRequest().getInputStream() != null) { try (BufferedReader reader = new BufferedReader(new InputStreamReader(context.getRequest().getInputStream(), "UTF8"))) { StringBuilder builder = new StringBuilder(); String inputLine; while ((inputLine = reader.readLine()) != null) { builder.append(inputLine); } receivedText = builder.toString(); } catch (IOException e) { System.out.println(e.getMessage()); } } System.out.println("requestHandler received " + receivedText); RelayedHttpListenerResponse response = context.getResponse(); response.setStatusCode(202); response.setStatusDescription("OK"); try { response.getOutputStream().write(("Echo: " + receivedText).getBytes()); } catch (IOException e) { e.printStackTrace(); } // The context MUST be closed for the message to be sent response.close(); }); listener.openAsync().join(); Scanner in = new Scanner(System.in); System.out.println("Press ENTER to terminate this program."); in.nextLine(); listener.close(); in.close(); }
Eis o aspeto que o seu
Listener.java
ficheiro deve ter:package com.example.listener; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.URI; import java.net.URISyntaxException; import java.util.Scanner; import com.microsoft.azure.relay.HybridConnectionListener; import com.microsoft.azure.relay.RelayConnectionStringBuilder; import com.microsoft.azure.relay.RelayedHttpListenerResponse; import com.microsoft.azure.relay.TokenProvider; public class Listener { public static String createConnectionString(){ StringBuilder connectionString = new StringBuilder(); connectionString.append("Endpoint=sb://"); connectionString.append("{namespace}"); connectionString.append(".servicebus.windows.net/;SharedAccessKeyName="); connectionString.append("{keyrule}"); connectionString.append(";SharedAccessKey="); connectionString.append("{key}"); connectionString.append(";EntityPath="); connectionString.append("{path}"); return connectionString.toString(); } public static void main( String[] args ) throws URISyntaxException { String CONNECTION_STRING_ENV_VARIABLE_NAME = createConnectionString(); RelayConnectionStringBuilder connectionParams = new RelayConnectionStringBuilder(CONNECTION_STRING_ENV_VARIABLE_NAME); TokenProvider tokenProvider = TokenProvider.createSharedAccessSignatureTokenProvider( connectionParams.getSharedAccessKeyName(), connectionParams.getSharedAccessKey()); HybridConnectionListener listener = new HybridConnectionListener(new URI(connectionParams.getEndpoint().toString() + connectionParams.getEntityPath()), tokenProvider); // The "context" object encapsulates both the incoming request and the outgoing response listener.setRequestHandler((context) -> { String receivedText = ""; if (context.getRequest().getInputStream() != null) { try (BufferedReader reader = new BufferedReader(new InputStreamReader(context.getRequest().getInputStream(), "UTF8"))) { StringBuilder builder = new StringBuilder(); String inputLine; while ((inputLine = reader.readLine()) != null) { builder.append(inputLine); } receivedText = builder.toString(); } catch (IOException e) { System.out.println(e.getMessage()); } } System.out.println("requestHandler received " + receivedText); RelayedHttpListenerResponse response = context.getResponse(); response.setStatusCode(202); response.setStatusDescription("OK"); try { response.getOutputStream().write(("Echo: " + receivedText).getBytes()); } catch (IOException e) { e.printStackTrace(); } // The context MUST be closed for the message to be sent response.close(); }); listener.openAsync().join(); Scanner in = new Scanner(System.in); System.out.println("Press ENTER to terminate this program."); in.nextLine(); listener.close(); in.close(); } }
Criar uma aplicação cliente (remetente)
Para enviar mensagens para o Relay, você pode usar qualquer cliente HTTP ou escrever um aplicativo de console Java.
Criar uma aplicação Java
Se você desativou a opção "Requer autorização do cliente" ao criar a retransmissão, poderá enviar solicitações para a URL de conexões híbridas com qualquer navegador. Para aceder a pontos finais protegidos, tem de criar e transmitir um token no cabeçalho ServiceBusAuthorization
, mostrado aqui.
Aqui está uma estrutura de projeto Maven simples e uma classe Java que demonstra o envio de solicitações para uma URL de Conexões Híbridas com autorização de cliente utilizando a biblioteca de Retransmissão do Azure.
Adicionar o pacote Relay
Modifique seu arquivo pom.xml em seu pacote de aplicativo maven para incluir o pacote Azure Relay.
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-relay</artifactId>
<version>0.0.6</version>
</dependency>
Execute mvn dependency:copy-dependencies -DoutputDirectory=lib
em seu projeto mvn para adicionar o arquivo jar de dependência no diretório lib do seu projeto. Ele também importa todas as dependências do azure-relay
pacote mvn. Este pacote fornece funções para construir URIs (uniform resource identifiers) e tokens de retransmissão.
Escrever alguns códigos para enviar mensagens
Adicione os arquivos jar de dependência ao ClassPath do seu
Sender.java
arquivo.javac -cp lib/* src/main/java/com/example/sender/Sender.Java
Importe as dependências para sua
Sender.java
classe.import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.time.Duration; import java.util.Scanner; import com.microsoft.azure.relay.RelayConnectionStringBuilder; import com.microsoft.azure.relay.TokenProvider;
Adicione o seguinte
constants
à parte superior doSender.java
arquivo a umacreateConnectionString
função java para obter os detalhes da conexão híbrida.public static String createConnectionString(){ StringBuilder connectionString = new StringBuilder(); connectionString.append("Endpoint=sb://"); connectionString.append("{namespace}"); connectionString.append(".servicebus.windows.net/;SharedAccessKeyName="); connectionString.append("{keyrule}"); connectionString.append(";SharedAccessKey="); connectionString.append("{key}"); connectionString.append(";EntityPath="); connectionString.append("{path}"); return connectionString.toString(); }
Substitua os marcadores de posição entre parênteses retos pelos valores obtidos quando criou a ligação híbrida.
namespace
- O espaço de nomes do Reencaminhamento. Certifique-se de que utiliza o nome de espaço de nomes totalmente qualificado, por exemplo,{namespace}.servicebus.windows.net
.path
- O nome da ligação híbrida.keyrule
- Nome da sua chave de Políticas de Acesso Compartilhado, que éRootManageSharedAccessKey
por padrão.nst key
- A chave primária do namespace que você salvou anteriormente.
Adicione o seguinte código ao ficheiro
Sender.java
. A função principal deve se parecer com o código a seguir.public static void main(String[] args) throws IOException { String CONNECTION_STRING_ENV_VARIABLE_NAME = createConnectionString(); if (CONNECTION_STRING_ENV_VARIABLE_NAME == null || CONNECTION_STRING_ENV_VARIABLE_NAME.isEmpty()){ System.err.println("Connection string is null or empty. Please check your createConnectionString method."); return; } RelayConnectionStringBuilder connectionParams = new RelayConnectionStringBuilder(CONNECTION_STRING_ENV_VARIABLE_NAME); TokenProvider tokenProvider = TokenProvider.createSharedAccessSignatureTokenProvider( connectionParams.getSharedAccessKeyName(), connectionParams.getSharedAccessKey()); URL url = buildHttpConnectionURL(connectionParams.getEndpoint().toString(), connectionParams.getEntityPath()); String tokenString = tokenProvider.getTokenAsync(url.toString(), Duration.ofHours(1)).join().getToken(); Scanner in = new Scanner(System.in); while (true) { System.out.println("Press ENTER to terminate this program."); String message = in.nextLine(); int value = System.in.read(); if (value == '\n' || value == '\r') { System.out.println("Terminating the program..."); break;} // Starting a HTTP connection to the listener HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // Sending an HTTP request to the listener // To send a message body, use POST conn.setRequestMethod((message == null || message.length() == 0) ? "GET" : "POST"); conn.setRequestProperty("ServiceBusAuthorization", tokenString); conn.setDoOutput(true); OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream()); out.write(message, 0, message.length()); out.flush(); out.close(); // Reading the HTTP response String inputLine; BufferedReader reader = null; StringBuilder responseBuilder = new StringBuilder(); try { InputStream inputStream = conn.getInputStream(); reader = new BufferedReader(new InputStreamReader(inputStream)); System.out.println("status code: " + conn.getResponseCode()); while ((inputLine = reader.readLine()) != null) { responseBuilder.append(inputLine); } System.out.println("received back " + responseBuilder.toString()); } catch (IOException e) { System.out.println("The listener is offline or could not be reached."); break; } finally { if (reader != null) { reader.close(); } } } in.close(); } static URL buildHttpConnectionURL(String endpoint, String entity) throws MalformedURLException { StringBuilder urlBuilder = new StringBuilder(endpoint + entity); // For HTTP connections, the scheme must be https:// int schemeIndex = urlBuilder.indexOf("://"); if (schemeIndex < 0) { throw new IllegalArgumentException("Invalid scheme from the given endpoint."); } urlBuilder.replace(0, schemeIndex, "https"); return new URL(urlBuilder.toString()); }
Eis o aspeto que o seu
Sender.java
ficheiro deve ter:package com.example.sender; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.time.Duration; import java.util.Scanner; import com.microsoft.azure.relay.RelayConnectionStringBuilder; import com.microsoft.azure.relay.TokenProvider; public class Sender { public static String createConnectionString(){ StringBuilder connectionString = new StringBuilder(); connectionString.append("Endpoint=sb://"); connectionString.append("{namespace}"); connectionString.append(".servicebus.windows.net/;SharedAccessKeyName="); connectionString.append("{keyrule}"); connectionString.append(";SharedAccessKey="); connectionString.append("{key}"); connectionString.append(";EntityPath="); connectionString.append("{path}"); return connectionString.toString(); } public static void main(String[] args) throws IOException { String CONNECTION_STRING_ENV_VARIABLE_NAME = createConnectionString(); if (CONNECTION_STRING_ENV_VARIABLE_NAME == null || CONNECTION_STRING_ENV_VARIABLE_NAME.isEmpty()){ System.err.println("Connection string is null or empty. Please check your createConnectionString method."); return; } RelayConnectionStringBuilder connectionParams = new RelayConnectionStringBuilder(CONNECTION_STRING_ENV_VARIABLE_NAME); TokenProvider tokenProvider = TokenProvider.createSharedAccessSignatureTokenProvider( connectionParams.getSharedAccessKeyName(), connectionParams.getSharedAccessKey()); URL url = buildHttpConnectionURL(connectionParams.getEndpoint().toString(), connectionParams.getEntityPath()); String tokenString = tokenProvider.getTokenAsync(url.toString(), Duration.ofHours(1)).join().getToken(); Scanner in = new Scanner(System.in); while (true) { System.out.println("Press ENTER to terminate this program."); String message = in.nextLine(); int value = System.in.read(); if (value == '\n' || value == '\r') { System.out.println("Terminating the program..."); break;} // Starting a HTTP connection to the listener HttpURLConnection conn = (HttpURLConnection) url.openConnection(); // Sending an HTTP request to the listener // To send a message body, use POST conn.setRequestMethod((message == null || message.length() == 0) ? "GET" : "POST"); conn.setRequestProperty("ServiceBusAuthorization", tokenString); conn.setDoOutput(true); OutputStreamWriter out = new OutputStreamWriter(conn.getOutputStream()); out.write(message, 0, message.length()); out.flush(); out.close(); // Reading the HTTP response String inputLine; BufferedReader reader = null; StringBuilder responseBuilder = new StringBuilder(); try { InputStream inputStream = conn.getInputStream(); reader = new BufferedReader(new InputStreamReader(inputStream)); System.out.println("status code: " + conn.getResponseCode()); while ((inputLine = reader.readLine()) != null) { responseBuilder.append(inputLine); } System.out.println("received back " + responseBuilder.toString()); } catch (IOException e) { System.out.println("The listener is offline or could not be reached."); break; } finally { if (reader != null) { reader.close(); } } } in.close(); } static URL buildHttpConnectionURL(String endpoint, String entity) throws MalformedURLException { StringBuilder urlBuilder = new StringBuilder(endpoint + entity); // For HTTP connections, the scheme must be https:// int schemeIndex = urlBuilder.indexOf("://"); if (schemeIndex < 0) { throw new IllegalArgumentException("Invalid scheme from the given endpoint."); } urlBuilder.replace(0, schemeIndex, "https"); return new URL(urlBuilder.toString()); } }
Nota
O código de exemplo neste artigo usa uma cadeia de conexão para autenticar em um namespace do Azure Relay para manter o tutorial simples. Recomendamos que você use a autenticação do Microsoft Entra ID em ambientes de produção, em vez de usar cadeias de conexão ou assinaturas de acesso compartilhado, que podem ser mais facilmente comprometidas. Para obter informações detalhadas e código de exemplo para usar a autenticação do Microsoft Entra ID, consulte Autenticar e autorizar um aplicativo com o Microsoft Entra ID para acessar entidades do Azure Relay e Autenticar uma identidade gerenciada com o Microsoft Entra ID para acessar os recursos do Azure Relay.
Executar as aplicações
- Execute o aplicativo do servidor: a partir de um prompt de comando Java ou tipo
java -cp <jar_dependency_path> com.example.listener.Listener.java
de aplicativo . - Execute o aplicativo cliente: a partir de um prompt de comando Java ou tipo
java -cp <jar_dependency_path> com.example.sender.Sender.java
de aplicativo , e insira algum texto. - Certifique-se de que a consola da aplicação de servidor produz o texto que foi introduzido na aplicação cliente.
Parabéns, você criou um aplicativo Hybrid Connections de ponta a ponta usando Java!
Próximos passos
Neste início rápido, você criou aplicativos de cliente e servidor Java que usavam HTTP para enviar e receber mensagens. O recurso Conexões Híbridas do Azure Relay também dá suporte ao uso de WebSockets para enviar e receber mensagens. Para saber como usar WebSockets com Conexões Híbridas de Retransmissão do Azure, consulte o Guia de início rápido de WebSockets.
Neste início rápido, você usou Java para criar aplicativos cliente e servidor. Para saber como escrever aplicativos cliente e servidor usando o .NET Framework, consulte o início rápido do .NET WebSockets ou o início rápido do HTTP do .NET.