簡體   English   中英

通過 Java 的 curl 命令適用於 Windows 而不是 linux

[英]Curl command through Java works in windows and not in linux

我正在嘗試使用以下代碼使用 Java 執行 curl 命令

String myUrl= "https://someIp:somePort";
String username = "someusername";
String password = "somepassword";

String command = "curl -k -d \"client_id=someId\" -d \"username="+username+"\" -d \"password="+password+"\"   -d \"grant_type=password\"   -d \"client_secret=\" \""+myUrl+"/myauth/openid-connect/token\"";

Process process = Runtime.getRuntime().exec(command);

ByteArrayOutputStream result = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int length;
while ((length = process.getInputStream().read(buffer)) != -1) {
        result.write(buffer, 0, length);
}
String response = result.toString(StandardCharsets.UTF_8.name());

這適用於 Windows 機器,但不適用於 linux。 linux 和 windows 在使用 exec 方法執行 curl 命令的方式上有什么區別嗎? 兩個執行都是使用相同的 JRE 完成的。 在 Windows 上我成功獲得令牌,但在 Linux 中我得到以下響應:Response = {"error":"invalid_request","error_description":"Missing form parameter: grant_type"}

謝謝

經過調查,似乎當有人在 linux 環境中執行此 java 代碼時, curl 命令沒有正確構造。 我使用了以下代碼,一切正常:

String cUrlToKeyCloak = "curl -k -d \"client_id=someId\" -d \"username="+username+"\" -d \"password="+password+"\" -d \"grant_type=password\" "+keyCloakUrl+"/auth/realms/master/protocol/openid-connect/token";

    ProcessBuilder processBuilder = new ProcessBuilder();
    if(!System.getProperty("os.name").contains("Windows"))
        processBuilder.command("bash", "-c", cUrlToKeyCloak );
    else
        processBuilder.command("cmd.exe", "/c", cUrlToKeyCloak );

    String cKeyResponse = "";

    try {

        Process process = processBuilder.start();
        StringBuilder output = new StringBuilder();

        BufferedReader reader = new BufferedReader(
                new InputStreamReader(process.getInputStream()));

        String line;
        while ((line = reader.readLine()) != null) {
            output.append(line + "\n");
        }

        int exitVal = process.waitFor();
        if (exitVal == 0) {
            LOGGER.info("Curl command to keyCloak requested ...");
            LOGGER.info("cKey response = "+output);
            cKeyResponse = output.toString();
        } else {
            LOGGER.error("Curl command to keyCloak executed with error ...");
            LOGGER.info("cKey response = "+output);
            return false;
        }

    } catch (IOException e) {
        e.printStackTrace();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM