Como passar a carga útil via arquivo JSON para curl?

201

Posso criar um local com sucesso via curl executando o seguinte comando:

$ curl -vX POST https://server/api/v1/places.json -d "
  auth_token=B8dsbz4HExMskqUa6Qhn& \
  place[name]=Fuelstation Central& \
  place[city]=Grossbeeren& \
  place[address]=Buschweg 1& \
  place[latitude]=52.3601& \
  place[longitude]=13.3332& \
  place[washing]=true& \
  place[founded_at_year]=2000& \
  place[products][]=diesel& \
  place[products][]=benzin \
"

O servidor retorna HTTP/1.1 201 Created.
Agora eu quero armazenar a carga útil em um arquivo JSON que se parece com isso:

// testplace.json
{
  "auth_token" : "B8dsbz4HExMskqUa6Qhn",
  "name" : "Fuelstation Central",
  "city" : "Grossbeeren",
  "address" : "Buschweg 1",
  "latitude" : 52.3601,
  "longitude" : 13.3332,
  "washing" : true,
  "founded_at_year" : 2000,
  "products" : ["diesel","benzin"]
}

Então eu modifico o comando para ser executado assim:

$ curl -vX POST http://server/api/v1/places.json -d @testplace.json

Isso não retorna HTTP/1.1 401 Unauthorized. Por quê?

JJD
fonte
1
Lembre-se também de que, se você estiver carregando arquivos binários, deve usá-lo --data-binary.
AhmetB - Google

Respostas:

329

curlenvia solicitações POST com o tipo de conteúdo padrão application/x-www-form-urlencoded. Se você deseja enviar uma solicitação JSON, precisará especificar o cabeçalho correto do tipo de conteúdo:

$ curl -vX POST http://server/api/v1/places.json -d @testplace.json \
--header "Content-Type: application/json"

Mas isso só funcionará se o servidor aceitar a entrada json. O .jsonfinal do URL pode indicar apenas que a saída é json, não significa necessariamente que ele também manipulará a entrada json . A documentação da API deve fornecer uma dica sobre isso ou não.

A razão pela qual você recebe um 401erro e não outro erro é provavelmente porque o servidor não pode extrair o auth_tokenda sua solicitação.

mata
fonte
8
Eu estava tentando usar cat file.jsonapós o -de estava tendo problemas com ele, até que aprendi com esta resposta que posso usar @file.json. Obrigado :)
shadi
1
note que se você precisar de vários cabeçalhos, precisará especificar -H/ --headervárias vezes, pelo menos quando testado no bash no Ubuntu.
Chaim Eliyah