URL tələb parametrləri ilə HTTP POST - yaxşı bir fikirdirmi?

HTTP üzərində gezinmek üçün bir API hazırlayıram və HTTP POST komutunu istifadə edirəm, amma URL istək parametrləri və istək orqanı ilə deyil, bu yaxşı bir yoldur.

Suallar:

  • "Yaxşı veb dizayn" qeyri-idempotent tədbirlərin POST vasitəsilə göndərilməsini tələb edir. Bu qeyri-idempotent bir hərəkətdir.
  • İstədiyiniz parametrlər URLdə olduqda bu proqramı inkişaf etdirmək və diskarifikasiya etmək asandır.
  • API ümumi istifadə üçün nəzərdə tutulmur.
  • Bir bədən olmadan POST sorğunun edilməsi, məsələn, bir az daha çox iş görəcəkdir. A Content-Length: 0 açıq şəkildə əlavə edilməlidir.
  • Mənə də görünə bilər ki, bir bədən olmadan POST developers və HTTP çərçivəsində gözləmələrinə bir az zidd.

Bir POST sorğusuna parametr göndərmək üçün bir URL tələbi ilə deyil, istək orqanına başqa heç bir mənfi cəhət və ya üstünlüklər varmı?

Düzenle: Bunun səbəbi, əməliyyatların idempotent olmadığını və axtarışdan başqa yan təsiri olmasıdır. HTTP spesifikasiyasına baxın:

Xüsusilə konvensiyaya əsasən, GET və HEAD metodları axtarışdan başqa mənimsəməyin əhəmiyyətinə malik deyildir. Bu üsullar "təhlükəsiz" sayılmalıdır. Bu istifadəçi agentləri POST, PUT və DELETE kimi digər üsulları xüsusi şəkildə təqdim etməyə imkan verir, belə ki istifadəçi təhlükəli bir hərəkətin tələb oluna biləcəyi barədə yaradılmışdır.

...

N-0 yan təsirləri ilə yanaşı, üsullarda bu xüsusiyyətdə "idempotency" (səhv və ya sona çatma istisna olmaqla) eyni istəklər bir sorğu ilə eyni ola bilər. GET, HEAD, PUT və DELETE metodları bu əmlakı paylaşır. Həmçinin OPTIONS və TRACE variantları heç bir yan təsir göstərməməlidir və əslində idempotent olmalıdır.

310
04 марта '09 в 21:42 2009-03-04 21:42 Steven Huwig tərəfindən 04.03 'də 04:42' da təyin olundu
@ 7 cavab

Sizin hərəkət idempotent deyilsə, siz POST istifadə POST . İstəmirsinizsə, narahat olursunuz. GET , PUTDELETE idempotent olmalıdır. Müştərinin daha əvvəl xidmətiniz üçün mümkün olan bütün GET tələblərini istəməsi halında tətbiqinizdə nə baş verəcəyini düşünün - əgər müştəri üçün görünən yan təsirlər yaratsa, bir şey səhvdir.

Bir sorğu sətri ilə bir POST göndərməklə razıyam amma bir cəsəd olmadan qəribə görünür, amma bu bəzi hallarda uyğun ola bilər.

Mövcud sorğunun əhatəsini məhdudlaşdırmaq üçün URL tələb hissəsini bir resurs komutu olaraq düşünün. Tipik olaraq, sorğu sətirləri bir GET sorğusunu (məsələn ?page=1> ) sıralamaq və ya süzmək üçün istifadə olunur, amma məncə, bu da POST də əhatə dairəsini məhdudlaşdırmaq POST mənalıdır (bəlkə, ?action=delete> ).

162
04 марта '09 в 22:20 2009-03-04 22:20 Cavab Don McCaughey tərəfindən 04 Mart 09:20 'da 10:20' da verildi

Bütün bunlar: qeyri-idempotent istəklər üçün POST-ə qalın.

Sorgu simli istək URI'sini və sorğunun məzmununu necə istifadə etmək olar? Bəli, bu, həqiqətən, HTTP (1-ci bəndə baxın), buna görə niyə belə deyil!

Bu da tamamilə mantıksızdır: URL'ler, sorgu dizesinin bir hissəsi də daxil olmaqla, resursları axtarmaq üçün. HTTP metodunun fe'lləri (POST - və onun əlavə məzmun tələbi) hərəkətləri və ya resurslarla əlaqəni göstərməyi nəzərdə tutur. Bunlar ortogonal problemlər olmalıdır. (Lakin xüsusi halda ContentType = tətbiq / x-www-form-urlencoded, bax: Aşağıdakı 2-ə baxın.)

Qeyd 1: HTTP (1.1) spesifikasiyası istək parametrləri və məzmunun POST və ya PUT istəklərini qəbul edən bir HTTP server üçün qarşılıqlı olduqlarını göstərmir. Beləliklə, hər hansı bir server həm də qəbul edə bilər. Yəni bir server yazarsanız, (və ehtimal ki, qeyri-səmərəli bir quruluşa) müdaxilə etmək üçün heç bir şeyiniz yoxdur. Bir qayda olaraq, server istənilən qaydalara uyğun olaraq sorğu sətirlərini şərh edə bilər. Hətta onları şərti məntiqlə təfsir edə bilir, bu da digər 2 başlıqlarına aiddir:

border=0

Qeyd 2: Əgər veb brauzerinizin istifadəçiləri veb tətbiqinizə daxil olmağın əsas üsulu olduqda və tətbiq / x-www-form-urlencoded dərc etdikləri məzmunun növüdürsə , bu məzmun Türünün qaydalarına əməl etməlisiniz. Ərizə / x-www-form-urlencoded qaydaları daha dəqiq (və açıq-aşkar, qeyri-adi )dir: bu halda, URI-ni resursun yeri deyil, bir sıra parametrlər kimi şərh etməlisiniz. [Bu, Rəbb tərəfindən qaldırılan eyni fayda mənbəyidir; Serverinizdə POST məzmunu üçün web formalarını istifadə etmək çətin ola bilər. Bir az fərqli olaraq açıqladı.]

Qeyd 3: Sorğu sətri nədir? RFC 3986, bir qaynaq üçün qeyri-hiyerarşik şəkildə işləyən bir URI'nin bir hissəsi kimi HTTP sorğu stringsini təyin edir.

Bu sual verən oxucular, yaxşı bir RESTful arxitekturanın nə olduğunu soruşmaq istəyirlərsə: RESTful architecture pattern URI sxemlərinin müəyyən bir şəkildə işləməsini tələb etmir. RESTful architecture, resursların önbelleğe alınması, resursların özləri (davranışları, bacarıqları və fikirləri) və idempotencyin təmin olunduğuna dair sistemin digər xüsusiyyətlərinə aiddir. Yoxsa HTTP protokolu və HTTP metodunun verb dəsti ilə çox uyğun bir dizaynın əldə edilməsi :-) (Başqa sözlə, RESTful architecture resursların yeri ilə çox öngörülənə bilməz.)

Son qeyd: bəzən sorğu parametrləri nə resursların lokallaşdırılması, nə də məzmun kodlaması olmayan digər şeylər üçün istifadə olunur. Heç bir istək parametri görüldü, məsələn "PUT = true" və ya "POST = doğru"? Bunlar PUT və POST metodlarının istifadəsinə imkan verməyən brauzerlər üçün əvəzolunmazlar. Bu parametrlər URL sorğu sətrinin bir hissəsi olmasına baxmayaraq (kəşf ediləndə), məncə URL sorgusunun tərkib hissəsi deyildir.

76
03 мая '12 в 9:56 2012-05-03 09:56 cavab 03 May '12 'də saat 9:56' da Tim Lovell-Smith tərəfindən verilmişdir 2012-05-03 09:56

Bir səbəbə ehtiyacınız varmı? Burada bir:

GET və POST birləşməsini istifadə edən bir səhifəyə müraciət göndərmək üçün veb formasını istifadə edə bilməzsiniz. Form metodunu GET'de qurarsanız, bütün parametrlər sorgu dizesindedir. POST forması metodunu qurarsanız, bütün parametrlər istək orqanında.

Mənbə: HTML 4.01 standartı, bölmə 17.13 Form təqdimatı

53
04 марта '09 в 22:16 2009-03-04 22:16 PowerLord tərəfindən 04.03.2009 tarixində saat 22.16-da cavab verilir

Proqramlaşdırılmış baxımdan müştəri üçün parametrləri paketləyir və onları url əlavə edir və GET-ə qarşı bir POST yerinə yetirir. Server tərəfində gələn parametrləri göndərilən byte deyil, istəkdən qiymətləndirir. Əsasən, yuma.

Avantajları / dezavantajları ola biləcəyi hallarda, xüsusi müştəri platformalarının POST və GET proseduraları şəbəkə yığınında necə işlədiyini və veb serverin bu istəkləri necə idarə etdiyini bilər. Tətbiqinizə bağlı olaraq, bir yanaşma başqa birinə görə daha təsirli ola bilər. Bunun bir qərar verməyə kömək edəcəyini bilmək.

Lakin programcı baxımından POST'u bədənin bütün parametrləri ilə təmin etməli və ya url üzrə bütün parametrlərlə GET və hər hansı bir POST tələbi ilə url parametrlərini açıq şəkildə görməməlisən. Bu qarışıqlığı önlədir.

7
04 марта '09 в 21:56 2009-03-04 21:56 cavab 04 mart '09 'da 21:56' də verilmişdir 2009-03-04 21:56

POST orqanı ilə məhdud olan məzmun yükünü saxlayarkən URL-də resursu müəyyən edən arqumentlər tələb etmək olduqca çətin ola bilərdi. Bu, "Nə göndərirəm?" Düşüncələrini ayırır. "Kimə göndərəcəyəm?".

4
10 мая '12 в 22:04 2012-05-10 22:04 Cavab verilir swizzcheez May 10 '12 at 10:04 PM 2012-05-10 22:04

REST düşərgəsində HTTP fiillerini istifadə etdiyimizi standartlaşdırmaq üçün istifadə edə biləcəyimiz bəzi qaydalar var. Bunu RESTful API yaratdığınızda faydalıdır.

Bir sözlə: GET yalnız oxunmalıdır, yəni. Server statusunu təsir etmir. POST serverdə resurs yaratmaq üçün istifadə olunur. PUT bir qaydanı yeniləmək və ya yaratmaq üçün istifadə olunur. DELETE resurs silmək üçün istifadə olunur.

Başqa sözlə, əgər API fəaliyyətiniz serverın vəziyyətini dəyişirsə, REST bizə POST / PUT / DELETE istifadə etməyi məsləhət görür, lakin GET deyil.

İstifadəçi agentlər adətən birdən çox POST faylının işə salınmasının pis olduğunu və bu barədə sizə xəbərdarlıq etdiyini anlayırlar, çünki POST məqsədi server vəziyyətini dəyişdirməkdir (məsələn, əllər üçün ödəniş) və ehtimal ki, iki dəfə bunu etmək istəmirsiniz

GET ilə müqayisə olun, tez-tez istədiyiniz kimi edə bilərsiniz (idempotent).

2
05 марта '09 в 3:49 2009-03-05 03:49 cavab 05 mart 2009 - cu il tarixində saat 03:49 'də yola salınır

Razıyam - bədəndə deyil, yalnız URL-də məlumatları ötürsəniz, GET-in istifadəsini istifadə etmək daha təhlükəsizdir. POST + GET konsepsiyasında bir sıra əlavə fikirlər üçün bu cür suallara baxın.

-7
04 марта '09 в 21:57 2009-03-04 21:57 Cavab Marc Novakowski tərəfindən Mart 04 '09 da 21:57 'də verilmişdir 2009-03-04 21:57

əlaqədar digər suallar və ya sual verin