我正在抓取一个以文本为输入的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作为参数。有什么建议可以克服这个错误?
答案 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