我在 Java 11 中使用 Spring。
我有一個測驗 curl 命令,我可以通過 java 成功呼叫它。
final String cmdGetDocId = "curl -X POST https://postman-echo.com/post --data foo1=bar1&foo2=bar2";
Process process = Runtime.getRuntime().exec(cmdGetDocId);
InputStream inputStream = process.getInputStream();
JSONObject json = convertToJSON(inputStream);
回傳的 JSON 符合預期。
如果我使用不同的 curl 并在命令列上執行它,它會按預期成功回傳一些 JSON。
curl --location --request GET 'http://xxx.xx.xx.xx:8080/document/details/' --header 'Authorization: Basic xxxxx'
但是,如果我嘗試從我的 Java 應用程式呼叫 curl,它會失敗。
String cmdGetDocId = "curl --location --request GET 'http://xxx.xx.xx.xx:8080/document/details/' --header 'Authorization: Basic xxxxx'";
Process process = Runtime.getRuntime().exec(cmdGetDocId);
InputStream inputStream = process.getInputStream();
JSONObject json = convertToJSON(inputStream);
回傳的 inputStream 為空。
你知道我做錯了什么嗎?為什么java方法可以呼叫test curl,而不能呼叫其他的GET curl?
uj5u.com熱心網友回復:
我做了一個最小的例子來向你解釋一些事情:
public class Playground {
public static void main(String... args) throws IOException, InterruptedException {
String cmdGetDocId = "curl -XGET 'https://google.com'";
Process process = Runtime.getRuntime().exec(cmdGetDocId);
InputStream inputStream = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
System.out.println("output: ");
Thread.sleep(2000);
while(process.isAlive()) Thread.sleep(100);
System.out.println("return value: " process.exitValue());
reader.lines().forEach(System.out::println);
reader = new BufferedReader(new InputStreamReader(process.getErrorStream()));
reader.lines().forEach(System.err::println);
System.out.println("---");
}
}
一方面,當您嘗試輸出時,您必須確保命令實際上已完成。為了確保,我有這個臟while回圈。此外,您還想查看錯誤輸出。
此外,您實際上不想在 Java 程式中使用 cURL。有很多漂亮的圖書館,甚至是裸圖書館HttpURLConnection。
uj5u.com熱心網友回復:
試試這個,
String command = "curl -X POST https://postman-echo.com/post --data foo1=bar1&foo2=bar2";
ProcessBuilder builder = new ProcessBuilder(command);
builder.redirectErrorStream(true);
Process process = builder.start();
InputStream response = process.getInputStream();
這將包含錯誤(如果有),否則為回應。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/378710.html
