Bagaimana cara mengirim payload melalui file JSON untuk curl?


201

Saya dapat berhasil membuat tempat melalui curlmengeksekusi perintah berikut:

$ 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 \
"

Server kembali HTTP/1.1 201 Created.
Sekarang saya ingin menyimpan payload dalam file JSON yang terlihat seperti ini:

// 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"]
}

Jadi saya memodifikasi perintah yang akan dieksekusi seperti ini:

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

Ini gagal kembali HTTP/1.1 401 Unauthorized. Mengapa?


1
Ingat juga bahwa jika Anda mengunggah file biner, Anda harus menggunakannya --data-binary.
AhmetB - Google

Jawaban:


329

curlmengirim permintaan POST dengan tipe konten default application/x-www-form-urlencoded. Jika Anda ingin mengirim permintaan JSON, Anda harus menentukan header tipe konten yang benar:

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

Tapi itu hanya akan berfungsi jika server menerima input json. Pada .jsonakhir url hanya dapat menunjukkan bahwa outputnya adalah json, itu tidak berarti bahwa itu juga akan menangani input json . Dokumentasi API harus memberi Anda petunjuk apakah itu benar atau tidak.

Alasan Anda mendapatkan 401dan bukan kesalahan lain mungkin karena server tidak dapat mengekstrak auth_tokendari permintaan Anda.


8
Saya mencoba menggunakan cat file.jsonsetelah -ddan mengalami kesulitan dengan itu, sampai saya belajar dari jawaban ini yang dapat saya gunakan @file.json. Terima kasih :)
shadi

1
perhatikan bahwa jika Anda memerlukan banyak tajuk, Anda harus menentukan -H/ --headerberkali-kali, setidaknya saat diuji dalam bash di Ubuntu.
Chaim Eliyah
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.