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

标签 java office365 microsoft-graph-api microsoft-graph-sdks

我正在使用 MS graph 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)

我用来连接 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);

在这一行出现错误:

DriveItem item = graphClient.users().byId("userPrincipalName")
        .drive()
        .root()
        .children()
        .buildRequest()
        .get()
        .getCurrentPage()
        .get(0);

我可以通过将代理配置传递给 Authenticator 类中的 HttpURLConnection.openConnection(proxy) 方法来获取不记名 token 。

例如:

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

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

最佳答案

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

Connect through a Proxy using Java

您也可以尝试使用默认网络设置通过代理连接,而不是明确指定使用

System.setProperty("java.net.useSystemProxies", "true");

关于java - 如何从代理服务器后面的 Java 应用程序访问 Microsoft Graph Java API?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53079388/

相关文章:

microsoft-graph-api - Microsoft Graph API GET onlineMeeting 通过 joinUrl

python - 在 python 中创建日历事件 O365 包?

java - 无法将库添加到 Android Studio 项目

java - 从 rgb 像素值创建缓冲图像

java - 屏幕关闭时计时器停止工作

excel - 获取文件excel的最后修改日期

c# - Microsoft Graph 和无用户访问

java - JOptionPane YES_NO_OPTION 不理解异常

vba - 将 Outlook VBA 宏与功能区上的自定义按钮打包

vb.net - 在没有签名证书的情况下部署 VSTO 加载项?