【问题标题】:Curl syntax simulation in JavaJava中的curl语法模拟
【发布时间】:2009-12-12 10:48:10
【问题描述】:

我在 .sh 文件中有一个 curl 语法。我需要在 Java 中运行 curl sytnax 或 curl 命令来复制相同的语法,但我在复制相同的语法时遇到了问题。

$AUTH_OPTION="--basic -u testuser:testpwd"
$HTTP_METHOD=POST
$FILE_OPTION="-d @$INPUT_FILE"
$CONTENT_TYPE="application/xml"
$ACCEPT_TYPE="application/xml"

echo curl -o response.txt -w %{http_code} -k -v $AUTH_OPTION -X $HTTP_METHOD $FILE_OPTION -H \"Content-Type: $CONTENT_TYPE\" -H \"Accept: $ACCEPT_TYPE\" 

我有对应的Java代码为:

StringBuffer curlCmd=new StringBuffer();
curlCmd.append("curl -o response.txt");
curlCmd.append(WHITE_SPACE);
curlCmd.append("-w %{http_code}");
curlCmd.append("-k -v -u testuser:testpwd");
curlCmd.append(WHITE_SPACE);
curlCmd.append("-X POST");
curlCmd.append(WHITE_SPACE);
curlCmd.append("-d @/test/xyz/xml" );
curlCmd.append(WHITE_SPACE);
curlCmd.append("-H"+"Content-type: application/xml");
curlCmd.append(WHITE_SPACE);
curlCmd.append("-H"+" Accept: application/xml");
curlCmd.append(WHITE_SPACE);

这似乎不起作用:它没有模拟 .sh curl 语法的相同行为。谁能帮我解决这个问题?

输出 curl -o response.txt -w %{http_code} -k -v -u testuser:testpwd -X POST -d @/path/xyz.xml -H "Content-Type: application/xml" -H "Accept: application /xml" 问题是xml没有被正确访问

【问题讨论】:

  • 我也使用过--basic,但alos似乎不起作用
  • 发布echo curl -o response.txt -w %{http_code} -k -v $AUTH_OPTION -X $HTTP_METHOD $FILE_OPTION -H \"Content-Type: $CONTENT_TYPE\" -H \"Accept: $ACCEPT_TYPE\"System.out(curlCmd.toString());的输出
  • 我只想要 java curl -o response.txt -w %{http_code} -k -v $AUTH_OPTION -X $HTTP_METHOD $FILE_OPTION -H \"Content-Type: $CONTENT_TYPE\" -H \"接受:$ACCEPT_TYPE\"
  • 输出为: curl -o response.txt -w %{http_code} -k -v -u testuser:testpwd -X POST -d @/path/xyz.xml -H "Content-Type : application/xml" -H "Accept: application/xml" 无法处理 xml,
  • “无法处理 xml”从何而来?服务器无法处理/path/xyz.xml的内容吗?

标签: java curl


【解决方案1】:

我认为可能存在一些问题,但引起我注意的是您在 Content-Type: $CONTENT_TYPEAccept: $ACCEPT_TYPE 周围缺少引号,例如:

"-H \"Content-type: application/xml\""

第二个错误是你写了-d @/test/xyz/xml,但它应该是:

-d @/test/xyz.xml

如果还是不行,能不能把 sh 脚本和你的 StringBuffer 的输出都贴出来,让我们更容易看出区别在哪里?

【讨论】:

  • 我已经使用了你所说的语法,但问题仍然存在。我收到 badrequest 错误,我正在尝试使用运行时 api 在 linux 中运行此程序
  • 我认为您不应该执行命令,而是尝试将其显示到 System.out 或在调试器中查看。如果您这样做,可能很明显出了什么问题。如果没有,请在此处发布您获得的字符串,然后有人会很快告诉您要解决的问题。如果您只是告诉我们“这行不通”,我们真的帮不了您。
  • 我完全没有得到在java中使用的正确curl语法..,我得到的输出如下语法 curl -o response.txt -w %{http_code} -k - v -X POST -d @/path/xyz.xml -H "Content-Type: application/xml" -H "Accept: application/xml"
  • this is the system.out of stringbuffer value
  • 在您的问题中发布这个以及 echo 语句的输出,每个人都会看到它。
【解决方案2】:

如果您使用环境变量,那么您需要确保:

  1. 他们是exported
  2. 您通过 shell 执行 curl(例如 /bin/bash

导出意味着变量暴露给子进程。 shell 执行将在调用您的可执行文件之前扩展这些。

所以您的调用将如下所示:

sh curl ....

看看你如何调用Process.exec(). 会有所帮助 一个常见的问题是你需要同时使用进程的stdout/stderr,否则你的sh/curl 进程可能会阻塞等待让您的父进程使用输出。详情请见here

【讨论】:

  • 好的,现在我没有使用任何环境变量...,我们是否需要使用这种语法执行 curl sh curl... curl 本身是一个命令,为什么我们需要 sh?跨度>
  • 如果你没有使用环境变量,那么你就不需要 /bin/bash。 shell 将扩展您在命令行上引用的任何环境变量,因此如果您不使用任何环境变量,那么单独执行 curl 就可以了。我的 cmets 重新。但是,并发性仍然存在!
【解决方案3】:

您可能应该在 Java 代码的第 4 行将 %{http_code} 替换为其他内容。Java 不会插入环境变量。

另外,看看Runtime#exec 方法。这使您可以执行命令而不必担心转义引号等。

在尝试从 java.util 调试调用之前,确保您的命令运行没有问题(例如服务器不接受发布的内容)可能是个好主意。一次处理一个问题要容易得多。

【讨论】:

  • 我使用相同的运行时命令执行,但输出是错误请求
  • Sarah,你需要替换http_code,因为它是一个环境变量!或使用System.getenv("http_code")
  • 不,它不是环境变量,它是让 curl 在完成后打印该信息的一种方式
  • 我不知道 %{...} 的事情 - 知道有用。从我的答案中删除那一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-02-26
  • 1970-01-01
  • 1970-01-01
  • 2015-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多