cURL “[ignora] campo de formulário desconhecido” ao passar uma string delimitada por ponto-e-vírgula como dados de formulário

0

Problema

Estou tentando usar o cURL para enviar dados de formulário para uma API. A documentação da API indica que aceita multipart/form-data tipos de conteúdo.

Como isso faz parte de um script, estou tentando criar uma cadeia delimitada por ponto-e-vírgula de campos de formulário, que está documentada aqui na documentação do cURL .

O que eu tentei

O que eu gostaria que fosse capaz de fazer (a fim de construir facilmente esta string baseada em argumentos passados para o script) é isto:

local _payload="file=@file;username=name;content=hello"
echo "INFO payload: ${_payload}"
curl -i -F "${_payload}" "${url}"

$ ./myscript.sh <args>
# INFO payload: file=@file;username=name;content=hello  -- my script
# Warning: skip unknown form field: username=name       -- cURL
# Warning: skip unknown form field: content=hello       -- cURL

Eu recebo esses avisos do cURL e, como esperado, a API nunca obtém esses valores.

O que funciona está passando cada campo como seu próprio argumento para cURL, ou seja,

curl -i -F "file=@file" -F "username=name" -F "content=hello" "${url}"

... mas isso não é tão bom contabilizar de forma programática.

Devo editar para mencionar que, em ambos os casos, o arquivo é recebido e processado corretamente.

Pergunta

Tenho certeza de que isso é algo que estou perdendo, mas depois de examinar a documentação da cURL e a API que estou solicitando, não consigo encontrá-la. Por que cURL está ignorando esses campos de formulário e como posso evitar / corrigir isso?

    
por Shawn Lutch 19.08.2018 / 00:02

1 resposta

0

Eu fiz um grande avanço, e é claro, logo após eu postar minha primeira pergunta no Unix.SE. Eu reli os documentos e percebi (pela primeira vez, pela primeira vez) que estou usando indevidamente a string delimitada por ponto-e-vírgula.

Os documentos indicam que o ponto-e-vírgula é usado para não separar vários campos, mas várias qualidades de o mesmo campo. É aí que eu errei.

Os documentos da API indicam que os endpoints aceitam uma carga útil JSON codificada em url como payload_json field, então estou fazendo isso:

local _json="payload_json=$(build_json)"  # defined elsewhere
local _file="file=@file"
curl -i -F "${_file}" -F "${_json}" "${url}"

e eis que funciona. RTFD!

    
por 19.08.2018 / 00:16

Tags