java - java 中的 curl -k 等效项,用于抑制认证验证并通过用户名 :api key

标签 java shell

我是 java 新手,想在 java rest 客户端中检查 -k 的等价物。当我使用 -k 进行 curl 时,它适用于我在 linux 机器上。我用java做了客户端。

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

public class restposts {

// http://localhost:8080/RESTfulExample/json/product/post
public static void main(String[] args) {

  try {

    URL url = new URL("https://test");
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setDoOutput(true);
    conn.setRequestMethod("POST");
    conn.setRequestProperty("Content-Type", "application/json");
    conn.setRequestProperty("abcd", "defg");

    String input = "{\"status_id\":1,\"comment\":\" Java\"}";

    OutputStream os = conn.getOutputStream();
    os.write(input.getBytes());
    os.flush();

    if (conn.getResponseCode() != HttpURLConnection.HTTP_CREATED) {
        throw new RuntimeException("Failed : HTTP error code : "
            + conn.getResponseCode());
    }

    BufferedReader br = new BufferedReader(new InputStreamReader(
            (conn.getInputStream())));

    String output;
    System.out.println("Output from Server .... \n");
    while ((output = br.readLine()) != null) {
        System.out.println(output);
    }

    conn.disconnect();

  } catch (MalformedURLException e) {

    e.printStackTrace();

  } catch (IOException e) {

    e.printStackTrace();

 }

}

}

它给了我类似的错误
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1902)
at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276)

我不确定这个错误。有没有办法可以抑制这个错误,或者我有什么遗漏的吗

最佳答案

我按照下面的代码让它工作了。我还试图将用户信息作为不正确的标题发送。
我无法找到发送用户和 apikey 的方法,所以我将“user:key”编码为 Base 64 () 并将它们添加到标题中。因此,如果您想使用 user:apikey 发送基本的 http 身份验证。您可以使用以下代码。

以下是示例 POST 请求的代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.*;
import javax.net.ssl.*; 
import java.security.*;
import java.security.cert.*;



public class restcalls {



    public static void disableCertificateValidation() {
        // Create a trust manager that does not validate certificate chains
        TrustManager[] trustAllCerts = new TrustManager[] { new X509TrustManager() {
            public X509Certificate[] getAcceptedIssuers() { 
                return new X509Certificate[0]; 
            }

            @Override
            public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {

            }

            @Override
            public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {

            }
        }
        };
    // Ignore differences between given hostname and certificate hostname
        HostnameVerifier hv = new HostnameVerifier() {
            @Override
            public boolean verify(String hostname, SSLSession session) {
                return true;
            }
        };

        // Install the all-trusting trust manager
        try {
            SSLContext sc = SSLContext.getInstance("SSL");
            sc.init(null, trustAllCerts, new SecureRandom());
            HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
            HttpsURLConnection.setDefaultHostnameVerifier(hv);
        } catch (Exception e) {
            // Do nothing
        }
    }
    public static void main(String[] args) {

        try {

            URL url = new URL("https://tes");

            disableCertificateValidation();
            HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("Authorization","Basic getyouruser:keyencodedintobase64useanylibraryordoonline==");

            String input = "{\"status_id\":1,\"comment\":\"Post request\"}";

            OutputStream os = conn.getOutputStream();
            os.write(input.getBytes());
            os.flush();

            if (conn.getResponseCode() != HttpsURLConnection.HTTP_OK) {
                    throw new RuntimeException("Failed : HTTP error code : "
                        + conn.getResponseCode() + conn.getResponseMessage());
            }

            BufferedReader br = new BufferedReader(new InputStreamReader(
                        (conn.getInputStream())));

            String output;
            System.out.println("Output from Server .... \n");
            while ((output = br.readLine()) != null) {
                    System.out.println(output);
            }

            conn.disconnect();

        } catch (MalformedURLException e) {

            e.printStackTrace();

        } catch (IOException e) {

            e.printStackTrace();

    }

    } 
}

关于java - java 中的 curl -k 等效项,用于抑制认证验证并通过用户名 :api key,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34770935/

相关文章:

java - map 上的流过滤器和分组列表

macos - 使用 shell 脚本删除派生数据

linux - 在期待交互命令时出现异常

java - servlet中调用方法

java - 在 Java 中使用扫描器

java - 程序中出现空指针异常

java - 2 路 SSL::SSL 握手失败错误

python - Windows 7 - Python 的右键单击上下文级联菜单

Bash - 如何获取当前文件夹中文件夹的名称?

python - 如何防止 shell 在运行 python 脚本时获取输入(键盘)?