将大文字传递给bash curl网址

时间:2016-01-19 21:20:57

标签: bash curl

我正在抓取一个以文本为输入的web api的json结果。例如:

curl http://www.example.com/annotate?text=${long_text}&input_format=html&output=json

我得到的参数列表错误太长了。然后我改为:

curl -d "text=${long_text}&input_format=html&output=json" http://www.example.com/annotate?

我仍然得到同样的错误。我从html文件中读取了$ {long_text},因为api不接受file作为参数。有什么建议可以克服这个错误?

2 个答案:

答案 0 :(得分:5)

命令行长度的限制是由操作系统强制执行的 - 它不是bash可以做任何事情的。 (它实际上不仅仅是命令行长度,而是命令行和所有导出的环境变量的组合大小)。

您可以告诉curl从文件中读取数据作为解决方法:

# create a temporary file, and arrange for it to be deleted on exit
tempfile=$(mktemp "${TMPDIR:-/tmp}/curldata.XXXXXX")
trap 'rm -rf "$tempfile"' 0 ERR

# put the data you want to POST in that file
# this doesn't have the same error because printf is a bash builtin
printf '%s' "text=${long_text}&input_format=html&output=json" >"$tempfile"

# ...and pass the filename, prefixed with an @, to curl
curl --data "@$tempfile" http://example.com/annotate

如果您不想打扰管理临时文件,可以从stdin中读取:

curl --data "@-" http://example.com/annotate \
  <<<"text=${long_text}&input_format=html&output=json"

或者,如果您需要输入文件进行urlencoded,您可以告诉curl为您执行此操作,并将其从所述文件本身读取:

curl --data-urlencode text@htmlfile -d input_format=html -d output=json \
  http://example.com/annotate

答案 1 :(得分:-2)

curl -d "text=`cat long_text_file`&input...."  http://www.yay.com