首页 > 解决方案 > 我有 curl 命令它在 cmd 中工作正常,但我想在 java 代码中运行它

问题描述

我有 curl 命令它在 cmd 中工作正常,但我想在 java 代码中运行它。主要的 bout 命令是它正在调用一个“POST”API,它也需要身份验证。我也使用过调试器,它不会进入循环来读取响应

String[] command = {"curl",url, "-H" ,"Content-Type: application/x-www-form-urlencoded","-X", username+ "&" + password ,"insecure"};
        ProcessBuilder process = new ProcessBuilder(command);
        Process p;
        try
        {
            p = process.start();
            BufferedReader reader =  new BufferedReader(new InputStreamReader(p.getInputStream()));
            StringBuilder builder = new StringBuilder();
            String line="" ;
            while ( (line = reader.readLine()) != null) {
                builder.append(line);
                System.out.println(line);
                builder.append(System.getProperty("line.separator"));
            }
            String result = builder.toString();
            System.out.print(result);

        }

curl ' https://integration.sirionlabs.office:9443/nifi-api/access/token ' -H 'Content-Type: application/x-www-form-urlencoded; charset=UTF-8' --data 'username=username&password=password' --compressed --insecure

预期的结果是我需要的不记名令牌

标签: javacurl

解决方案


在我写这个答案的那一刻,Unirest是最常见的 Java HTTP 客户端之一。

这是您在 Java中使用Unirest显示的 cURL 命令示例。

由于 cURL 中的 --insecure 标志,代码有点棘手,这是在 Unirest 中获得类似结果的可能解决方案之一(来源:https ://github.com/Kong/unirest-java/issues/70 ):

import java.security.KeyManagementException;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;

import javax.net.ssl.SSLContext;
import javax.security.cert.CertificateException;
import javax.security.cert.X509Certificate;

import org.apache.http.client.HttpClient;
import org.apache.http.conn.ssl.NoopHostnameVerifier;
import org.apache.http.conn.ssl.TrustSelfSignedStrategy;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.ssl.SSLContextBuilder;

import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.JsonNode;
import com.mashape.unirest.http.Unirest;
import com.mashape.unirest.http.exceptions.UnirestException;

public class UnirestCertificateIgnore {

    private static HttpClient unsafeHttpClient;

    static {
        try {
            SSLContext sslContext = new SSLContextBuilder().loadTrustMaterial(null, new TrustSelfSignedStrategy() {
                public boolean isTrusted(X509Certificate[] chain, String authType) throws CertificateException {
                    return true;
                }
            }).build();

            unsafeHttpClient = HttpClients.custom().setSSLContext(sslContext)
                    .setSSLHostnameVerifier(new NoopHostnameVerifier()).build();

        } catch (KeyManagementException | NoSuchAlgorithmException | KeyStoreException e) {
            e.printStackTrace();
        }
    }

    public static HttpClient getClient() {
        return unsafeHttpClient;
    }

    public static void main(String[] args) {

        try {
            HttpClient creepyClient = RestUnirestClient.getClient();
            Unirest.setHttpClient(creepyClient);

            HttpResponse<String> response = Unirest.get("https://integration.sirionlabs.office:9443/nifi-api/access/token")
                .header("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
                .header("cache-control", "no-cache")
                .body("username=username&password=password")
                .asString();

        } catch (UnirestException e) {
            e.printStackTrace();
        }
    }
}

推荐阅读