POST-卷曲请求太长?

POST-request with curl too long?

我想从 shell-脚本发送此 POST 请求:

start=&limit=&selectNone=true&importId=111&saveCount=&save=some+keywords+%C3%BCbernehmen&list=7947&list=7983&list=7940&list=7976&list=7953&list=7989&list=7948&list=7984&list=7925&list=7961&toggleAllSelect=on&7947-select=true&7947-id=7947&7983-select=true&7983-id=7983&7940-select=true&7940-id=7940&7976-select=true&7976-id=7976

有效的解决方案:

POSTString="--form selectNone=true --form save=some+keywords%C3%BCbernehmen --form toggleAllSelect=on"
IMPORT_ID="$(curl -s -F username= -F password= --form "importfile=@" --form importSource= --form format=formatCSV do/ImportPersonsFile | grep 'Import-ID' | grep -Eo '[0-9]{1,10}')"   echo "Import-ID: $IMPORT_ID"

duplicates="$(curl -s -F username= -F password= --form "importfile=@" --form importSource= --form format=formatCSV do/ImportPersonsFile | grep 'Davon Dubletten' | grep -Eo '[0-9]{1,10}<' | grep -Eo '[0-9]{1,10}')"
if [ "$duplicates" -ne 0 ]; then
ids=($(curl -s -F username= -F password= --form "importfile=@" --form importSource=asds --form format=formatCSV --form importId=$IMPORT_ID --form limit=9999999 do/ImportPersonsEditDuplicates | grep '\-id" v' | grep -Eo '>[0-9]{1,10}<' | grep -Eo '[0-9]{1,10}'))

for id in "${ids[@]}"
do
  POSTString="--form selectNone=true --form save=Als+Dublette+%C3%BCbernehmen --form toggleAllSelect=on --form list=$id --form $id-id=$id --form $id-select=true"
  curl -s -F username= -F password= --form importId=$IMPORT_ID $POSTString do/ImportPersonsEditDuplicates > /dev/null
  curl -s -F username= -F password= --form importId=$IMPORT_ID do/ImportPersonsFinalise > /dev/null
done
else
echo "no duplicates"
curl -s -F username= -F password= --form importId=$IMPORT_ID do/ImportPersonsFinalise > /dev/null
fi
 echo "done"

我想要的是如下解决方案,其中字符串在 for 循环中组装,然后所有迭代仅使用一个 curl 命令。像这样的东西,不幸的是没有用。

$POSTString="--form selectNone=true --form save=some+keywords+%C3%BCbernehmen --form toggleAllSelect=on"
    for id in "${ids[@]}"
do
  POSTString="$POSTString --form list=$id --form $id-id=$id --form $id-select=true"
done
  curl -s -F username= -F password= --form importId=$IMPORT_ID $POSTString do/ImportPersonsEditDuplicates > /dev/null
  curl -s -F username= -F password= --form importId=$IMPORT_ID do/ImportPersonsFinalise > /dev/null

在 Bash 的变量中可靠地存储参数列表:

  • 使用一个数组
  • double-quote 所有变量引用,包括在数组赋值和稍后引用数组本身时
POSTString=( --form selectNone=true --form save=some+keywords+%C3%BCbernehmen --form toggleAllSelect=on )

for id in "${ids[@]}"; do
  POSTString+=( "${POSTString[@]}" --form list="$id" --form "$id-id=$id" --form "$id-select=true" )
done

curl -s -F username="" -F password="" --form importId="$IMPORT_ID" "${POSTString[@]}" "do/ImportPersonsEditDuplicates" > /dev/null
curl -s -F username="" -F password="" --form importId="$IMPORT_ID" "${POSTString[@]}" "do/ImportPersonsFinalise" > /dev/null

如果这真的是超过最大值的问题。 command-line 长度,如问题标题所示(在 [=56= 上可能性最小,在 OS X 上可能性更大,在 Cygwin 上可能性更大),您会看到一条错误消息,例如Argument list too long.[1]

要绕过该限制,请使用 curl-K (--config) 选项,该选项指示 curl 从指定文件读取其参数,或者, 如果 - 是 option-argument, 从 stdin Tip of the hat 到 Daniel Stenberg.

具体见man curl;一个潜在的陷阱是必须显式引用包含嵌入空格的 option-argument。


[1] getconf ARG_MAX 会告诉您系统最大值的上限。 command-line长度;实际限制较低,具体取决于您的环境大小。
此外,一些 Linux 系统对 参数数量 以及 单个参数的长度 有限制。