Httpie: طلب إضافة خيار "-d، --data" للجسم الخام مثل curl

تم إنشاؤها على ٣١ أكتوبر ٢٠١٦  ·  18تعليقات  ·  مصدر: httpie/httpie

الطلب بسيط ، فقط لإضافة خيار لتمرير البيانات الأولية مثل curl يفعل:

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

أعلم أنه في معظم الحالات إذا كنت ترسل JSON أو بيانات النموذج ، فيمكن تحقيق ذلك باستخدام _ "عناصر الطلب" _ ، مثل:

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

وسيتم تحويله إلى التنسيق المناسب اعتمادًا على نوع المحتوى ، وهذا رائع! وإذا كان لديك شيء ليس JSON أو بيانات نموذج لإرسالها ، فيمكنك القيام بشيء مثل:

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

لكن هذا غير عملي ، والفكرة الرئيسية لـ HTTPie هي _cURL-like tool for human_ ، وهذه الحالة بعيدة عن هذا المبدأ ، في الواقع ، curl أكثر عملية من HTTPie للمثال السابق. إضافة أكثر من أمر واحد وتوجيهها بأحرف قبيحة مثل | < فقط لأن خيارًا بسيطًا مفقودًا لا يبدو "صديقًا للإنسان".

ما الخطأ في إضافة خيار -d إلى http ؟

التعليق الأكثر فائدة

يمكنك فقط القيام http POST example.org <<< "foo bar" أو http POST example.org < file.name

ال 18 كومينتر

ما الخطأ في إضافة الخيار -d إلى http؟

لن يكون هناك شيء خطأ في ذلك. أنا فقط أجد منظف الأنابيب وأفضل بشدة عندما يكون هناك طريقة واحدة فقط للقيام بنفس الشيء. توجد الأنابيب لهذا الغرض بالذات (أي لتمرير _data_ إلى البرامج) ، وهي سهلة الفهم وعالمية ولا لبس فيها. تدعم كل أداة CLI اللائقة الأنابيب (مع استثناء ملحوظ curl ) لذلك ما عليك سوى معرفة المفهوم مرة واحدة.

قارن:

httpie

طريقة عالمية لتمرير بيانات الطلب من خلال إعادة توجيه stdin (إدخال قياسي). يتم تخزين هذه البيانات مؤقتًا ثم بدون معالجة أخرى مستخدمة كهيئة الطلب.

لفة

-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.

نعم ، أنا أتفق معك في أن دعم الأنابيب في أداة سطر الأوامر يعد ميزة جيدة ، كما أنني صنعت أداة سطر أوامر تدعم الأنابيب ( Mongotail ) ، ولكي أكون صادقًا ، لم أكن أعرف أن curl لا يدعمها. لكنني أعتقد أن دعم كلتا الميزتين لا يضيف تعقيدًا ، لأن جميع أدوات CLI المعروفة تقريبًا في نظام Unix البيئي تدعم كلا الاتجاهين. على سبيل المثال. cat ، grep ، find ، tail ...

الأوامر التي ذكرتها تقبل عمومًا إما قائمة وسائط اسم الملف أو بيانات الإدخال الأولية من خلال stdin . ومع ذلك ، لا تقبل البيانات الفعلية كوسيطات. قبول البيانات الأولية عبر حجة أمر غير شائع.

(توضيح ما كتبته في تعليق سابق: curl يدعم stdin لكن يجب أن يكون هناك تعليمات صريحة لقراءته ، على سبيل المثال ، --data-binary @- .)

جئت إلى هنا لتقديم تقرير عن خطأ متعلق بهذه المشكلة ، لذلك ربما لا يكون خطأ ولكنه يعمل كما هو مُصمم.

لدي برنامج نصي bash كنت أقوم بتغييره لاستخدام "httpie" بدلاً من "curl". الطلبات عبارة عن نصوص POST فارغة إلى خادم http. أقوم بتشغيل هذا البرنامج النصي عن طريق تمريره في docker exec -i ${container} bash -x .

واجهت صعوبة في معرفة أن الأمر http POST ، بينما كان يعمل بشكل جيد عند تشغيله من غلاف تفاعلي ، كان يتسبب في إنهاء البرنامج النصي على الفور.

أعتقد أنه شيء يتعلق بقراءة stdin http في docker exec . يبدو من الغريب أنني مضطر إلى توجيه " echo -n " لتجنب ذلك.

#!/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 أنت POST جسم فارغ ببساطة باستخدام http POST httpbin.org/post . يُرجى قراءة تفاصيل استخدام HTTPie في البرنامج النصي - تريد تضمين الخيار --ignore-stdin . هذه مشكلة غير ذات صلة ، على الرغم من ذلك ، يرجى فتح مشكلة جديدة بدلاً من الرد هنا ، إذا لزم الأمر.)

هل أنا محق في التفكير في أن 15.1 طلب بيانات من اسم ملف يغطي الطلب الأصلي لهذه المشكلة؟ أعتقد أنه يمكن إغلاق هذه القضية.

جانبا ، كنت أتمنى لو كنت أعرف عن HTTPie قبل الأمس لأنني كنت أتجنب 3 ساعات أو حتى أفكر في سبب عدم حفظ فواصل الأسطر في ملف XML الخاص بي. (اعتقدت أنه كان تطبيقي ولكنه كان curl ، والذي يتطلب استخدام الخيار --data-binary لترك البيانات بمفردها.) شكرًا لـ HTTPie!

لا ، DavidOliver . طلب mrsarm أن يكون قادرًا على تمرير سلسلة من المعلمة ، وليس محتويات الملف.

+1

هل تقبل MR بهذه الميزة jakubroztocil ؟

يمكنك فقط القيام http POST example.org <<< "foo bar" أو http POST example.org < file.name

http: / api / hey say = مرحبًا = أنا ...

يمكنك فقط القيام http POST example.org <<< "foo bar" أو http POST example.org < file.name

يبدو أنه لا يعمل مع بوويرشيل ، لقد عملت معي 'raw body data' | http post :8080/api/events على بوويرشيل ،
ولكن ما زلت تريد -d, --data أو شيء من هذا القبيل لنقل بيانات الجسم الخام

وفقًا للمستندات ، يمكنك استخدام "سلسلة هنا Bash":

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

واجهة المستخدم الحكيمة ، الخيار منطقي.

لا يمكنني العثور على طريقة لإرسال كائن json فارغ ( {} ) وهي حالة استخدام غريبة ولكنها صالحة.

minusf : يبدو أنني لا أجد طريقة لإرسال كائن json فارغ ( {} ) وهي حالة استخدام غريبة ولكنها صالحة.

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

بأي طريقة لتجاهل الخط الجديد أثناء إعادة التوجيه؟

$ echo 20 | http POST httpbin.org/post

البيانات المودعة ستكون "data": "20\n"

hahattan ، يمكنك إرشاد echo لعدم طباعة حرف السطر الجديد اللاحق بـ -n :

$ echo -n foo | http httpbin.org/post
هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

Govinda-Fichtner picture Govinda-Fichtner  ·  6تعليقات

sensibleish picture sensibleish  ·  3تعليقات

tonsV2 picture tonsV2  ·  4تعليقات

rshurts picture rshurts  ·  5تعليقات

pyvotal-cguers picture pyvotal-cguers  ·  5تعليقات