curl的POST请求时间太长了?

时间:2016-02-02 13:53:05

标签: bash shell curl libcurl

我想从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=$1 -F password=$2 --form "importfile=@$3" --form importSource=$4 --form format=formatCSV $5do/ImportPersonsFile | grep 'Import-ID' | grep -Eo '[0-9]{1,10}')"   echo "Import-ID: $IMPORT_ID"

duplicates="$(curl -s -F username=$1 -F password=$2 --form "importfile=@$3" --form importSource=$4 --form format=formatCSV $5do/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=$1 -F password=$2 --form "importfile=@$3" --form importSource=asds --form format=formatCSV --form importId=$IMPORT_ID --form limit=9999999 $5do/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=$1 -F password=$2 --form importId=$IMPORT_ID $POSTString $5do/ImportPersonsEditDuplicates > /dev/null
  curl -s -F username=$1 -F password=$2 --form importId=$IMPORT_ID $5do/ImportPersonsFinalise > /dev/null
done
else
echo "no duplicates"
curl -s -F username=$1 -F password=$2 --form importId=$IMPORT_ID $5do/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=$1 -F password=$2 --form importId=$IMPORT_ID $POSTString $5do/ImportPersonsEditDuplicates > /dev/null
  curl -s -F username=$1 -F password=$2 --form importId=$IMPORT_ID $5do/ImportPersonsFinalise > /dev/null

1 个答案:

答案 0 :(得分:2)

在Bash中以健壮的方式存储变量列表:

  • 使用数组
  • 在数组赋值和稍后引用数组本身时双引所有变量引用
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="$1" -F password="$2" --form importId="$IMPORT_ID" "${POSTString[@]}" "$5do/ImportPersonsEditDuplicates" > /dev/null
curl -s -F username="$1" -F password="$2" --form importId="$IMPORT_ID" "${POSTString[@]}" "$5do/ImportPersonsFinalise" > /dev/null

如果这确实是超出最大值的问题。命令行长度,正如您的问题标题所示(最不可能在Linux上,更可能在OS X上,甚至更可能在Cygwin上),您会看到一条错误消息,例如Argument list too long [ 1]

要解决此限制,请使用curl的{​​{1}}(-K)选项,该选项指示--config从指定文件中读取其参数,或者,如果curl是选项参数,从stdin 帽子提示到Daniel Stenberg

详见-;一个潜在的缺陷是必须明确引用包含嵌入空格的选项参数。

[1] man curl将告诉您系统最大值的上限。命令行长度;实际限制较低,具体取决于您的环境大小 此外,某些Linux系统对参数数量以及个别参数的长度有限制。 功能