微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java URIBuilder 位于加载程序“app”的未命名模块中

如何解决Java URIBuilder 位于加载程序“app”的未命名模块中

我想执行 GET 请求:

    HttpGet request = new HttpGet(URL_SECURED_BY_BASIC_AUTHENTICATION);
    URIBuilder uriBuilder = new URIBuilder(request.getURI())
            .addParameter("code","001")
            .addParameter("name","AAA")
           

    String auth = user + ":" + mdp;

    byte[] encodedAuth = Base64.encodeBase64(
            auth.getBytes(StandardCharsets.ISO_8859_1));

    String authHeader = "Basic " + new String(encodedAuth);

    request.setHeader(HttpHeaders.AUTHORIZATION,authHeader);

    HttpClient client = HttpClientBuilder.create().build();
    HttpResponse response = client.execute((HttpUriRequest) uriBuilder);

    int statusCode = response.getStatusLine().getStatusCode();

当我尝试捕捉我的 HTTPResponse client.execute((HttpUriRequest) uriBuilder); 我有这个错误

java.lang.classCastException: class org.apache.http.client.utils.URIBuilder cannot be cast to class org.apache.http.client.methods.HttpUriRequest (org.apache.http.client.utils.URIBuilder and org.apache.http.client.methods.HttpUriRequest are in unnamed module of loader 'app')

解决方法

您遇到错误是因为您试图将 URIBuilder 的实例转换为 HttpUriRequest

您需要创建适当的 HttpUriRequest 实现才能执行您的 HTTP 请求。

在您的用例中,我想它应该是这样的:

    URIBuilder uriBuilder = new URIBuilder(URL_SECURED_BY_BASIC_AUTHENTICATION)
            .addParameter("code","001")
            .addParameter("name","AAA");

    URI uri = uriBuilder.build();  
           
    HttpGet request = new HttpGet(uri);

    String auth = user + ":" + mdp;

    byte[] encodedAuth = Base64.encodeBase64(
            auth.getBytes(StandardCharsets.ISO_8859_1));

    String authHeader = "Basic " + new String(encodedAuth);

    request.setHeader(HttpHeaders.AUTHORIZATION,authHeader);

    HttpClient client = HttpClientBuilder.create().build();
    HttpResponse response = client.execute(request);

    int statusCode = response.getStatusLine().getStatusCode();

您的评论似乎是您尝试使用 SSL 连接到站点:问题在于您的 Java 代码不信任服务器。

您需要配置有效的证书链并指示您的代码使用它才能解决问题。

Apache 客户端不依赖标准的 JSSE 机制来实现这一目的。相反,您需要使用适当的 SSLContext 配置 TrustManager。请查看以下代码(第一部分源自 Android 开发者网站中的 this extraordinary documentation fragment):

// Load your server certificate
CertificateFactory cf = CertificateFactory.getInstance("X.509");

InputStream input = new BufferedInputStream(
  new FileInputStream("server.crt")
);

Certificate certificate;
try {
  certificate = cf.generateCertificate(input);
} finally {
  input.close();
}

// Create an in-memory KeyStore containing the server certificate
// It is required in order to configure the TrustManager
String keyStoreType = KeyStore.getDefaultType(); // JKS
KeyStore keyStore = KeyStore.getInstance(keyStoreType);
keyStore.load(null,null);
keyStore.setCertificateEntry("cert",certificate);

// Create a TrustManager that trusts the server certificates in the KeyStore
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(
  TrustManagerFactory.getDefaultAlgorithm()
);
trustManagerFactory.init(keyStore);

// Create an SSLContext that uses our TrustManager
SSLContext context = SSLContext.getInstance("TLS");
context.init(null,trustManagerFactory.getTrustManagers(),null);

// Now,the actual Apache Client part

//Create a SSLConnectionSocketFactory and pass it the above created SSLContext
SSLConnectionSocketFactory factory = 
  new SSLConnectionSocketFactory(sslcontext,new NoopHostnameVerifier()
);

//Create the actual HttpClient
CloseableHttpClient client = HttpClients
  .custom()
  .setSSLSocketFactory(factory)
  .build()
;

// Use this client to perform your HTTP invocation

HttpResponse response = client.execute(request);

int statusCode = response.getStatusLine().getStatusCode();

您可以从浏览器或使用 openssl 等工具获取服务器证书。请看这个伟大的SO question

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。