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 系统对 参数数量 以及 单个参数的长度 有限制。
我想从 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 系统对 参数数量 以及 单个参数的长度 有限制。