Dela via


Kom igång med RELAY Hybrid Connections HTTP-begäranden i Java

I den här snabbstarten skapar du Java-avsändare och mottagarprogram som skickar och tar emot meddelanden med hjälp av HTTP-protokollet. Programmen använder funktionen Hybridanslutningar i Azure Relay. Läs mer om Azure Relay i allmänhet i Azure Relay.

I den här snabbstarten gör du följande:

  1. Skapa ett Relay-namnområde med Azure Portal.
  2. Skapa en hybridanslutning i det namnområdet med Azure Portal.
  3. Skriva ett serverkonsolprogram (lyssnare) för att ta emot meddelanden.
  4. Skriva ett klientkonsolprogram (avsändare) för att ta emot meddelanden.
  5. Kör program.

Förutsättningar

Skapa ett namnområde med Azure Portal

  1. Logga in på Azure-portalen.

  2. Välj Alla tjänster på den vänstra menyn. Välj Integrering, sök efter Reläer, flytta musen över Reläer och välj sedan Skapa.

    Skärmbild som visar valet av knappen Reläer –> Skapa.

  3. Följ dessa steg på sidan Skapa namnområde :

    1. Välj en Azure-prenumeration där du vill skapa namnområdet.

    2. För Resursgrupp väljer du en befintlig resursgrupp där du vill placera namnområdet eller skapar en ny.

    3. Ange ett namn för Relay-namnområdet.

    4. Välj den region där ditt namnområde ska finnas.

    5. Välj Granska + skapa längst ned på sidan.

      Skärmbild som visar sidan Skapa namnområde.

    6. På sidan Granska + skapa väljer du Skapa.

    7. Efter några minuter visas sidan Relay för namnområdet.

      Skärmbild som visar startsidan för Relay-namnområdet.

Få autentiseringsuppgifter för hantering

  1. På sidan Relay väljer du Principer för delad åtkomst på den vänstra menyn.

  2. På sidan Principer för delad åtkomst väljer du RootManageSharedAccessKey.

  3. Under SAS-princip: RootManageSharedAccessKey väljer du knappen Kopiera bredvid Primär anslutningssträng. Den här åtgärden kopierar anslutningssträng till Urklipp för senare användning. Klistra in det här värdet i Anteckningar eller på en tillfällig plats.

  4. Upprepa föregående steg för att kopiera och klistra in värdet för primärnyckeln till en tillfällig plats för senare användning.

    Skärmbild som visar anslutningsinformationen för Relay-namnområdet.

Skapa en hybridanslutning med Azure Portal

På sidan Relay för ditt namnområde följer du de här stegen för att skapa en hybridanslutning.

  1. På den vänstra menyn under Entiteter väljer du Hybridanslutningar och sedan + Hybridanslutning.

    Skärmbild som visar sidan Hybridanslutningar.

  2. På sidan Skapa hybridanslutning anger du ett namn för hybridanslutningen och väljer Skapa.

    Skärmbild som visar sidan Skapa hybridanslutning.

Skapa ett serverprogram (lyssnare)

Om du vill lyssna och ta emot meddelanden från Relay skriver du ett Java-konsolprogram.

Skapa ett Java-program

Om du inaktiverade alternativet "Kräver klientauktorisering" när du skapar Relay kan du skicka begäranden till URL:en för hybridanslutningar med valfri webbläsare. För att komma åt skyddade slutpunkter måste du skapa och skicka en token i ServiceBusAuthorization-huvudet, som du ser här.

Här är en enkel Maven-projektstruktur och en Java-klass som visar hur begäranden skickas till en URL för hybridanslutningar med klientauktorisering som använder Azure Relay-biblioteket.

Lägg till Relay-paketet

Ändra din pom.xml-fil i maven-programpaketet så att den innehåller Azure Relay-paketet.

<dependency>
    <groupId>com.microsoft.azure</groupId>
    <artifactId>azure-relay</artifactId>
    <version>0.0.6</version>
</dependency>

Kör mvn dependency:copy-dependencies -DoutputDirectory=lib i ditt mvn-projekt för att lägga till beroende jar-filen i lib-katalogen i projektet. Den importerar alla beroenden för azure-relay mvn-paketet. Det här paketet innehåller funktioner för att konstruera URI:er (Relay Uniform Resource Identifiers) och token.

Skriva kod för att skicka meddelanden

  1. Lägg till jar-filerna för beroenden i ClassPath-filen Listener.java .

    javac -cp lib/* src/main/java/com/example/listener/Listener.Java
    
  2. Importera beroendena till din Listener.java klass.

    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;
    
  3. Lägg till följande constants överst i Listener.java filen i en createConnectionString java-funktion för hybridanslutningsinformationen.

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

    Ersätt platshållarna inom hakparentes med de värden du erhöll när du skapade hybridanslutningen.

    • namespace – Relay-namnområde. Se till att du använder det fullständiga namnområdesnamnet, till exempel {namespace}.servicebus.windows.net.
    • path – Namnet på hybridanslutningen.
    • keyrule – Namnet på nyckeln för principer för delad åtkomst, vilket är RootManageSharedAccessKey som standard.
    • nst key – Primärnyckeln för namnområdet som du sparade tidigare.
  4. Lägg till följande kod i Listener.java-filen: Huvudfunktionen bör se ut som följande kod:

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

    Så här bör filen Listener.java se ut:

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

Skapa ett klientprogram (avsändare)

Om du vill skicka meddelanden till Relay kan du använda valfri HTTP-klient eller skriva ett Java-konsolprogram.

Skapa ett Java-program

Om du inaktiverade alternativet "Kräver klientauktorisering" när du skapar Relay kan du skicka begäranden till URL:en för hybridanslutningar med valfri webbläsare. För att komma åt skyddade slutpunkter måste du skapa och skicka en token i ServiceBusAuthorization-huvudet, som du ser här.

Här är en enkel Maven-projektstruktur och en Java-klass som visar hur begäranden skickas till en URL för hybridanslutningar med klientauktorisering som använder Azure Relay-biblioteket.

Lägg till Relay-paketet

Ändra din pom.xml-fil i maven-programpaketet så att den innehåller Azure Relay-paketet.

<dependency>
	<groupId>com.microsoft.azure</groupId>
	<artifactId>azure-relay</artifactId>
	<version>0.0.6</version>
</dependency>

Kör mvn dependency:copy-dependencies -DoutputDirectory=lib i ditt mvn-projekt för att lägga till beroende jar-filen i lib-katalogen i projektet. Den importerar också alla beroenden för azure-relay mvn-paketet. Det här paketet innehåller funktioner för att konstruera URI:er (Relay Uniform Resource Identifiers) och token.

Skriva kod för att skicka meddelanden

  1. Lägg till jar-filerna för beroenden i ClassPath-filen Sender.java .

    javac -cp lib/* src/main/java/com/example/sender/Sender.Java
    
  2. Importera beroendena till din Sender.java klass.

    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;
    
  3. Lägg till följande constants överst i Sender.java filen i en createConnectionString java-funktion för hybridanslutningsinformationen.

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

    Ersätt platshållarna inom hakparentes med de värden du erhöll när du skapade hybridanslutningen.

    • namespace – Relay-namnområde. Se till att du använder det fullständiga namnområdesnamnet, till exempel {namespace}.servicebus.windows.net.
    • path – Namnet på hybridanslutningen.
    • keyrule – Namnet på nyckeln för principer för delad åtkomst, vilket är RootManageSharedAccessKey som standard.
    • nst key – Primärnyckeln för namnområdet som du sparade tidigare.
  4. Lägg till följande kod i Sender.java-filen: Huvudfunktionen bör se ut som följande kod.

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

    Så här bör filen Sender.java se ut:

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

Kommentar

Exempelkoden i den här artikeln använder en anslutningssträng för att autentisera till ett Azure Relay-namnområde för att hålla självstudien enkel. Vi rekommenderar att du använder Microsoft Entra-ID-autentisering i produktionsmiljöer i stället för att använda anslutningssträng eller signaturer för delad åtkomst, vilket är enklare att kompromettera. Detaljerad information och exempelkod för användning av Microsoft Entra-ID-autentisering finns i Autentisera och auktorisera ett program med Microsoft Entra-ID för åtkomst till Azure Relay-entiteter och Autentisera en hanterad identitet med Microsoft Entra-ID för åtkomst till Azure Relay-resurser.

Kör programmen

  1. Kör serverprogrammet: från en Java-kommandotolk eller programtyp java -cp <jar_dependency_path> com.example.listener.Listener.java.
  2. Kör klientprogrammet: från en Java-kommandotolk eller programtyp java -cp <jar_dependency_path> com.example.sender.Sender.javaoch ange text.
  3. Se till att serverprogramkonsolen matar ut den text som angavs i klientprogrammet.

Grattis, du har skapat ett hybridanslutningsprogram från slutpunkt till slutpunkt med Java!

Nästa steg

I den här snabbstarten skapade du Java-klient- och serverprogram som använde HTTP för att skicka och ta emot meddelanden. Funktionen Hybridanslutningar i Azure Relay stöder också användningen av WebSockets för att skicka och ta emot meddelanden. Läs om hur du använder WebSockets med Azure Relay-hybridanslutningar i WebSockets-snabbstarten.

I den här snabbstarten använde du Java för att skapa klient- och serverprogram. Om du vill läsa om hur du skriver klient- och serverprogram med hjälp av .NET Framework läser du .NET WebSockets-snabbstarten eller .NET HTTP-snabbstarten.