Mulai menggunakan permintaan HTTP Koneksi Hibrid Relay di Java
Dalam mulai cepat ini, Anda membuat aplikasi pengirim dan penerima Java yang mengirim dan menerima pesan dengan menggunakan protokol HTTP. Aplikasi ini menggunakan fitur Relay Hybrid Connections dari Azure Relay. Untuk mempelajari tentang Azure Relay secara umum, lihat Azure Relay.
Dalam mulai cepat ini, Anda melakukan langkah-langkah berikut:
- Buat namespace Relay dengan menggunakan portal Azure.
- Buat koneksi hibrida di namespace tersebut dengan menggunakan portal Azure.
- Tulis aplikasi konsol server (listener) untuk menerima pesan.
- Tulis aplikasi konsol klien (pengirim) untuk mengirim pesan.
- Jalankan aplikasi.
Prasyarat
- Java. Pastikan Anda menjalankan JDK 1.8+
- Maven. Pastikan Anda telah menginstal Maven
- Azure Relay SDK. Tinjau Java SDK
- Langganan Azure. Jika Anda tidak memilikinya, buat akun gratis sebelum memulai.
Buat kumpulan nama menggunakan portal Microsoft Azure
Masuk ke portal Azure.
Pilih Semua layanan di menu sebelah kiri. Pilih Integrasi, cari Relay, gerakkan mouse di atas Relay, lalu pilih Buat.
Pada halaman Buat namespace layanan, ikuti langkah-langkah berikut:
Pilih langganan Azure untuk membuat namespace.
Untuk Grup sumber daya, pilih grup sumber daya yang ada tempat namespace akan aktif, atau buat grup baru.
Masukkan nama untuk namespace Relay.
Pilih wilayah tempat namespace layanan Anda harus dihosting.
Pilih Tinjau + buat di bagian bawah halaman.
Pada halaman Tinjau + buat, pilih Buat.
Setelah beberapa menit, Anda akan melihat halaman Relay untuk namespace.
Mendapatkan info masuk manajemen
Pada halaman Relay , pilih Kebijakan akses bersama di menu sebelah kiri. `
Pada halaman Kebijakan akses bersama, pilih RootManageSharedAccessKey.
Di bawah Kebijakan SAS: RootManageSharedAccessKey, pilih tombol Salin di sebelah String Koneksi Primer. Tindakan ini menyalin string koneksi ke clipboard untuk digunakan nanti. Tempelkan nilai ini ke Notepad atau beberapa lokasi sementara lainnya.
Ulangi langkah sebelumnya untuk menyalin dan menempelkan nilai Kunci primer ke lokasi sementara untuk digunakan nanti.
Buat koneksi hibrid menggunakan portal Microsoft Azure
Pada halaman Relay untuk namespace Anda, ikuti langkah-langkah ini untuk membuat koneksi hibrid.
Di menu sebelah kiri, Di bawah Entitas, pilih Koneksi Hibrid, lalu pilih + Koneksi Hibrid.
Pada halaman Buat Koneksi Hibrid, masukkan nama untuk koneksi hibrid, dan pilih Buat.
Membuat aplikasi server (pendengar)
Untuk mendengarkan dan menerima pesan dari Relay, tulis aplikasi konsol Java.
Membuat aplikasi Java
Jika Anda menonaktifkan opsi "Memerlukan Otorisasi Klien" saat membuat Relay, Anda dapat mengirim permintaan ke URL Koneksi Hibrid dengan browser apa pun. Untuk mengakses titik akhir yang dilindungi, Anda perlu membuat dan meneruskan token di header ServiceBusAuthorization
, yang ditampilkan di sini.
Berikut adalah struktur proyek Maven sederhana dan kelas Java yang menunjukkan pengiriman permintaan ke URL Koneksi Hibrid dengan otorisasi klien yang menggunakan pustaka Azure Relay.
Menambahkan paket Relay
Ubah file pom.xml Anda dalam paket aplikasi maven Anda untuk menyertakan paket Azure Relay.
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-relay</artifactId>
<version>0.0.6</version>
</dependency>
Jalankan mvn dependency:copy-dependencies -DoutputDirectory=lib
di proyek mvn Anda untuk menambahkan file jar dependensi di direktori lib proyek Anda. Ini mengimpor semua dependensi paket azure-relay
mvn. Paket ini menyediakan fungsi untuk membangun pengidentifikasi sumber daya seragam Relay (URI) dan token.
Menulis kode untuk mengirim pesan
Tambahkan file jar dependensi ke ClassPath file Anda
Listener.java
.javac -cp lib/* src/main/java/com/example/listener/Listener.Java
Impor dependensi ke kelas Anda
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;
Tambahkan yang berikut ini
constants
ke bagianListener.java
atas file kecreateConnectionString
fungsi java untuk detail koneksi hibrid.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(); }
Ganti tempat penampung dalam tanda kurung siku dengan nilai yang Anda peroleh saat membuat koneksi hibrid.
namespace
- Namespace layanan Relay. Pastikan untuk menggunakan nama namespace layanan yang sepenuhnya memenuhi syarat; misalnya,{namespace}.servicebus.windows.net
.path
- Nama koneksi hibrid.keyrule
- Nama kunci Kebijakan Akses Bersama Anda, yang secaraRootManageSharedAccessKey
default.nst key
- Kunci utama namespace layanan yang Anda simpan sebelumnya.
Tambahkan kode berikut ke file
Listener.java
. Fungsi utama akan terlihat seperti kode berikut: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(); }
Berikut tampilan file Anda
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(); } }
Membuat aplikasi klien (pengirim)
Untuk mengirim pesan ke Relay, Anda dapat menggunakan klien HTTP apa pun, atau menulis aplikasi konsol Java.
Membuat aplikasi Java
Jika Anda menonaktifkan opsi "Memerlukan Otorisasi Klien" saat membuat Relay, Anda dapat mengirim permintaan ke URL Koneksi Hibrid dengan browser apa pun. Untuk mengakses titik akhir yang dilindungi, Anda perlu membuat dan meneruskan token di header ServiceBusAuthorization
, yang ditampilkan di sini.
Berikut adalah struktur proyek Maven sederhana dan kelas Java yang menunjukkan pengiriman permintaan ke URL Koneksi Hibrid dengan otorisasi klien yang menggunakan pustaka Azure Relay.
Menambahkan paket Relay
Ubah file pom.xml Anda dalam paket aplikasi maven Anda untuk menyertakan paket Azure Relay.
<dependency>
<groupId>com.microsoft.azure</groupId>
<artifactId>azure-relay</artifactId>
<version>0.0.6</version>
</dependency>
Jalankan mvn dependency:copy-dependencies -DoutputDirectory=lib
di proyek mvn Anda untuk menambahkan file jar dependensi di direktori lib proyek Anda. Ini juga mengimpor semua dependensi paket azure-relay
mvn. Paket ini menyediakan fungsi untuk membangun pengidentifikasi sumber daya seragam Relay (URI) dan token.
Menulis kode untuk mengirim pesan
Tambahkan file jar dependensi ke ClassPath file Anda
Sender.java
.javac -cp lib/* src/main/java/com/example/sender/Sender.Java
Impor dependensi ke kelas Anda
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;
Tambahkan yang berikut ini
constants
ke bagianSender.java
atas file kecreateConnectionString
fungsi java untuk detail koneksi hibrid.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(); }
Ganti tempat penampung dalam tanda kurung siku dengan nilai yang Anda peroleh saat membuat koneksi hibrid.
namespace
- Namespace layanan Relay. Pastikan untuk menggunakan nama namespace layanan yang sepenuhnya memenuhi syarat; misalnya,{namespace}.servicebus.windows.net
.path
- Nama koneksi hibrid.keyrule
- Nama kunci Kebijakan Akses Bersama Anda, yang secaraRootManageSharedAccessKey
default.nst key
- Kunci utama namespace layanan yang Anda simpan sebelumnya.
Tambahkan kode berikut ke file
Sender.java
. Fungsi utama akan terlihat seperti kode berikut.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()); }
Berikut tampilan file Anda
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()); } }
Catatan
Kode sampel dalam artikel ini menggunakan string koneksi untuk mengautentikasi ke namespace Azure Relay agar tutorial tetap sederhana. Kami menyarankan agar Anda menggunakan autentikasi ID Microsoft Entra di lingkungan produksi, daripada menggunakan string koneksi atau tanda tangan akses bersama, yang dapat lebih mudah disusupi. Untuk informasi terperinci dan kode sampel untuk menggunakan autentikasi ID Microsoft Entra, lihat Mengautentikasi dan mengotorisasi aplikasi dengan ID Microsoft Entra untuk mengakses entitas Azure Relay dan Mengautentikasi identitas terkelola dengan ID Microsoft Entra untuk mengakses sumber daya Azure Relay.
Menjalankan aplikasi
- Jalankan aplikasi server: dari perintah Java atau jenis
java -cp <jar_dependency_path> com.example.listener.Listener.java
aplikasi . - Jalankan aplikasi klien: dari perintah Java atau jenis
java -cp <jar_dependency_path> com.example.sender.Sender.java
aplikasi , dan masukkan beberapa teks. - Pastikan bahwa aplikasi konsol server mengeluarkan teks yang dimasukkan dalam aplikasi klien.
Selamat, Anda telah membuat aplikasi Koneksi Hibrid end-to-end menggunakan Java!
Langkah berikutnya
Dalam mulai cepat ini, Anda membuat aplikasi klien dan server Java yang menggunakan HTTP untuk mengirim dan menerima pesan. Fitur Koneksi Hibrid Azure Relay juga mendukung penggunaan WebSocket untuk mengirim dan menerima pesan. Untuk mempelajari cara menggunakan WebSocket dengan Sambungan Hibrid Azure Relay, lihat mulai cepat WebSocket.
Dalam mulai cepat ini, Anda menggunakan Java untuk membuat aplikasi klien dan server. Untuk mempelajari cara menulis aplikasi klien dan server menggunakan .NET Framework, lihat panduan mulai cepat .NET WebSockets atau panduan mulai cepat .NET HTTP.