У меня есть команда curl, она отлично работает в cmd, но я хочу запустить его в коде Java - PullRequest
0 голосов
/ 19 сентября 2019

У меня есть команда curl, она прекрасно работает в cmd, но я хочу запустить ее в коде java. Главное, что нужно знать о команде POST, это вызов API "POST", который тоже требует аутентификации.я также использовал отладчик, который не идет в цикле, чтобы прочитать ответ

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' имя пользователя = имя пользователя и пароль = пароль '- сжатый --insecure

Ожидаемый результат - токен на предъявителя, который мне нужен

Ответы [ 2 ]

1 голос
/ 19 сентября 2019

Unirest является одним из наиболее распространенных Java HTTP-клиентов в момент написания этого ответа.

Вот пример команды cURL, которую вы показали, используя Unirest в Java.

Код немного сложен из-за флага --insecure в cURL, и это одно из возможных решений для получения аналогичного результата в 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();
        }
    }
}
0 голосов
/ 19 сентября 2019

Вместо запуска внешнего процесса curl используйте Java для отправки запроса.Это будет работать даже в системах, где curl не установлен, что делает ваш код действительно мультиплатформенным:

String body = String.format("username=%s&password=%s",
    URLEncoder.encode(username, StandardCharsets.UTF_8),
    URLEncoder.encode(password, StandardCharsets.UTF_8));

HttpRequest.Builder builder = HttpRequest.newBuilder(URI.create(url));
// -H
builder.setHeader("Content-Type",
    "application/x-www-form-urlencoded; charset=UTF-8");
// --data
builder.POST(HttpRequest.BodyPublishers.ofString(body));
HttpRequest request = builder.build();

// --insecure
TrustManager acceptAll = new X509TrustManager() {
    @Override
    public void checkClientTrusted(X509Certificate[] chain,
                                   String authType)
    throws CertificateException {
        // Deliberately empty.
    }

    @Override
    public void checkServerTrusted(X509Certificate[] chain,
                                   String authType)
    throws CertificateException {
        // Deliberately empty.
    }

    @Override
    public X509Certificate[] getAcceptedIssuers() {
        return null;
    }
};
SSLContext context;
try {
    context = SSLContext.getInstance("TLS");
    context.init(null, new TrustManager[] { acceptAll }, null);
} catch (GeneralSecurityException e) {
    throw new RuntimeException(e);
}

HttpClient client = HttpClient.newBuilder().sslContext(context).build();
HttpResponse<String> response =
    client.send(request, HttpResponse.BodyHandlers.ofString());

int status = response.statusCode();
if (status >= 400) {
    throw new IOException("Request failed with code " + status);
}

String result = response.body();

Классы HttpRequest, HttpResponse и HttpClient взяты из java.net.http пакет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...