Fare un collegamento utilizzare POST anziché GET


205

Non sono sicuro che sia possibile. Ma mi chiedevo se qualcuno sa come far passare un collegamento ipertestuale ad alcune variabili e usare POST (come un modulo) invece di GET.


HTML non può farlo. JavaScript può catturare l'evento click sul link e fare ciò che vuoi se non puoi cambiare HTML e CSS può modellare pulsanti come link se è solo una questione di aspetto.
sylvain,

Risposte:


99

È possibile creare un modulo con input nascosti che contengono i valori da registrare, impostare l' azione del modulo sull'URL di destinazione e il metodo del modulo da pubblicare . Quindi, quando si fa clic sul collegamento, attivare una funzione JS che invia il modulo.

Vedi qui , per un esempio. Questo esempio utilizza JavaScript puro, senza jQuery: è possibile scegliere questo se non si desidera installare nulla di più di quello che già si possiede.

<form name="myform" action="handle-data.php" method="post">
  <label for="query">Search:</label>
  <input type="text" name="query" id="query"/>
  <button>Search</button>
</form>

<script>
var button = document.querySelector('form[name="myform"] > button');
button.addEventListener(function() {
  document.querySelector("form[name="myform"]").submit();
});
</script>

16
Perché questa è la risposta accettata? La domanda richiede specificamente l' uso di POST (come un modulo) anziché GET , ma questa risposta dice " imposta l'azione sull'URL di destinazione e sul metodo per ottenere ".
Majid Fouladpour,

3
Capisco quello. Quello che non capisco è questo: ci mettiamo nei guai nel creare un modulo nascosto in modo da poter POSTARE, ma poi, dopo aver creato il modulo, perché proponi di impostare il metodo GET? Avevamo getsenza il modulo, no?
Majid Fouladpour,

3
Hai ragione. Questo è stato un errore, ma in qualche modo l'OP ha ancora fatto bene (probabilmente a causa del link incluso che è molto più chiaro). Grazie per averlo segnalato. L'ho riformulato del tutto.
Palantir,

3
Ho aggiornato la tua risposta per utilizzare un approccio più moderno. Se non sei d'accordo, non esitare a ripristinare questa modifica.
Michał Perłakowski,

3
Non c'è motivo di coinvolgere Javascript in questo processo. Perché questa è la risposta accettata?
shacker,

323

Non è necessario JavaScript per questo. Volevo solo chiarirlo, dal momento in cui questa risposta è stata pubblicata, tutte le risposte a questa domanda implicano l'uso di JavaScript in un modo o nell'altro.

Puoi farlo piuttosto facilmente con HTML e CSS puri creando un modulo con campi nascosti contenente i dati che desideri inviare, quindi assegnando lo stile al pulsante di invio del modulo in modo che appaia come un collegamento.

Per esempio:

.inline {
  display: inline;
}

.link-button {
  background: none;
  border: none;
  color: blue;
  text-decoration: underline;
  cursor: pointer;
  font-size: 1em;
  font-family: serif;
}
.link-button:focus {
  outline: none;
}
.link-button:active {
  color:red;
}
<a href="some_page">This is a regular link</a>

<form method="post" action="some_page" class="inline">
  <input type="hidden" name="extra_submit_param" value="extra_submit_value">
  <button type="submit" name="submit_param" value="submit_value" class="link-button">
    This is a link that sends a POST request
  </button>
</form>

Il CSS esatto che usi può variare a seconda di come vengono disegnati i link regolari sul tuo sito.


4
concordato. Avevo bisogno di un modo per farlo in una e-mail, quindi JS non era un'opzione per me. Questo dovrebbe funzionare perfettamente
SynackSA

8
Sono in grado di votare una sola volta. Questo è quasi triste quanto il fatto che il 99,728% di tutte le domande HTML finirà per essere confuso con problemi Javascript o jQuery.
Rab,

3
Questo è sicuramente un modo semplice per usare un pulsante che assomiglia a un link, ma in realtà è hard-coding. Devi conoscere esattamente le condizioni in cui vivrà questo pulsante e impostarle in modo esplicito per ogni caso. Penso che le risposte basate su JS / JQuery siano più generiche poiché utilizzano l'elemento link stesso (o qualsiasi altro elemento).
MakisH,

2
@ Ajedi32 Siamo spiacenti, il mio commento non è stato così chiaro: provo principalmente a dire che questo pulsante è disegnato in modo specifico per sembrare un elemento <a>. Ma se metti il ​​pulsante attorno ad altri <a> elementi che hanno uno stile diverso, ad es. In diverse parti della pagina, devi duplicare tutte le regole css di <a> anche per il pulsante, per creare regole per hover, visitato ecc. Altrimenti, ovviamente, farà il lavoro, ma sembrerà brutto. Con le altre soluzioni semplicemente non è necessario modificare alcun CSS, si ottiene semplicemente un elemento <a> come tutto quello che già si possiede. Naturalmente anche l'HTML puro presenta alcuni vantaggi.
MakisH,

1
@Robert AFAIK, nessuna delle altre soluzioni proposte funziona con il clic centrale. Se vuoi davvero essere pedante, potresti dire che è impossibile inviare una richiesta POST con un link. Puoi inviare richieste POST solo con moduli e JavaScript.
Ajedi32,

48

Puoi usare le funzioni javascript. JQuery ha una bella funzione post integrata se decidi di usarla:

JQuery Post

<script language="javascript"> 

   function DoPost(){
      $.post("WhateverPage.php", { name: "John", time: "2pm" } );  //Your values here..
   }

</script>


<a href="javascript:DoPost()">Click Here</A> 

5
Questo fa la richiesta POST come richiesto, ma non ho potuto usarlo perché ho ancora bisogno di andare nella posizione "Qualunque.php".
Chris,

6
$.post('page.php', {param: 1}, function() { window.location.href = 'page'.php' });
JREAM

1
@mplungjan href dice dove si riferisce il collegamento, mentre sono d'accordo che è sbagliato confondere comportamento e contenuto, in questo caso javascript è il riferimento. In altre parole "quando si fa clic sul collegamento verrà eseguito un postback utilizzando JavaScript". Questo ha più significato che associare un evento click. Regole rigide come "non usare mai javascript in href" sono cattive come qualsiasi altra cattiva pratica.
Menol,

@ Menolo ho detto: sconsigliato. - non "non usare mai". Se vuoi davvero puoi fare <a href="whyjavascript.html" id="postIt">Click Here</a>e avere$("#postIt").on("click",function(e) { e.preventDefault(); $.post("WhateverPage.php", { name: "John", time: "2pm" } ); });
mplungjan il

1
@mplungjan viene introdotta una raccomandazione come qualsiasi altra per evitare confusione nel contenuto / comportamento. Quando una raccomandazione viene avanzata in casi al di fuori dell'ambito previsto, inizia ad apparire come una regola rigida. L'esempio che hai dato sembra fare un miglio in più solo per essere al sicuro della "regola" in modo che nessuno possa incolpare il programmatore in futuro, ma questa sicurezza si ottiene a scapito della leggibilità e del significato. È come appare a un altro sviluppatore pragmatico, ma sono sicuro che non intendevi questo.
Menol,

24

Questa è una vecchia domanda, ma nessuna delle risposte soddisfa pienamente la richiesta. Quindi sto aggiungendo un'altra risposta.

Il codice richiesto, a quanto ho capito, dovrebbe apportare una sola modifica al modo in cui funzionano i normali collegamenti ipertestuali: il POSTmetodo dovrebbe essere utilizzato invece di GET. Le implicazioni immediate sarebbero:

  1. Quando si fa clic sul collegamento, è necessario ricaricare la scheda nell'URL di href
  2. Poiché il metodo è POST, non dovremmo avere una stringa di query nell'URL della pagina di destinazione caricata
  3. Quella pagina dovrebbe ricevere i dati in parametri (nomi e valore) da POST

Sto usando jquery qui, ma questo potrebbe essere fatto con le API native (più difficile e più a lungo ovviamente).

<html>
<head>
    <script src="path/to/jquery.min.js" type="text/javascript"></script>
    <script>
        $(document).ready(function() {

            $("a.post").click(function(e) {
                e.stopPropagation();
                e.preventDefault();
                var href = this.href;
                var parts = href.split('?');
                var url = parts[0];
                var params = parts[1].split('&');
                var pp, inputs = '';
                for(var i = 0, n = params.length; i < n; i++) {
                    pp = params[i].split('=');
                    inputs += '<input type="hidden" name="' + pp[0] + '" value="' + pp[1] + '" />';
                }
                $("body").append('<form action="'+url+'" method="post" id="poster">'+inputs+'</form>');
                $("#poster").submit();
            });
        });
    </script>
</head>
<body>
    <a class="post" href="reflector.php?color=blue&weight=340&model=x-12&price=14.800">Post it!</a><br/>
    <a href="reflector.php?color=blue&weight=340&model=x-12&price=14.800">Normal link</a>
</body>
</html>

E per vedere il risultato, salva quanto segue come reflector.php nella stessa directory che hai salvato sopra.

<h2>Get</h2>
<pre>
<?php print_r($_GET); ?>
</pre>

<h2>Post</h2>
<pre>
<?php print_r($_POST); ?>
</pre>

12

Un altro esempio funzionante, usando un approccio simile pubblicato: crea un modulo html, usa javascript per simulare il post. Questo fa 2 cose: pubblica i dati in una nuova pagina e aprili in una nuova finestra / scheda.

HTML

<form name='myForm' target="_blank" action='newpage.html' method='post'>
<input type="hidden" name="thisIsTheParameterName" value="testDataToBePosted"/>
</form>

JavaScript

document.forms["myForm"].submit();

3

HTML + JQuery : un collegamento che invia un modulo nascosto con POST.

Dal momento che ho trascorso molto tempo a comprendere tutte queste risposte, e dato che hanno tutti alcuni dettagli interessanti, ecco la versione combinata che finalmente ha funzionato per me e che preferisco per la sua semplicità.

Il mio approccio è di nuovo quello di creare un modulo nascosto e inviarlo facendo clic su un collegamento altrove nella pagina. Non importa in quale parte del corpo della pagina verrà posizionato il modulo.

Il codice per il modulo:

<form id="myHiddenFormId" action="myAction.php" method="post" style="display: none">
  <input type="hidden" name="myParameterName" value="myParameterValue">
</form>

Descrizione:

Il display: nonenasconde la forma. In alternativa, puoi inserirlo in un div o in un altro elemento e impostare display: nonel'elemento on.

La type="hidden"creerà un fild che non verrà mostrato ma i suoi dati saranno trasmessi ai eitherways azione ( vedi W3C ). Capisco che questo è il tipo di input più semplice.

Il codice per il collegamento:

<a href="" onclick="$('#myHiddenFormId').submit(); return false;" title="My link title">My link text</a>

Descrizione:

Il vuoto ha hrefcome target solo la stessa pagina . Ma in questo caso non importa, poiché return falseimpedirà al browser di seguire il collegamento. Potresti voler cambiare questo comportamento ovviamente. Nel mio caso specifico, l'azione conteneva un reindirizzamento alla fine.

È onclickstato usato per evitare l'uso href="javascript:..."come notato da mplungjan . È $('#myHiddenFormId').submit();stato usato per inviare il modulo (invece di definire una funzione, poiché il codice è molto piccolo).

Questo link apparirà esattamente come qualsiasi altro <a>elemento. Puoi effettivamente utilizzare qualsiasi altro elemento invece di <a>(ad esempio una <span>o un'immagine).


2

È possibile utilizzare questa funzione jQuery

function makePostRequest(url, data) {
    var jForm = $('<form></form>');
    jForm.attr('action', url);
    jForm.attr('method', 'post');
    for (name in data) {
        var jInput = $("<input>");
        jInput.attr('name', name);
        jInput.attr('value', data[name]);
        jForm.append(jInput);
    }
    jForm.submit();
}

Ecco un esempio in jsFiddle ( http://jsfiddle.net/S7zUm/ )


@DaoLam il codice funziona davvero. Ho sostituito leserged.free.fr/phpinfo.php per il valore in phpref e ha pubblicato il modulo su quel sito passando i valori.
JSWilson,

2

Come menzionato in molti post, questo non è direttamente possibile, ma un modo semplice e di successo è il seguente: Innanzitutto, inseriamo un modulo nel corpo della nostra pagina html, che non ha pulsanti per l'invio, e anche i suoi input sono nascosti. Quindi utilizziamo una funzione JavaScript per ottenere i dati e, inviare il modulo. Uno dei vantaggi di questo metodo è il reindirizzamento ad altre pagine, che dipende dal codice lato server. Il codice è il seguente: e ora dovunque sia necessario un metodo "POST":

<script type="text/javascript" language="javascript">
function post_link(data){

    $('#post_form').find('#form_input').val(data);
    $('#post_form').submit();
};
</script>

   <form id="post_form" action="anywhere/you/want/" method="POST">
 {% csrf_token %}
    <input id="form_input" type="hidden" value="" name="form_input">
</form>

<a href="javascript:{}" onclick="javascript:post_link('data');">post link is ready</a>

1

Suggerisco un approccio più dinamico, senza la codifica HTML nella pagina, tenerlo rigorosamente JS:

$("a.AS-POST").on('click', e => {
  e.preventDefault()
  let frm = document.createElement('FORM')
  frm.id='frm_'+Math.random()
  frm.method='POST'
  frm.action=e.target.href
  document.body.appendChild(frm)
  frm.submit()
})

0

Invece usando javascript, puoi anche usare un'etichetta che invia un modulo nascosto. Soluzione molto semplice e piccola. L'etichetta può essere ovunque nel tuo HTML.

<form style="display: none" action="postUrl" method="post">
  <button type="submit" id="button_to_link"> </button>
</form>
<label style="text-decoration: underline" for="button_to_link">  link that posts </label>


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.