Java:读取需要登录的远程XML

问题描述

我有一个Spring Boot应用程序,它需要读取一个XML文件,该文件可以在线(通过https)访问,但需要登录(如果有帮助,它由Redmine API生成)。我有一个经过测试且可以使用用户名和密码的帐户,并且可以正常工作(可以通过浏览器登录),并且尝试使用JCIFS,如下所示,但是我遇到了“连接超时”错误(该XML文件肯定位于时间)。我在做什么错了?

NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(null,USERNAME,PASSWORD);  
      
try (InputStream is = new SmbFile("https://mypath/issues.xml?limit=100",auth).getInputStream()) {
            System.out.println(is.toString());
        } catch (IOException e) {
            // Handle IOException
        }

解决方法

您可以在没有任何第三方库的情况下完成此操作,请参阅此博客文章:

https://www.baeldung.com/java-http-url-connection

和一个简短示例:

import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.util.Base64;

public class AuthenticationTest {

    public static void main(String[] args) throws IOException {
        String url = "https://mypath/issues.xml?limit=100";
        String user = "user";
        String password = "pass";

        String auth = user + ":" + password;
        byte[] encodedAuth = Base64.getEncoder().encode(auth.getBytes(StandardCharsets.UTF_8));
        String authHeaderValue = "Basic " + new String(encodedAuth);

        char[] buffer = new char[1024];
        int len = -1;

        URLConnection connection = new URL(url).openConnection();
        connection.setRequestProperty("Authorization",authHeaderValue);

        try (Reader reader = new InputStreamReader(connection.getInputStream())) {
            StringBuilder builder = new StringBuilder();
            while ((len = reader.read(buffer)) != -1) {
                builder.append(buffer,len);
            }
            System.out.println(builder.toString());
        }
    }
}