【问题标题】:running curl command in java is not working在java中运行curl命令不起作用
【发布时间】:2020-11-12 14:38:51
【问题描述】:

我按照这些教程How to use cURL in Java?https://www.baeldung.com/java-curl 学习了如何从 Java 运行 curl,但它不起作用。

curl 命令(删除页面)从终端运行良好,并以 XML 形式给出响应,但是当我在 java 中尝试时,nada 没有错误,没有 XML,页面也保持不变。

这是我尝试过的:

public class TryCurl {

    static String command = "curl -u username:password -X POST -F cmd=\"deletePage\" -F path=\"/content/demo-task/section\" https://author1.dev.demo.adobecqms.net/bin/wcmcommand";

    public static void main(String[] args) throws Exception {

        Process process = Runtime.getRuntime().exec(command);
        process.getInputStream();
        process.destroy();
    }

}

我在这里做错了什么?

【问题讨论】:

  • process.getInputStream(); 你得到它并把它放在...哪里,确切地?
  • 我建议您阅读有关该 Process 类的教程以了解它的工作原理。你知道,获取一个输入流......它返回一个可以读取输入的对象。但是你丢弃了那个对象。那么你希望这段代码做什么呢?在我看来,您似乎认为“好吧,有那个 Process 类”......但后来您停止研究它。
  • 你可以尝试打印运行 curl 的结果吗?过程是否为您提供了一种方法来做到这一点?顺便说一句,你可以在 Java 中使用一些库来做类似 curl 的东西,比如 Apache 的 HTTP 组件
  • Java 中根本不需要 CURL。开箱即用的java.net.URL 类支持 HTTP。但你最好改用Apache HTTP client行业标准库
  • 重申其他人所说的:不要使用 curl。 Java 完全能够调用 URL 并检索其内容。使用 URL 类,或使用 java.net.http 包。 (而且您可能不应该依赖 baeldung.com 寻求建议。我观察到它经常忽略良好做法。)

标签: java curl


【解决方案1】:
  1. 你为什么要使用 CURL 呢?这非常“脆弱”(将来可能会失败,它需要很多东西才能到位,例如:curl 甚至安装在您运行它的硬件上,curl 在路径中,密码没有空格或其他特殊字符,等等。Java 完全有能力向服务器发出 POST 请求。

  2. 这不是单个进程命令的工作方式。 Runtime.exec 不是 shell - 诸如:将引号解开到参数中是 shellisms,进程不会做任何事情。使用 ProcessBuilder 并分别传递每个参数,不带引号。

  3. 您不能只获取输入流并丢弃,您需要实际读取其中的字节,否则 curl 将坐在那里等待有人抓取它吐出到标准输出的数据。这变得复杂了,这让我们回到了#1,这在这里可能要容易得多。

  4. 您立即运行 process.destroy() 很明显,它将破坏该进程,因此得名。 curl 将退出,因为你要求它,在它完成发送 POST 之前。

执行比听起来要复杂得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 1970-01-01
    • 2020-10-31
    • 1970-01-01
    相关资源
    最近更新 更多