如何从代理服务器后面的Java应用程序访问Microsoft Graph Java API?

abh*_*hek 5 java office365 microsoft-graph microsoft-graph-sdks

我正在使用MS图形Java sdk,以便从我的Java应用程序访问O365 ODFB驱动器。当我绕过企业代理服务器(连接到开放式互联网)时,便能够从API中获得所需的响应。但是当我通过代理服务器连接时,出现以下异常:

SEVERE: Throwable detail: com.microsoft.graph.core.ClientException: Error during http request
Exception in thread "main" com.microsoft.graph.core.ClientException: Error during http request
    at com.microsoft.graph.http.DefaultHttpProvider.sendRequestInternal(DefaultHttpProvider.java:356)
    at com.microsoft.graph.http.DefaultHttpProvider.send(DefaultHttpProvider.java:197)
    at com.microsoft.graph.http.DefaultHttpProvider.send(DefaultHttpProvider.java:177)
    at com.microsoft.graph.http.BaseCollectionRequest.send(BaseCollectionRequest.java:87)
    at com.microsoft.graph.requests.generated.BaseDriveItemCollectionRequest.get(BaseDriveItemCollectionRequest.java:54)
    at com.example.TestMain.main(TestMain.java:148)
Caused by: java.net.ConnectException: Connection timed out: connect
    at java.net.DualStackPlainSocketImpl.connect0(Native Method)
    at java.net.DualStackPlainSocketImpl.socketConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.doConnect(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connectToAddress(Unknown Source)
    at java.net.AbstractPlainSocketImpl.connect(Unknown Source)
    at java.net.PlainSocketImpl.connect(Unknown Source)
    at java.net.SocksSocketImpl.connect(Unknown Source)
    at java.net.Socket.connect(Unknown Source)
    at sun.security.ssl.SSLSocketImpl.connect(Unknown Source)
    at sun.security.ssl.BaseSSLSocketImpl.connect(Unknown Source)
    at sun.net.NetworkClient.doConnect(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.http.HttpClient.openServer(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.<init>(Unknown Source)
    at sun.net.www.protocol.https.HttpsClient.New(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.plainConnect(Unknown Source)
    at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream0(Unknown Source)
    at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
    at java.net.HttpURLConnection.getResponseCode(Unknown Source)
    at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(Unknown Source)
    at com.microsoft.graph.http.UrlConnection.getResponseCode(UrlConnection.java:110)
    at com.microsoft.graph.http.DefaultHttpProvider.sendRequestInternal(DefaultHttpProvider.java:297)
Run Code Online (Sandbox Code Playgroud)

我用于连接Graph API的代码如下:

// Get an access token for the client
    Authenticator authenticator = new Authenticator();
    IAuthenticationProvider authenticationProvider = authenticator.getAuthenticationProvider();

    graphClient = GraphServiceClient
            .builder()
            .authenticationProvider(authenticationProvider)
            .buildClient();

    graphClient.getLogger().setLoggingLevel(LoggerLevel.DEBUG);
Run Code Online (Sandbox Code Playgroud)

在此行出现错误:

DriveItem item = graphClient.users().byId("userPrincipalName")
        .drive()
        .root()
        .children()
        .buildRequest()
        .get()
        .getCurrentPage()
        .get(0);
Run Code Online (Sandbox Code Playgroud)

我可以通过将代理配置传递给HttpURLConnection.openConnection(proxy)Authenticator类中的方法来获得承载令牌。

例如:

Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress("myproxyaddress", 80));
@SuppressWarnings("restriction")
String encoded = new sun.misc.BASE64Encoder().encodeBuffer(("username:password").getBytes()).replace("\r\n", "");
URL url = new URL(tokenEndpoint);
HttpURLConnection conn = (HttpURLConnection) url.openConnection(proxy);
conn.setRequestProperty("Proxy-Authorization", "Basic " + encoded);
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?请帮忙。

Shu*_*lag 1

看来您在通过代理连接时可能缺少某些配置。有关通过代理连接时的详尽详细信息,请参阅以下链接。

使用 Java 通过代理连接

您还可以尝试使用默认网络设置通过代理进行连接,而不是使用显式指定

System.setProperty("java.net.useSystemProxies", "true");
Run Code Online (Sandbox Code Playgroud)