HTTP POST مع رابط استعلام معلمات — فكرة جيدة أم لا ؟ [مغلقة]

StackOverflow https://stackoverflow.com/questions/611906

  •  03-07-2019
  •  | 
  •  

سؤال

أنا تصميم API للذهاب أكثر من HTTP و أنا أتساءل إذا باستخدام HTTP POST الأمر ولكن مع رابط استعلام معلمات فقط و لا طلب الجسم هو وسيلة جيدة للذهاب.

الاعتبارات:

  • "تصميم الموقع جيد" يتطلب عدم idempotent الإجراءات ليتم إرسالها عبر البريد.هذا غير idempotent العمل.
  • فمن الأسهل إلى تطوير وتصحيح هذا التطبيق عندما طلب المعلمات الموجودة في عنوان URL.
  • API ليس المقصود للاستخدام على نطاق واسع.
  • يبدو أنه جعل طلب المشاركة مع الجسم لا يستغرق العمل أكثر قليلا مثلa Content-Length: 0 يجب أن يكون رأس صراحة المضافة.
  • كما يبدو لي أن وظيفة مع الجسم قليلا العداد معظم المطور و HTTP الأطر' التوقعات.

هل هناك أي مطبات أو مزايا إرسال المعلمات على طلب آخر من خلال رابط الاستعلام بدلا من طلب الجسم ؟

تحرير:السبب في هذا النظر هو أن العمليات ليست idempotent ولها آثار جانبية أخرى من استرجاعها.انظر HTTP المواصفات:

ولا سيما الاتفاقية أن على رئيس طرق لا ينبغي أن يكون أهمية اتخاذ إجراءات أخرى من استرجاعها.هذه الأساليب يجب أن تعتبر "آمنة".يسمح هذا المستخدم وكلاء تمثل أساليب أخرى ، مثل آخر, وضع القائمة ، طريقة خاصة ، بحيث يتم إجراء المستخدم على بينة من حقيقة أنه ربما غير آمنة الإجراءات المطلوبة.

...

أساليب يمكن أيضا أن يكون ملكا "idempotence" في (جانبا من خطأ أو انتهاء القضايا) على الآثار الجانبية N > 0 متطابقة الطلبات هو نفس واحد طلب.طرق الحصول على, رأسه, وضع و حذف مشاركة هذا العقار.أيضا ، أساليب الخيارات يجب أن تتبع ليس لها آثار جانبية ، وكذلك بطبيعتها idempotent.

هل كانت مفيدة؟

المحلول

إذا كان العمل لا idempotent ، ثم يجب أن استخدام POST.إذا كنت لا, أنت فقط يسأل عن المتاعب أسفل الخط. GET, PUT و DELETE طرق مطلوب أن يكون idempotent.تخيل ما يمكن أن يحدث في التطبيق الخاص بك إذا كان العميل قبل جلب كل ممكن GET طلب الخدمة الخاص بك -- إذا كان هذا من شأنه أن يسبب آثار جانبية واضحة إلى العميل ، ثم هناك شيء خاطئ.

أوافق على أن إرسال POST مع سلسلة الاستعلام ولكن دون الجسم يبدو غريبا, ولكن أعتقد أنه يمكن أن يكون مناسبا في بعض الحالات.

أعتقد الاستعلام جزء من عنوان URL الأمر إلى الموارد إلى الحد من نطاق الطلب الحالي.عادة, سلاسل الاستعلام تستخدم فرز أو تصفية GET طلب (مثل ?page=1&sort=title) ولكن أعتقد أنه من المنطقي على POST أيضا الحد من نطاق (ربما مثل ?action=delete&id=5).

نصائح أخرى

كل من هو على حق:العصا مع وظيفة غير idempotent الطلبات.

ماذا عن استخدام كل URI سلسلة الاستعلام و طلب المحتوى ؟ حسنا انها صالحة HTTP (انظر الملاحظة 1), فلماذا لا!

كما أنها منطقية تماما:عناوين المواقع ، بما في ذلك سلسلة الاستعلام جزء ، تحديد الموارد.في حين HTTP طريقة الأفعال (ما بعد الاختياري طلب المحتوى) يتم تحديد الإجراءات ، أو ماذا تفعل مع الموارد.يجب أن يكون متعامد المخاوف.(ولكن ليس بشكل متعامد المخاوف على حالة خاصة من ContentType=application/x-www-form-urlencoded ، انظر الملاحظة 2 أدناه.)

ملاحظة 1:مواصفات HTTP (1.1) لا دولة معلمات الاستعلام والمحتوى هي حصرية على ملقم HTTP أن يقبل وظيفة أو وضع الطلبات.لذلك أي الخادم هو حر في أن يقبل على حد سواء.أولا-هاء.إذا كنت تكتب الملقم لا يوجد شيء لوقف لكم اختيار قبول كل من (باستثناء ربما غير مرنة الإطار).عموما الملقم يمكن تفسير سلاسل الاستعلام حسب ما القواعد التي يريد.حتى أنه يمكن تفسيرها مع المنطق الشرطي الذي يشير إلى رؤوس أخرى مثل نوع المحتوى أيضا ، مما يؤدي إلى ملاحظة 2:

ملاحظة 2:إذا مستعرض ويب هو الطريقة الأساسية الأشخاص إلى تطبيق الويب الخاص بك ، application/x-www-form-urlencoded هو نوع المحتوى يتم نشر, ثم يجب أن اتبع القواعد التي Content-Type.وقواعد التطبيق/x-www-form-urlencoded هي أكثر تحديدا (بصراحة غير عادية):في هذه الحالة يجب أن تفسير URI مجموعة من المعلمات, و ليس موقع المورد.[هذه هي نفس النقطة من فائدة Powerlord رفعت ، أنه قد يكون من الصعب استخدام "نماذج ويب" إلى محتوى آخر على الخادم الخاص بك.فقط أوضح بشكل مختلف قليلا.]

ملاحظة 3:ما هي سلاسل الاستعلام أصلا ؟ RFC 3986 يعرف HTTP سلاسل الاستعلام كما URI الجزء الذي يعمل غير هرمية طريقة تحديد الموارد.

في حالة القراء يسأل هذا السؤال أود أن أسأل ما هو جيد راحة العمارة:مريحة نمط العمارة لا تتطلب URI مخططات للعمل بطريقة معينة.راحة العمارة المخاوف نفسها مع غيرها من خصائص النظام مثل cacheability من الموارد, تصميم الموارد أنفسهم (سلوكهم وقدراتهم التمثيل) ، وما إذا كان idempotence هو راض.أو بعبارة أخرى تحقيق تصميم جدا متوافق مع بروتوكول HTTP و مجموعة HTTP طريقة الأفعال.:-) (وبعبارة أخرى ، راحة العمارة ليست جدا presciptive مع كيفية الموارد يقع.)

ملاحظة أخيرة:أحيانا استعلام المعلمات على استخدامها بعد ذلك في غيرها من الأمور التي لا تحديد الموارد ولا ترميز المحتوى.رأيت معلمة استعلام مثل 'وضع=true' أو 'POST=true'?هذه هي الحلول عن المتصفحات التي لا تسمح لك استخدام وضع وسائل آخر.في حين أن هذه المعالم تعتبر جزء من URL سلسلة الاستعلام (على أسلاك), أنا أزعم أنهم ليسوا جزءا من رابط الاستعلام في الروح.

تريد الأسباب ؟ هنا واحد:

نموذج ويب لا يمكن أن تستخدم لإرسال طلب إلى صفحة التي تستخدم مزيج من الحصول على وظيفة.إذا قمت بتعيين نموذج طريقة للحصول على جميع المعلمات في سلسلة الاستعلام.إذا قمت بتعيين نموذج أسلوب إلى آخر ، جميع المعلمات في الجسم الطلب.

المصدر:HTML 4.01 مستوى القسم 17.13 تقديم النموذج

من برنامجي نظر العميل هو التعبئة والتغليف حتى المعلمات إلحاق لهم على url وإجراء وظيفة مقابلالحصول على.على جانب الملقم ، هو تقييم الواردة المعلمات من querystring بدلا من نشر بايت.في الأساس ، فإنه يغسل.

حيث يمكن أن تكون هناك مزايا/عيوب قد تكون في كيفية محددة العميل منصات العمل مع وظيفة والحصول على الروتين في الشبكات كومة ، وكذلك كيفية ملقم ويب يتعامل مع تلك الطلبات.اعتمادا على تنفيذ نهج واحد قد يكون أكثر فعالية من غيرها.مع العلم أن توجه القرار الخاص بك هنا.

ومع ذلك ، من مبرمج منظور, أنا أفضل مما إما وظيفة مع جميع المعلمات في الجسم أو الحصول على كل params على url صراحة تجاهل معلمات عناوين url مع أي طلب POST.فإنه يتجنب الخلط.

وأعتقد أنه لا يزال من الممكن جدا مريح أن يكون الاستعلام الحجج التي تحدد الموارد على عنوان URL مع الحفاظ على محتوى الحمولة تقتصر وظيفة الجسم.ويبدو أن فصل الاعتبارات "ما أنا أرسل ؟" مقابل "من أنا إرساله إلى؟".

على بقية المخيم بعض المبادئ التوجيهية التي يمكن أن نستخدمها توحيد الطريقة التي نستخدم HTTP الأفعال.هذا مفيد عند بناء API مريحة كما كنت تفعل.

باختصار:على أن يكون للقراءة فقط أيليس لها أي تأثير على الخادم الدولة.آخر يستخدم لخلق موارد على الملقم.وضعت يستخدم في تحديث أو إنشاء مورد.حذف يستخدم لحذف الموارد.

وبعبارة أخرى ، إذا API إجراء التغييرات على الخادم الدولة ، بقية ينصحنا استخدام وظيفة/وضع/حذف, ولكن لا تحصل.

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

مقارنة الحصول على التي يمكنك القيام به في كثير من الأحيان كما تريد (idempotent).

أنا أوافق - ربما أكثر أمانا للاستخدام على طلب إذا كنت مجرد مرور البيانات في رابط و لا في الجسم.انظر هذا سؤال مشابه بعض آراء إضافية على العموم بعد+الحصول على المفهوم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top