• 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?

+2 głosów
162 wizyt
pytanie zadane 14 kwietnia 2021 w JavaScript przez Oskar Szkurłat Bywalec (2,710 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,490 p.)
Skoro coś usuwasz to dlaczego nie DELETE?
komentarz 14 kwietnia 2021 przez Oskar Szkurłat Bywalec (2,710 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,710 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 (571,400 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,710 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 (228,730 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 (571,400 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 116 wizyt
pytanie zadane 25 kwietnia 2017 w JavaScript przez zgrybus Pasjonat (24,960 p.)
+1 głos
1 odpowiedź 117 wizyt
+1 głos
0 odpowiedzi 105 wizyt

88,701 zapytań

137,308 odpowiedzi

306,748 komentarzy

58,894 pasjonatów

Motyw:

Akcja Pajacyk

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

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...