Ar HTTP objekto užklausai leidžiama naudoti objekto objektą?

Išduodant HTTP DELETE užklausą, užklausos URI turi visiškai identifikuoti ištrynimą. Tačiau ar galima įtraukti papildomus metaduomenis kaip užklausos objekto kūno dalį?

511
18 нояб. nustatė haacked 18 nov. 2008-11-18 21:14 '08 at 9:14 pm 2008-11-18 21:14
@ 11 atsakymų

Specifikacija aiškiai nedraudžia arba nedraudžia, todėl sakyčiau, kad tai leidžiama.

„Microsoft“ mato tą patį būdą (girdžiu klausytojus), MSDN straipsnyje kalbama apie „ DELETE“ metodą „ADO.NET Framework“ duomenų paslaugoms :

Jei DELETE užklausa apima objekto kūną, kūnas ignoruojamas [...]

Be to, čia RFC2616 (HTTP 1.1) turi pasakyti apie užklausas:

  • kūno objektas yra tik tada, kai yra pranešimas apie kūną (7.2 skirsnis).
  • pranešimo kūno buvimas signalizuojamas įtraukiant Content-Length antraštę arba Transfer-Encoding (4.3 skyrius)
  • pranešimo įstaiga neturėtų būti įtraukta, kai užklausos metodo specifikacija neleidžia siųsti įmonės įstaigos (4.3 skyrius).
  • kūno objektas yra aiškiai uždraustas TRACE užklausose, visos kitos užklausų rūšys yra neribotos (konkrečiai 9 ir 9.8 skyriai)

Jei norite atsakyti, tai buvo nustatyta:

  • ar žinutė yra įtraukta atsižvelgiant į užklausos metodą ir atsakymo būseną (4.3 skyrius)
  • Atsakymai į HEAD prašymus (ypač 9 ir 9.4 skirsniuose) yra aiškiai uždrausti pranešimo kūną.
  • Pranešimo tekstas yra aiškiai uždraustas 1xx (informacinis), 204 (be turinio) ir 304 (nepakeistų) atsakymų (4.3 skyrius).
  • visi kiti atsakymai apima pranešimo tekstą, nors jis gali būti nulinis (4.3 skyrius)
418
18 нояб. atsakymas suteiktas Tomalakui 18 nov. 2008-11-18 21:36 '08 at 9:36 pm 2008-11-18 21:36

Paskutinis HTTP 1.1 specifikacijos ( RFC 7231 ) atnaujinimas aiškiai panaikina užklausas DELETE:

border=0

DELETE užklausos pranešimo naudingoji apkrova neturi konkrečios semantikos; „DELETE“ užklausai siunčiant naudingosios apkrovos kūną, kai kurie esami diegimai gali atmesti prašymą.

117
04 апр. atsakymas pateikiamas gruodį 04 d. 2012-04-04 19:49 '12, 19:49 PM 2012-04-04 19:49

Kai kurios Tomcat ir Jetty versijos, atrodo, ignoruoja objekto kūną, jei yra. Kas gali būti nepatogus, jei ketinate jį gauti.

48
15 янв. atsakymas, kurį pateikė evan.leonard sausio 15 d 2010-01-15 22:56 '10 10:56 val. 2010-01-15 22:56

Viena iš priežasčių, kodėl naudojote kūną ištrinant užklausą dėl optimistiškumo.

Jūs skaitote pranešimo 1 versiją.

 GET /some-resource/1 200 OK { id:1, status:"unimportant", version:1 } 

Jūsų kolega skaito įrašo 1 versiją.

 GET /some-resource/1 200 OK { id:1, status:"unimportant", version:1 } 

Jūsų kolegė keičia įrašą ir atnaujina duomenų bazę, kuri atnaujina versiją į 2:

 PUT /some-resource/1 { id:1, status:"important", version:1 } 200 OK { id:1, status:"important", version:2 } 

Bandote ištrinti įrašą:

 DELETE /some-resource/1 { id:1, version:1 } 409 Conflict 

Turėtumėte gauti optimistiškai blokuojančią išimtį. Dar kartą perskaitykite įrašą, pamatykite, kad jis yra svarbus ir negali jo ištrinti.

Kita priežastis, kodėl ji naudojama, yra ištrinti kelis įrašus vienu metu (pvz., Tinklelis su eilutės pasirinkimo vėliavomis).

 DELETE /messages [{id:1, version:2}, {id:99, version:3}] 204 No Content 

Atkreipkite dėmesį, kad kiekvienas pranešimas turi savo versiją. Galbūt galite nurodyti kelias versijas, naudodami kelias antraštes, tačiau George'as, tai yra lengviau ir patogiau.

Tai veikia Tomcat (7.0.52) ir pavasario MVC (4.05), galbūt ankstesnėse versijose:

 @RestController public class TestController { @RequestMapping(value="/echo-delete", method = RequestMethod.DELETE) SomeBean echoDelete(@RequestBody SomeBean someBean) { return someBean; } } 
41
09 авг. Neil McGuigan atsakymas rugpjūčio 09 d 2013-08-09 09:24 '13, 9:24 am 2013-08-09 09:24

Man atrodo, kad RFC 2616 tai nenurodo.

Iš 4.3 skirsnio:

Pranešimo kūno buvimas prašyme rodo turinio ilgio arba perkėlimo kodavimo antraštės lauko įtraukimą į užklausos pranešimų antraštes. Pranešimo įstaiga NEĮSKAIČIUOTŲ į užklausą, jei prašymo metodo specifikacija (5.1.1 skirsnis) neleidžia siuntimo objekto kūnui išsiųsti. Serveris PRIVALO perskaityti ir persiųsti pranešimo tekstą bet kuriuo prašymu; jei užklausos metodas neapima konkrečių kūno objekto semantikos, tada apdorojant užklausą, žinutės kūnas turi būti ignoruojamas.

9.7 skirsnis:

DELETE metodas reikalauja, kad šaltinio serveris ištrintų užklausos-URI nustatytą šaltinį. Šis metodas gali būti panaikintas intervencijos (arba kitomis priemonėmis) šaltinio serveryje. Klientas negali atlikti operacijos, net jei iš šaltinio serverio grąžintas būsenos kodas rodo, kad veiksmas sėkmingai baigtas. Tačiau serveris NEGALIMA nurodyti sėkmės, nebent atsakymo metu jis ketina ištrinti šaltinį arba perkelti jį į nepasiekiamą vietą ir tt

Sėkmingas atsakymas turi būti 200 (OK), jei atsakyme yra objektas, apibūdinantis statusą, 202 (priimtas), jei veiksmas dar nebuvo įvykdytas, arba 204 (be turinio), jei veiksmas buvo priimtas, bet atsakymas neapima subjekto.

Jei prašymas praeina per talpyklą, o užklausos-URI atpažįsta vieną ar daugiau saugomų objektų, šie įrašai turi būti laikomi pasenusiais. Atsakymai į šį metodą nėra cacheable.c

Taigi, tai akivaizdžiai neleidžiama arba neleidžiama, ir yra galimybė, kad tarpinis serveris kelyje gali ištrinti pranešimą (nors jis turi skaityti ir perduoti).

27
18 нояб. Atsakymą pateikė Adomas Rosenfildas lapkričio 18 d. 2008-11-18 21:37 '08 at 9:37 pm 2008-11-18 21:37

Jei norite pateikti užklausą „DELETE“ ir „Google“ naudosite „HTTPS“ apkrovos balansavimo priemonę, tik galvos, ji atmes jūsų užklausą 400 klaidų. kūnas yra iškreiptas prašymas.

11
26 мая '16 в 2:46 2016-05-26 02:46 atsakymą pateikė Ben Fried , gegužės 26 d. 16 d., 2:46 2016-05-26 02:46

Atrodo, kad „ElasticSearch“ tai naudoja: https://www.elastic.co/guide/en/elasticsearch/reference/5.x/search-request-scroll.html#_clear_scroll_api

Tai reiškia, kad Netty jį palaiko.

Kaip minėta pastabose, taip gali būti.

7
27 мая '13 в 17:59 2013-05-27 17:59 atsakė Sebastienui Lorberiui gegužės 13 d., 13 val. 17.59 val. 2013-05-27 17:59

Jis nėra apibrėžtas .

DELETE užklausos pranešimo naudingoji apkrova neturi konkrečios semantikos; „DELETE“ užklausai siunčiant naudingosios apkrovos kūną, kai kurie esami diegimai gali atmesti prašymą.
https://tools.ietf.org/html/rfc7231#page-29

6
09 янв. Simono Jin atsakymas 09 Jan 2017-01-09 10:43 '17 at 10:43 2017-01-09 10:43

Tuo atveju, jei kažkas dirba su šiais bandymų bandymais, Ne, ji nepalaikoma visur.

Šiuo metu aš išbandau „Sahi Pro“, ir labai akivaizdu, kad „http DELETE“ paleidžia bet kokių pateiktų kūno duomenų juosteles (didelis identifikatorių sąrašas, kurį reikia ištrinti urmu pagal galutinio taško projektą).

Jau keletą kartų susisiekiau su jais ir taip pat išsiunčiau tris atskirus scenarijų paketus, vaizdus, ​​žurnalus, kad juos būtų galima peržiūrėti, ir jie vis dar to nepatvirtino. Po to, kai po to, kai buvo gauta parama, pataisykite klaidą ir praleistus konferencijų skambučius, ir aš vis dar negavau tvirtų atsakymų.

Esu įsitikinęs, kad „Sahi“ to nepalaiko, ir norėčiau pasiūlyti, kad po paketo būtų daug kitų įrankių.

3
21 авг. atsakymas duotas parkeris rugpjūčio 21 d. 2015-08-21 23:29 '15, 23:29 pm 2015-08-21 23:29

Pavasario MVC, ištrynę resursą naudojant REST, grąžinsime būseną:

 @ResponseStatus(HttpStatus.NO_CONTENT) 
-1
06 дек. atsakymą pateikė Faraz Durrani 06 d. 2017-12-06 00:31 '17 - 0:31 2017-12-06 00:31

bandydami naudoti tipą , nustatykite, ar prašymas yra „JSON užklausa“, ar ne, jei delete request nėra bodobjekto, jis grąžins klaidingą.

-2
06 дек. Atsakymas pateikiamas xlaoyu.Lee 06 dec. 2017-12-06 00:31 '17 - 0:31 2017-12-06 00:31

Kiti klausimai apie „ žymes arba „ Užduoti klausimą“