• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Post, Put, czy inna metoda dla żądania bez ciała?

VPS Starter Arubacloud
+2 głosów
288 wizyt
pytanie zadane 14 kwietnia 2021 w JavaScript przez Oskar Szkurłat Bywalec (2,780 p.)

Cześć, mam takie pytanie: Potrzebuję informacji tylko o tym, że przycisk na frontendzie został wciśnięty, bez przesyłania jakichkolwiek danych, bo nie jest mi to potrzebne. Mógłbym dodać jakiś stan w obiekcie (np. {state: true} i sprawdzać go, ale nie widzę ku temu powodu, ze względu na to, że na backendzie funkcja wywoływana jest w momencie otrzymania żądania.

Mógłbym wykorzystać metodę POST lub PUT i zamieścić w niej pusty obiekt, który totalnie bym zlał po stronie backendu i działałoby to tak jak potrzebuję. Jedynie odesłałbym odpowiedź, do frontendu, że żądanie zostało przyjęte - dla zmiany statusu na 200.

Jednak chciałbym się dowiedzieć, jaką metodę i standard powinienem stosować w takiej sytuacji?


Dla informacji, stosuję React; Express; Axios.

const dropPathData = () => {
        console.log('tried drop current path data:', selectedPath)
        axios.post('/dropDataAutoDriver', { })
    }

<Button onClick={dropPathData}>Drop current path data</Button>
//Index
const AutoDriver = require('../controllers/AutoDriver')
router.post('/dropDataAutoDriver', AutoDriver.dropPathData)

//Kontroler
function dropPathData(req, res) {
    //przycisk zostal wcisniety - wykonaj swoje funkcje, tu wyczysc dane
    res.end('Post done')
}

Z góry dziękuję za informację :)

komentarz 14 kwietnia 2021 przez kubaapk Nałogowiec (44,270 p.)
Skoro coś usuwasz to dlaczego nie DELETE?
komentarz 14 kwietnia 2021 przez Oskar Szkurłat Bywalec (2,780 p.)

Metodą DELETE usuwam cały obiekt i to przygotowany dla transmisji danych, prawda? W moim przypadku potrzebuję dokładniej czyszczenia tablicy wewnątrz obiektu, który nie jest w ogóle potrzebny do wystawiania go na frontend - nie sprecyzowałem wcześniej. Tablica o której mowa to history.

class Controller extends Module {
    constructor(...params) {
        super(...params)
        this.history = []
    }
}
const controller = new Controller('Controller')
komentarz 14 kwietnia 2021 przez Oskar Szkurłat Bywalec (2,780 p.)

Chyba, że w tym przypadku powinno to być PUT i nadpisać pustą tablicą wysłaną z frontendu na parametr mojego obiektu controller?

const dropPathData = () => {
        console.log('tried drop current path data:', selectedPath)
        axios.put('/dropDataAutoDriver', {arr: []})
    }
 
<Button onClick={dropPathData}>Drop current path data</Button>
function dropPathData(req, res) {
    controller.history = req.body.arr
    res.end('Post done')
}

 

2 odpowiedzi

+4 głosów
odpowiedź 14 kwietnia 2021 przez Comandeer Guru (599,730 p.)
wybrane 15 kwietnia 2021 przez Oskar Szkurłat
 
Najlepsza

Tutaj IMO bardziej pasuje POST, z racji tego, że wysyłasz to pod jeden, ogólny URL i backend sam decyduje, co tak naprawdę z tym zrobi. W przypadku PUT to wysyłający żądanie ustalałby, jaki zasób chce zmienić.

Inna rzecz, że to dla mnie raczej akademicki problem, bo sam fakt istnienia tego typu endpointa sugeruje, że raczej system nie trzyma się zasad REST, więc nie ma sensu sztywno stosować zasad dotyczących doboru metod HTTP.

komentarz 15 kwietnia 2021 przez Oskar Szkurłat Bywalec (2,780 p.)

Rozumiem ;) dziękuję wszystkim za odpowiedzi. Zostanę przy POST, czyli tak jak na samym początku zrobiłem. 
System faktycznie nie jest zbyt zgodny z wystawianiem obiektów na frontend, to wynika z tego, że to sterowanie robotem, więc nie zarządzam żadną bazą danych, nie tworze za pomocą metod nowych obiektów itp, tylko wystawiam żądania sterowania w większości, ewentualnie przyciskiem przekazuję przy okazji tekst z inputa dla backendu.
Początkowo postawiłem to na socket.io, ale postanowiłem się uczyć (od zera) stosować między innymi Express i metody POST/PUT itp i stąd trochę zastosowanie go tam, gdzie nie koniecznie to jest niezbędne. :)
Jeszcze raz dzięki!

0 głosów
odpowiedź 14 kwietnia 2021 przez Wiciorny Ekspert (269,120 p.)

Jeśli modfyikujesz obiekt to PUT- jeśli to jest nowy to POST. 
Put ma być idempotentne 
 (z założenia, tak powinny być zaimplementowane), to znaczy że nie ważne ile razy je wykonamy w danych warunkach, zawsze zwrócą tej sam wynik ),m natomiast POST zawsze zwraca inny wynik, gdyż dodaje zasób 

4
komentarz 14 kwietnia 2021 przez Comandeer Guru (599,730 p.)

To nie do końca prawda.

Zarówno PUT, jak i POST, mogą służyć do tworzenia nowych zasobów. Główna różnica jest taka, że przy POST to backend ustala, gdzie ten zasób jest tworzony (POST /issues), podczas gdy przy PUT to żądający to określa (PUT /issues/670).

PUT jest idempontentne dlatego, że standard wymaga, aby za każdym razem nadpisywało cały zasób. Dla częściowych modyfikacji zasobów jest z kolei PATCH.

Podobne pytania

+1 głos
0 odpowiedzi 138 wizyt
pytanie zadane 25 kwietnia 2017 w JavaScript przez zgrybus Pasjonat (24,860 p.)
+1 głos
1 odpowiedź 399 wizyt
+1 głos
0 odpowiedzi 158 wizyt

92,452 zapytań

141,262 odpowiedzi

319,077 komentarzy

61,854 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...