2009-10-20 10 views
24

È una cattiva pratica mescolare GET e POST? (nota questo è in PHP)Mixing GET con POST - è una cattiva pratica?

ad es.

<form action="delete.php?l=en&r=homepage" method="post"> 
<!-- post fields here --> 
</form> 
+1

potrebbe avere più senso se si chiede se si tratta di cattiva pratica –

+0

@ d03boy - sì pensato così. cambierà – mauris

+1

Secondo questo http://dev.ckeditor.com/ticket/727 il mix di GET e POST potrebbe anche fallire anche se non l'ho ancora visto. Quindi mi chiedo, fallirà mai? – Trilarion

risposta

43

In realtà, questo invierà una richiesta richiesta POST al server, quindi tecnicamente non si è mescolare le due cose insieme: si utilizza POST con parametri URL. Non c'è nulla di fondamentalmente sbagliato in questo, a patto che non si usi l'URL per i parametri che dovrebbero essere nella forma come campo nascosto.

Esistono semplici regole: si utilizza GET (possibilmente con parametri URL) per cose costanti che non cambiano server e POST per cose che modificano il server. Se i parametri dell'URL contenessero l'ID di qualcosa che volevi eliminare, sarebbe una cattiva pratica.

EDIT, anni dopo

mi è stato chiesto per la fonte, per cui qui sono la parte rilevante del molto specifiche di HTTP

http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html

la convenzione è stato stabilito che il GET I metodi e HEAD NON DEVONO avere l'importanza di intraprendere un'azione diversa dal recupero. Questi metodi devono essere considerati "sicuri". Ciò consente agli agenti utente di rappresentare altri metodi, come POST, PUT e DELETE, in un modo speciale, in modo che l'utente venga reso consapevole del fatto che è possibile richiedere un'azione potenzialmente non sicura.

Ci si va, GET non dovrebbe cambiare nulla, il POST è per cose che cambiano il server (operazione non sicura). Dovrei essere in grado di chiamare GET qualsiasi numero di volte. È più che idempotente: dovrebbe essere (per quanto possibile) privo di effetti collaterali! Con GET la richiesta potrebbe non raggiungere nemmeno il server se è implicata la cache.

Quindi sì: hai un modulo, vuoi sapere se usi GET o POST? Quindi cambia server => POST, non cambiare server => GET. E poiché si può accedere a un URL con qualsiasi verbo (get o post), non inserire i dati che modificano il server nell'URL, perché qualcuno potrebbe copiare quell'URL, fare un GET e cambiare il server senza che tu lo sappia. Immagina cosa succederebbe se qualcuno copiasse quell'URL su facebook e 10 000 persone iniziassero a cancellare cose casuali? Non bene. I framework recenti (node, ruby) sono meglio isolati rispetto a quelli, ma non in PHP di base, quindi è una buona regola per quel linguaggio.

+3

+1 Bello e conciso. – jensgram

+1

È troppo semplificato. Per uno, GET dovrebbe essere usato solo se l'azione è idempotente. – Jeroen

+0

Mi piacerebbe vedere qualsiasi risorsa di supporto per quella dichiarazione. – atamanroman

5

È ancora un POST, si include solo una stringa di query nell'URL. Non vedo un problema con questo. Questo è probabilmente più pulito che include quelle variabili nei dati del post usando i campi di input nascosti. Inoltre, sul server, probabilmente non si desidera il valore di l (lingua?) Con i dati del post. Se è sempre presente nella stringa di query, puoi determinare lo stesso codice altrove per determinare la lingua, anziché avere un caso speciale per le richieste POST.

+0

è solo un esempio =) – mauris

+0

Questa è una risposta migliore rispetto a quella di John Kugelman. Credo che includere i parametri che identificano il _programma_ o _ambiente_ siano soddisfacenti (ad esempio? Action = deleteUser e language = en), magari anche buone pratiche, dove includere l'ID di qualcosa su cui si vuole agire è una cattiva pratica (ad es. UserId = 123). Questo appartiene a un campo nascosto. – marc82ch

5

No, questo va bene. Faccio esattamente questo sul sito Web della mia azienda, ad esempio nella pagina di amministrazione degli utenti.L'URL normale è:

/admin/user?name=jkugelman 

Poi per eliminare un utente ho posto a questa stessa pagina, tranne che vi posto una variabile invece di fare un GET, dal momento che la cancellazione è un'azione stateful e dovrebbe essere fatto con un post. Sembra qualcosa di simile:

<!-- Post back to self --> 
<form action="/admin/user?name=jkugelman"> 
    <input type="submit" name="delete" value="Delete" 
      onchange="return confirm('Are you sure?')" /> 
</form> 
+2

Bene, idealmente l'eliminazione si farebbe con un'azione "DELETE', se solo l'HTML lo permettesse. – Kieron

+1

Penso che questa sia una brutta implementazione se me lo chiedi. inserirò il nome utente in un campo nascosto. – mauris

Problemi correlati