Начало работы с HTTP-запросами HTTP гибридных подключений ретранслятора в Java
В этом кратком руководстве вы создадите приложения отправителя и получателя Java, которые отправляют и получают сообщения с помощью протокола HTTP. Приложения используют функцию гибридных подключений службы Azure Relay. См. дополнительные сведения о службе Azure Relay.
При работе с этим кратким руководством вы выполните следующие задачи:
- Создайте пространство имен ретранслятора с помощью портала Azure.
- Создайте гибридное подключение в этом пространстве имен с помощью портала Azure.
- Создайте серверное консольное приложение (прослушиватель) для получения сообщений.
- Создайте клиентское консольное приложение (отправитель) для отправки сообщений.
- Запустите приложения.
Необходимые компоненты
- Java Убедитесь, что вы используете JDK 1.8+
- Maven. Убедитесь, что установлен Maven
- Пакет SDK для Ретранслятора Azure. Проверка пакета SDK для Java
- Подписка Azure. Если у вас еще нет подписки Azure, создайте бесплатную учетную запись, прежде чем начать работу.
Создание пространства имен с помощью портала Azure
Войдите на портал Azure.
В меню слева выберите Все службы. Выберите "Интеграция", найдите ретрансляторы, переместите указатель мыши на ретрансляторы и нажмите кнопку "Создать".
На странице "Создание пространства имен" выполните следующие действия.
Выберите подписку Azure, в которой будет создано пространство имен.
Выберите существующую группу ресурсов, в которую будет размещено это пространство имен, или создайте новую.
Введите имя пространства имен Ретранслятора.
Выберите регион, в котором должно размещаться пространство имен.
В нижней части страницы выберите Review + create (Проверить и создать).
На странице Отзыв и создание выберите Создать.
Через несколько минут вы увидите страницу Ретранслятора для пространства имен.
Получение учетных данных управления
На странице "Ретранслятор" выберите политики общего доступа в меню слева. `
На странице Политики общего доступа щелкните RootManageSharedAccessKey.
В разделе SAS Policy: RootManageSharedAccessKey (Политика SAS: RootManageSharedAccessKey) нажмите кнопку Копировать рядом с элементом Первичная строка подключения. Строка подключения будет скопирована в буфер обмена для дальнейшего использования. Вставьте на время эти значения в Блокноте или любом другом месте.
Повторите предыдущий шаг, скопировав и вставив значение первичного ключа во временное расположение для последующего использования.
Создание гибридного подключения с помощью портала Azure
На странице Ретранслятора для пространства имен выполните следующие действия, чтобы создать гибридное подключение.
В меню слева выберите "Гибридные подключения" и выберите "Гибридные подключения".
На странице "Создание гибридного подключения" введите имя гибридного подключения и нажмите кнопку "Создать".
Создание серверного приложения (прослушивателя)
Чтобы прослушивать и получать сообщения из Ретранслятора, напишите консольное приложение Java.
Создание приложения Java
Если при создании ретранслятора отключен параметр "Требуется авторизация клиента", вы можете отправлять запросы по URL-адресу гибридных подключений с помощью любого браузера. Для доступа к защищенным конечным точкам необходимо создать и передать маркер в заголовок ServiceBusAuthorization
, который приведен ниже.
Ниже приведена простая структура проекта Maven и класс Java, демонстрирующий отправку запросов на URL-адрес гибридных подключений с авторизацией клиента с использованием библиотеки Azure Relay.
Добавление пакета Ретранслятора
Измените файл pom.xml в пакет приложения maven, чтобы включить пакет Azure Relay.
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-relay</artifactId>
<version>0.0.6</version>
</dependency>
Запустите mvn dependency:copy-dependencies -DoutputDirectory=lib
в проекте mvn, чтобы добавить JAR-файл зависимостей в каталог lib проекта. Он импортирует все зависимости azure-relay
пакета mvn. Этот пакет предоставляет функции для создания универсальных идентификаторов ресурсов ретранслятора (URI) и маркеров.
Написание кода для отправки сообщений
Добавьте jar-файлы зависимостей в classPath файла
Listener.java
.javac -cp lib/* src/main/java/com/example/listener/Listener.Java
Импортируйте зависимости в
Listener.java
класс.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;
Добавьте следующий
constants
код в началоListener.java
файла вcreateConnectionString
функцию Java для сведений о гибридном подключении.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(); }
Замените заполнители в скобках значениями, которые получены при создании гибридного подключения.
namespace
— пространство имен ретранслятора. Необходимо использовать полное имя пространства имен, например{namespace}.servicebus.windows.net
.path
— имя гибридного подключения.keyrule
— Имя ключа политики общего доступа, который по умолчанию.RootManageSharedAccessKey
nst key
— первичный ключ пространства имен, сохраненного ранее.
Добавьте в файл
Listener.java
указанный ниже код. Основная функция должна выглядеть следующим образом: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(); }
Вот как должен выглядеть файл
Listener.java
: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(); } }
Создание клиентского приложения (отправителя)
Для отправки сообщений в Ретранслятор можно использовать любой HTTP-клиент или написать консольное приложение Java.
Создание приложения Java
Если при создании ретранслятора отключен параметр "Требуется авторизация клиента", вы можете отправлять запросы по URL-адресу гибридных подключений с помощью любого браузера. Для доступа к защищенным конечным точкам необходимо создать и передать маркер в заголовок ServiceBusAuthorization
, который приведен ниже.
Ниже приведена простая структура проекта Maven и класс Java, демонстрирующий отправку запросов на URL-адрес гибридных подключений с авторизацией клиента с использованием библиотеки Azure Relay.
Добавление пакета Ретранслятора
Измените файл pom.xml в пакет приложения maven, чтобы включить пакет Azure Relay.
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-relay</artifactId>
<version>0.0.6</version>
</dependency>
Запустите mvn dependency:copy-dependencies -DoutputDirectory=lib
в проекте mvn, чтобы добавить JAR-файл зависимостей в каталог lib проекта. Он также импортирует все зависимости azure-relay
пакета mvn. Этот пакет предоставляет функции для создания универсальных идентификаторов ресурсов ретранслятора (URI) и маркеров.
Написание кода для отправки сообщений
Добавьте jar-файлы зависимостей в classPath файла
Sender.java
.javac -cp lib/* src/main/java/com/example/sender/Sender.Java
Импортируйте зависимости в
Sender.java
класс.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;
Добавьте следующий
constants
код в началоSender.java
файла вcreateConnectionString
функцию Java для сведений о гибридном подключении.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(); }
Замените заполнители в скобках значениями, которые получены при создании гибридного подключения.
namespace
— пространство имен ретранслятора. Необходимо использовать полное имя пространства имен, например{namespace}.servicebus.windows.net
.path
— имя гибридного подключения.keyrule
— Имя ключа политики общего доступа, который по умолчанию.RootManageSharedAccessKey
nst key
— первичный ключ пространства имен, сохраненного ранее.
Добавьте в файл
Sender.java
указанный ниже код. Основная функция должна выглядеть следующим образом.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()); }
Вот как должен выглядеть файл
Sender.java
: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()); } }
Примечание.
Пример кода в этой статье использует строка подключения для проверки подлинности в пространстве имен Ретранслятора Azure, чтобы упростить учебник. Мы рекомендуем использовать проверку подлинности Идентификатора Microsoft Entra в рабочих средах, а не использовать строка подключения или подписанные URL-адреса, что может быть проще скомпрометировано. Подробные сведения и пример кода для использования проверки подлинности идентификатора Microsoft Entra см. в статье "Проверка подлинности и авторизация приложения с помощью идентификатора Microsoft Entra ID" для доступа к сущностям Ретрансляции Azure и аутентификации управляемого удостоверения с помощью идентификатора Microsoft Entra для доступа к ресурсам Ретранслятора Azure.
Запуск приложений
- Запустите серверное приложение: из командной строки Java или типа
java -cp <jar_dependency_path> com.example.listener.Listener.java
приложения. - Запустите клиентское приложение: из командной строки Java или типа
java -cp <jar_dependency_path> com.example.sender.Sender.java
приложения и введите текст. - Убедитесь, что серверное консольное приложение выводит текст, введенный в клиентском приложении.
Поздравляем, вы создали комплексное приложение гибридных подключений с помощью Java!
Следующие шаги
В этом кратком руководстве вы создали клиентские и серверные приложения Java, которые использовали HTTP для отправки и получения сообщений. Функция гибридных подключений службы Azure Relay также поддерживает использование протокола WebSocket для отправки и получения сообщений. См. дополнительные сведения об использовании протокола WebSocket с гибридными подключениями Azure Relay.
В этом кратком руководстве вы использовали Java для создания клиентских и серверных приложений. Сведения о том, как создавать клиентские и серверные приложения с помощью .NET Framework, см. в руководствах по использованию .NET и WebSocket или .NET и HTTP.