我正在尝试使用 API,但我需要上传证书才能使用它。
这就是我一直在尝试使用 API 的内容。在此方法中,我打开连接以使用 API:
public static String consumeAPI() {
String respAPI = "";
String param = "some_param";
String user = "user";
String pswrd = "pass";
try {
SSLSocketFactory ssl = createSSLSocketFactory("path_of_cert");
URL url = new URL("https://api-dir.com.es:8080/api");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setSSLSocketFactory(ssl);
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
conn.setRequestProperty("Authorization", "Basic " + Base64.getEncoder().encodeToString((user + ":" + pswrd).getBytes(StandardCharsets.UTF_8)));
conn.setConnectTimeout(APIUtils.TIMEOUT);
try (OutputStream os = conn.getOutputStream()) {
os.write(parametros.getBytes(StandardCharsets.UTF_8));
os.flush();
if (conn.getResponseCode() == HttpURLConnection.HTTP_OK) {
try (BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
StringBuilder result = new StringBuilder();
String auxStr;
while ((auxStr = br.readLine()) != null) {
result.append(auxStr);
}
respAPI = result.toString();
}
}
}
return respAPI;
}
catch(IOException | ClassCastException | IllegalStateException | IllegalArgumentException e) {
e.printStackTrace();
return null;
}
}
这是生成加载了证书的
SSLSocketFactory
的方法:
private static SSLSocketFactory createSSLSocketFactory(String certPath) {
try {
try (InputStream in =APIUtils.class.getResourceAsStream(certPath)) {
Certificate certificate = CertificateFactory.getInstance("X.509").generateCertificate( in );
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
keyStore.load(null);
keyStore.setCertificateEntry("certalias", certificate);
TrustManagerFactory trustManagerFactory = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
trustManagerFactory.init(keyStore);
SSLContext sslContext = SSLContext.getInstance("TLSv1.2");
sslContext.init(null, trustManagerFactory.getTrustManagers(), null);
return sslContext.getSocketFactory();
}
}
catch(CertificateException | KeyStoreException | NoSuchAlgorithmException | IOException | KeyManagementException e) {
e.printStackTrace();
return null;
}
}
但是它抛出了
java.net.UnknownHostException
,这是错误跟踪:
java.net.UnknownHostException: api-dir.com.es
at java.base/sun.nio.ch.NioSocketImpl.connect(NioSocketImpl.java:567)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:327)
at java.base/java.net.Socket.connect(Socket.java:633)
at java.base/sun.security.ssl.SSLSocketImpl.connect(SSLSocketImpl.java:304)
at java.base/sun.net.NetworkClient.doConnect(NetworkClient.java:178)
at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:532)
at java.base/sun.net.www.http.HttpClient.openServer(HttpClient.java:637)
at java.base/sun.net.www.protocol.https.HttpsClient.<init>(HttpsClient.java:266)
at java.base/sun.net.www.protocol.https.HttpsClient.New(HttpsClient.java:380)
at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.getNewHttpClient(AbstractDelegateHttpsURLConnection.java:193)
at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1242)
at java.base/sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1128)
at java.base/sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:179)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getOutputStream0(HttpURLConnection.java:1430)
at java.base/sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1401)
at java.base/sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:220)
at deployment.regional.war//com.ekt.regional.web.api.SomeAPI.consumeAPI(SomeAPI.java:49)
我确保 API url 正确并且我们有访问它的权限。
值得一提的是,证书是一个
.crt
文件,是针对开发环境的。
这是DNS解析错误
API调用需要代理吗?您可能需要在通话中添加 http 代理。
取决于操作系统 你可以跑 在 Windows 上
ping api-dir.com.es
or tracert api-dir.com.es
或Linux
traceroute api-dir.com.es
查看您是否可以连接到此服务/api
或者尝试提供 api-dir.com.es 的直接 IP,而不是 URL 中的名称
或尝试在主机文件中创建 IP 条目
Linux
/etc/host
窗户
c:\Windows\System32\Drivers\etc\hosts
输入为
api-dir.com.es IP 地址