Httpie: Permintaan untuk menambahkan opsi `-d, --data` untuk badan mentah seperti curl

Dibuat pada 31 Okt 2016  ·  18Komentar  ·  Sumber: httpie/httpie

Permintaannya sederhana, hanya untuk menambahkan opsi untuk meneruskan data mentah seperti yang dilakukan curl :

http :/api/user -d 'MyRawData...'

Saya tahu bahwa dalam kebanyakan kasus jika Anda mengirim JSON atau data formulir, itu dapat dicapai dengan _"request item"_, seperti:

http :/api/hey say=Hello to=me …

Dan itu akan dikonversi ke format yang tepat tergantung dari jenis kontennya, itu luar biasa! Dan jika Anda memiliki sesuatu yang bukan JSON atau data formulir untuk dikirim, Anda dapat melakukan sesuatu seperti:

echo 'MyRawData...' | http :/api/hey

Tapi ini tidak praktis, ide utama HTTPie adalah _cURL-like tool untuk manusia_ , dan kasus ini jauh dari prinsip itu, pada kenyataannya, curl lebih praktis daripada HTTPie untuk contoh sebelumnya. Menambahkan lebih dari satu perintah dan menyalurkannya dengan karakter jelek seperti | < hanya karena opsi sederhana tidak ada tidak terdengar _human-friendly_.

Apa yang salah dengan menambahkan opsi -d ke http ?

Komentar yang paling membantu

Anda bisa melakukan http POST example.org <<< "foo bar" atau http POST example.org < file.name

Semua 18 komentar

Apa yang salah dengan menambahkan opsi -d ke http?

Tidak ada yang _khususnya_ salah dengan itu. Saya baru saja menemukan pembersih pipa dan sangat suka ketika hanya ada satu cara untuk melakukan hal yang sama. Pemipaan ada untuk tujuan ini (yaitu untuk meneruskan _data_ ke program), dan mudah dipahami, universal, dan tidak ambigu. Setiap alat CLI yang layak mendukung perpipaan (dengan pengecualian curl ) sehingga Anda hanya perlu mempelajari konsepnya sekali.

Membandingkan:

httpie

Metode universal untuk meneruskan data permintaan adalah melalui stdin yang dialihkan (input standar). Data tersebut disangga dan kemudian tanpa pemrosesan lebih lanjut digunakan sebagai badan permintaan.

keriting

-d, --data <data>
              (HTTP)  Sends  the  specified data in a POST request to the HTTP server, in the same way that a browser
              does when a user has filled in an HTML form and presses the submit button. This will cause curl to pass
              the  data  to  the  server  using  the  content-type application/x-www-form-urlencoded.  Compare to -F,
              --form.

              -d, --data is the same as --data-ascii. --data-raw is almost the same  but  does  not  have  a  special
              interpretation of the @ character. To post data purely binary, you should instead use the --data-binary
              option.  To URL-encode the value of a form field you may use --data-urlencode.

              If any of these options is used more than once on the same command line, the data pieces specified will
              be merged together with a separating &-symbol. Thus, using '-d name=daniel -d skill=lousy' would gener-
              ate a post chunk that looks like 'name=daniel&skill=lousy'.

              If you start the data with the letter @, the rest should be a file name to read the data from, or -  if
              you  want  curl  to read the data from stdin. Multiple files can also be specified. Posting data from a
              file named 'foobar' would thus be done with --data @foobar. When --data is told to  read  from  a  file
              like  that,  carriage  returns  and newlines will be stripped out. If you don't want the @ character to
              have a special interpretation use --data-raw instead.

Ya, saya setuju dengan Anda bahwa mendukung perpipaan di alat baris perintah adalah fitur yang bagus, dan saya juga membuat alat baris perintah yang mendukung perpipaan ( Mongotail ), dan sejujurnya saya tidak tahu itu curl tidak mendukungnya. Tetapi saya pikir dukungan kedua fitur tidak menambah kerumitan, karena hampir semua alat CLI yang dikenal di ekosistem Unix mendukung dua arah. Misalnya. cat , grep , find , tail ...

Perintah yang Anda sebutkan umumnya menerima daftar argumen nama file atau data input mentah melalui stdin . Tidak, bagaimanapun, menerima data aktual sebagai argumen. Menerima data mentah melalui argumen cukup jarang.

(Mengklarifikasi apa yang saya tulis di komentar sebelumnya: curl mendukung stdin tetapi perlu diinstruksikan secara eksplisit untuk membacanya, misalnya, --data-binary @- .)

Datang ke sini untuk mengajukan bug yang terkait dengan masalah ini, jadi mungkin itu bukan bug tetapi berfungsi seperti yang dirancang.

Saya memiliki skrip bash yang saya ubah untuk menggunakan "httpie" alih-alih "curl". Permintaan adalah POST tubuh kosong ke server http. Saya menjalankan skrip ini dengan menyalurkannya ke docker exec -i ${container} bash -x .

Saya mengalami kesulitan untuk mengetahui bahwa perintah http POST , meskipun berfungsi dengan baik ketika dijalankan dari shell interaktif, menyebabkan skrip segera keluar.

Saya kira itu sesuatu tentang http membaca stdin di docker exec . Tampaknya aneh bahwa saya harus mem-pipe " echo -n " untuk menghindari ini.

#!/bin/bash
echo "STARTING..."
echo -n | http POST ...     # this replaces: curl -XPOST --data-binary '' ...
echo "Without the 'echo -n' above this statement would not be reached."
echo "DONE"

( @jamshid you POST badan kosong hanya dengan http POST httpbin.org/post . Harap baca tentang spesifikasi penggunaan HTTPie dalam skrip — Anda ingin menyertakan opsi --ignore-stdin . Ini adalah masalah yang tidak terkait , jadi silakan buka edisi baru alih-alih membalas di sini, jika perlu.)

Apakah saya benar dalam berpikir bahwa 15.1 Permintaan data dari nama file mencakup permintaan asli masalah ini? Saya kira masalah ini bisa ditutup.

Selain itu, saya berharap saya tahu tentang HTTPie sebelum kemarin karena saya akan menghindari 3 jam atau lebih untuk mencari tahu mengapa jeda baris dalam file XML saya tidak dipertahankan. (Saya pikir itu adalah aplikasi saya tapi itu curl, yang membutuhkan opsi --data-binary untuk digunakan untuk meninggalkan data saja.) Terima kasih untuk HTTPie!

Tidak, @DavidOliver . @mrsarm diminta untuk dapat meneruskan string dari parameter, bukan konten file.

+1

Apakah Anda akan menerima MR dengan fitur ini @jakubroztocil ?

Anda bisa melakukan http POST example.org <<< "foo bar" atau http POST example.org < file.name

http :/api/hey say=Hello to=me …

Anda bisa melakukan http POST example.org <<< "foo bar" atau http POST example.org < file.name

sepertinya tidak berfungsi untuk PowerShell, 'raw body data' | http post :8080/api/events bekerja untuk saya di PowerShell,
tetapi masih ingin -d, --data atau sesuatu seperti ini untuk mentransfer data tubuh mentah

menurut dokumen Anda dapat menggunakan "string Bash di sini":

http example.com/ <<<'{"name": "John"}'

Dari segi UI, opsi ini masuk akal.

sepertinya saya tidak dapat menemukan cara untuk mengirim objek json kosong ( {} ) yang merupakan kasus penggunaan yang aneh tetapi valid.

@minusf : sepertinya saya tidak dapat menemukan cara untuk mengirim objek json kosong ( {} ) yang merupakan kasus penggunaan yang aneh tapi valid.

$ echo '{}' | http httpbin.org/post

adakah cara untuk membuang baris baru saat mengarahkan ulang?

$ echo 20 | http POST httpbin.org/post

data yang diajukan akan menjadi "data": "20\n"

@hahattan Anda dapat menginstruksikan echo untuk tidak mencetak karakter baris baru tambahan dengan -n :

$ echo -n foo | http httpbin.org/post
Apakah halaman ini membantu?
0 / 5 - 0 peringkat