在適用於 Java 的 Azure SDK 中設定 Proxy

本文說明如何在 Azure SDK for Java 中設定代理,讓你能透過所需的網路與安全邊界路由客戶端請求。

HTTP Proxy 組態

適用於 Java 的 Azure 用戶端函式庫提供多種方式來為 HttpClient 設定 Proxy。

每個提供 Proxy 的方法都有自己的優缺點,並提供不同層級的封裝。 當你為 HttpClient 設定代理時,它在其整個生命週期內都會使用該代理。 透過將代理綁定於一個獨立 HttpClient的 ,應用程式可以使用多個 HttpClient 實例,每個實例都能使用不同的代理來滿足應用程式的代理需求。

Proxy 組態選項如下:

使用環境代理

預設情況下,HTTP 用戶端建構器會檢查環境中代理設定。 此程式會使用適用於 Java Configuration 的 Azure SDK API。 當建置者建立客戶端時,會用呼叫 Configuration.getGlobalConfiguration()取得的全域組態副本來配置該客戶端。 此呼叫會讀取系統環境中的任何 HTTP 代理設定。

當建置者檢查環境時,會依指定順序搜尋以下環境配置:

  1. HTTPS_PROXY
  2. HTTP_PROXY
  3. https.proxy*
  4. http.proxy*

*表示已知的 Java Proxy 屬性。 如需詳細資訊,請參閱 Oracle 檔中的 Java 網路和 Proxy

如果建置者找到任何環境組態,它會藉由呼叫 ProxyOptions來建立 ProxyOptions.fromConfiguration(Configuration.getGlobalConfiguration()) 實例。 本文提供了更多關於該 ProxyOptions 類型細節。

這很重要

若要隱含地使用 HTTPS_PROXYHTTP_PROXY,Java 需要您將系統環境內容 java.net.useSystemProxies 設為 true

您也可以建立 HTTP 用戶端實例,而該實例不會使用系統環境變數中的任何 Proxy 組態。 若要覆寫預設行為,請在 HTTP 用戶端建置器中明確設定一個設定方式不同的 Configuration。 當你在建構器中設定 a Configuration 時,它就不再呼叫 Configuration.getGlobalConfiguration()。 例如,如果您使用configuration(Configuration)呼叫Configuration.NONE,則可以明確地防止構建器檢查環境中的組態設定。

下列範例使用 HTTP_PROXY 具有 值的 localhost:8888 環境變數,以使用 Fiddler 作為 Proxy。 此程式代碼示範如何建立 Netty 和 OkHttp HTTP 用戶端。 欲了解更多 HTTP 用戶端設定資訊,請參閱 HTTP 用戶端與管線

export HTTP_PROXY=localhost:8888
HttpClient nettyHttpClient = new NettyAsyncHttpClientBuilder().build();
HttpClient okhttpHttpClient = new OkHttpAsyncHttpClientBuilder().build();

若要防止使用環境 Proxy,請將 HTTP 客戶端建構器配置為 Configuration.NONE,如下列範例所示:

HttpClient nettyHttpClient = new NettyAsyncHttpClientBuilder()
    .configuration(Configuration.NONE)
    .build();

HttpClient okhttpHttpClient = new OkHttpAsyncHttpClientBuilder()
    .configuration(Configuration.NONE)
    .build();

使用設定代理

與其從環境讀取,不如設定 HTTP 用戶端建構器使用 Configuration 自訂的代理設定,且該設定與環境已接受的相同。 此組態提供可重複使用的設定,其範圍限定為有限的使用案例。 當 HTTP 用戶端建構器建置 HttpClient 時,會使用從 ProxyOptions.fromConfiguration(<Configuration passed into the builder>) 傳回的 ProxyOptions

下列範例會使用http.proxy*Configuration物件中設定的組態,以設置驗證 Fiddler 為代理伺服器的代理。

Configuration configuration = new ConfigurationBuilder()
    .putProperty("http.proxyHost", "localhost")
    .putProperty("http.proxyPort", "8888")
    .putProperty("http.proxyUser", "1")
    .putProperty("http.proxyPassword", "1")
    .build();

HttpClient nettyHttpClient = new NettyAsyncHttpClientBuilder()
    .configuration(configuration)
    .build();

HttpClient okhttpHttpClient = new OkHttpAsyncHttpClientBuilder()
    .configuration(configuration)
    .build();

使用顯式代理伺服器

Java 用戶端函式庫包含一個ProxyOptions類別,作為 Azure 用戶端函式庫的類型,用於配置代理伺服器。 您可以使用 ProxyOptions 用來傳送 Proxy 要求、Proxy 位址、Proxy 驗證認證和非 Proxy 主機的網路通訊協議進行設定。 只需要 Proxy 網路協定和 Proxy 位址。 使用認證憑證時,必須同時設定使用者名稱和密碼。

下列範例建立一個簡單的 ProxyOptions 實例,用來將請求代理到預設 Fiddler 位址(localhost:8888):

ProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("localhost", 8888));

下列範例會建立一個經過認證的 ProxyOptions,用來代理將請求轉發至需要代理驗證的 Fiddler 示例:

// Fiddler uses username "1" and password "1" with basic authentication as its proxy authentication requirement.
ProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("localhost", 8888))
    .setCredentials("1", "1");

您可以直接使用 ProxyOptions 設定 HTTP 用戶端產生器,以指定要使用的明確代理伺服器。 此配置是設置代理伺服器的最詳盡方法,但通常不如可變的 Configuration 在更新代理需求時來得靈活。

下列範例使用 ProxyOptions 將 Fiddler 作為代理伺服器:

ProxyOptions proxyOptions = new ProxyOptions(ProxyOptions.Type.HTTP, new InetSocketAddress("localhost", 8888));

HttpClient nettyHttpClient = new NettyAsyncHttpClientBuilder()
    .proxy(proxyOptions)
    .build();

HttpClient okhttpHttpClient = new OkHttpAsyncHttpClientBuilder()
    .proxy(proxyOptions)
    .build();

後續步驟

現在您已熟悉適用於 Java 的 Azure SDK 中的 Proxy 設定,請參閱在 適用於 Java 的 Azure SDK 中設定追蹤 ,以進一步瞭解應用程式內的流程,以及協助診斷問題。