使用cURL来POST JSON主体的Ant exec任务不起作用,相同的命令在Windows命令提示符下手动工作

时间:2013-12-06 20:04:33

标签: java html json curl ant

我正在将此任务作为Ant脚本中较大目标的一部分运行。它在Windows命令提示符中执行命令,并将输出路由到临时目录中的文本文件。我已经更改了URL参数以保护敏感信息。

<exec executable="cf.cmd" output="${java.io.tmpdir}/cmd_out.txt" failonerror="true" vmlauncher="false">
    <arg value="curl" />
    <arg value="POST" />
    <arg value="http://www.google.com/v2/routes" />
    <arg value="--body" />
    <arg value="&#39;{&quot;host&quot;: &quot;${old.app.name}&quot;, &quot;domain_guid&quot;: &quot;${domain.guid}&quot;, &quot;space_guid&quot;: &quot;${space.guid}&quot;}&#39;" />
</exec>

从Ant的详细日志中,此任务生成以下命令:

Current OS is Windows 7
[exec] Output redirected to C:\Users\foo\AppData\Local\Temp\cmd_out.txt
[exec] Executing 'cf' with arguments:
[exec] 'curl'
[exec] 'POST'
[exec] 'http://www.google.com/v2/routes'
[exec] '--body'
[exec] ''{"host": "foo", "domain_guid": "4cc4c9b0-5b87-40f5-8ecc-6d6347a3236d", "space_guid": "6c3338e2-422d-46c0-a901-eda41b1fd968"}''
[exec] 
[exec] The ' characters around the executable and arguments are
[exec] not part of the command.

运行时,此任务在cmd_out.txt中生成以下输出:

{
  "code": 1001,
  "description": "Request invalid due to parse error: lexical error: invalid char in json text.\n                                      {host: foo, domain_guid\n                     (right here) ------^\n
  "error_code": "CF-MessageParseError
  "types": [
    "MessageParseError
    "Error"
  ],
  "backtrace": []
}

但是,如果我在Windows命令提示符中手动执行此相同命令:

cf curl POST http://www.google.com/v2/routes --body '{"host": "foo", "domain_guid": "4cc4c9b0-5b87-40f5-8ecc-6d6347a3236d", "space_guid": "6c3338e2-422d-46c0-a901-eda41b1fd968"}'

然后我得到了正确的结果。在此处发布它没有意义,但它是成功消息而不是无效的解析错误消息。

如果我在手动Windows命令提示符下运行此命令(注意JSON主体周围没有单引号),那么我得到与Ant脚本相同的错误:

cf curl POST http://www.google.com/v2/routes --body {"host": "foo", "domain_guid": "4cc4c9b0-5b87-40f5-8ecc-6d6347a3236d", "space_guid": "6c3338e2-422d-46c0-a901-eda41b1fd968"}

我在这里不知所措。从我所看到的,Ant运行与我手动执行的命令相同的命令。但是Ant版本失败了,手动版本也成功了。谁能看到我做错了什么?

1 个答案:

答案 0 :(得分:2)

看起来这些空间导致了问题。将exec任务更改为以下内容非常有用:

<exec executable="cf.cmd" output="${java.io.tmpdir}/cmd_out.txt" failonerror="true" vmlauncher="false">
    <arg value="curl" />
    <arg value="POST" />
    <arg value="http://www.google.com/v2/routes" />
    <arg value="--body" />
    <arg value="&apos;{&quot;host&quot;:&quot;${old.app.name}&quot;,&quot;domain_guid&quot;:&quot;${domain.guid}&quot;,&quot;space_guid&quot;:&quot;${space.guid}&quot;}&apos;" />
</exec>