Memorizzare una richiesta POST HTTP in un segnalibro o qualcosa di simile come faresti con una richiesta GET


26

È possibile memorizzare un segnalibro con una richiesta GET in questo modo:

http://url.com/service?variable=value

Puoi memorizzare una richiesta POST in qualche modo su Chrome? Magari con un plugin? O forse in Firefox?

L'idea è che lo conservo in un segnalibro e lo sparo rapidamente invece di dover compilare un modulo ogni volta.



1
A seconda del tuo sistema operativo, potresti voler utilizzare curlper inviare invece la richiesta POST da un file
slhck


Guarda l'estensione Greasemonkey, disponibile per FF e Chrome.
ott--

Risposte:


17

L'idea è che lo conservo in un segnalibro e lo sparo rapidamente invece di dover compilare un modulo ogni volta.

A tal fine, farà la seguente pagina HTML. Dovrebbe funzionare nella maggior parte dei browser.

<html>
    <head>
        <title>getToPost</title>
        <script>
            function getToPost()
            {
                var form = document.getElementsByTagName('form')[0];
                form.style.visibility = 'hidden';
                form.action = document.location.hash.substr(1);
                var search = decodeURIComponent(document.location.search);
                search = search.substr(1).split('&');
                for(var i = 0, j = search.length, input; i < j; i++)
                {
                    input = document.createElement('input');
                    search[i] = search[i].split('=');
                    input.name = search[i][0];
                    input.value = search[i][1];
                    form.appendChild(input);
                }
                form.submit();
            }
        </script>
    </head>
    <body onload="getToPost()">
        <form method="POST"></form>
    </body>
</html>

Salvalo come C:\getToPoste puoi aggiungere il seguente URL ai segnalibri:

file:///C:/getToPost?name1=value1&name2=value2#http://url.com/service

Sarai in grado di usare letteralmente la maggior parte dei caratteri nei nomi o nei valori. Codificare quanto segue come al solito:

#   ->   %23
%   ->   %25
&   ->   %26
=   ->   %3D

Questo ha funzionato senza problemi per un sito, grazie! Tuttavia, per un altro sito che utilizza AJAX (penso) non funziona ancora (potrei sbagliare); c'è qualcosa che cambierebbe se il get / post-cosa è gestito da AJAX?
pazzo per la schifezza del

6

Se stai cercando una soluzione cross-browser che non deve fare affidamento su componenti aggiuntivi o file esterni, Javascript può essere inserito direttamente in un segnalibro per raggiungere questo obiettivo, usando questa sintassi:

javascript:(function(){ <Your Javascript code goes here> })();

Prendendo in prestito un po 'di codice dalla risposta di Denis per illustrare:

javascript:(function()
{ 
var form = document.getElementsByTagName('form')[0];
form.style.visibility = 'hidden';
form.method = 'post';
form.action = 'https://your.urlgoes.here/build?delay=0sec';
var search = 'name=ENVIRONMENT&value=production&name=DEPLOYTYPE&value=Incremental&name=BRANCH&value=master&statusCode=303&redirectTo=.&json={"parameter": [{"name": "ENVIRONMENT", "value": "production"}, {"name": "DEPLOYTYPE", "value": "Incremental"}, {"name": "BRANCH", "value": "master"}], "statusCode": "303", "redirectTo": "."}&Submit=Build';
search = search.substr(1).split('&');
for(var i = 0, j = search.length, input; i < j; i++)
{
input = document.createElement('input');
search[i] = search[i].split('=');
input.name = search[i][0];
input.value = search[i][1];
form.appendChild(input);
}
 form.submit();}
)();

Il rovescio della medaglia è che tutto questo deve andare su una sola riga, perché un segnalibro è una riga singola, quindi può farti piegare un po 'la mente. Questo va nel segnalibro stesso:

javascript:(function(){    var form = document.getElementsByTagName('form')[0];   form.style.visibility = 'hidden';   form.method = 'post';   form.action = 'https://your.urlgoes.here/build?delay=0sec';   var search = 'name=ENVIRONMENT&value=production&name=DEPLOYTYPE&value=Incremental&name=BRANCH&value=master&statusCode=303&redirectTo=.&json={"parameter": [{"name": "ENVIRONMENT", "value": "production"}, {"name": "DEPLOYTYPE", "value": "Incremental"}, {"name": "BRANCH", "value": "master"}], "statusCode": "303", "redirectTo": "."}&Submit=Build';   search = search.substr(1).split('&');   for(var i = 0, j = search.length, input; i < j; i++)   {   input = document.createElement('input');   search[i] = search[i].split('=');   input.name = search[i][0];   input.value = search[i][1];   form.appendChild(input);   }    form.submit();   })();

Un certo numero di spazi può essere utilizzato per convertire facilmente in qualcosa di più leggibile e tornare alla riga singola. Nell'esempio sopra "" può essere sostituito con \ r \ n in qualcosa come Notepad ++ per riconvertirlo in multi linea. Quindi per riconvertirlo in riga singola, trovare e sostituire per \ r \ n sostituendolo con "" lo converte in riga singola. Ciò rende leggermente meno piegare la mente ...


3

Basandosi sulle altre risposte!

La versione di debug del codice, oltre a cleanup AND jsbeautifier.org/.

(function() {
    var ThisAction = 'https://your.urlgoes.here/build?delay=0sec';
    /* A little JSON never hurt anyone */
    var ThisPost = {
        name: 'ENVIRONMENT',
        value: 'production',
        name: 'DEPLOYTYPE',
        value: 'Incremental',
        name: 'BRANCH',
        value: 'master',
        statusCode: '303',
        redirectTo: '.',
        json: '{"parameter": [{"name": "ENVIRONMENT", "value": "production"}, {"name": "DEPLOYTYPE", "value": "Incremental"}, {"name": "BRANCH", "value": "master"}], "statusCode": "303", "redirectTo": "."}',
        Submit: 'Build'
    };

    /* Help us locate this function */
    console.trace();
    /* See what we are looking at */
    console.log(document);
    var form = document.getElementsByTagName('form')[0];
    form.style.visibility = 'hidden';
    form.method = 'post';
    form.action = ThisAction;
    for (var key in ThisPost) {
        if (ThisPost.hasOwnProperty(key)) {
            input = document.createElement('input');
            input.name = key;
            input.value = ThisPost[key];
            form.appendChild(input);
        }
    }
    /* form.submit(); */
})();

Ovviamente senza l'html corrispondente, l'elemento con il nome del tag 'form' potrebbe non esistere ... e le cose vanno peggio se lo fa. Quanto sopra lo dimostra bene. Nota che in chromium javascript: gli URI / i segnalibri non funzionano in una nuova scheda, devi prima navigare. Questo popola l'oggetto documento, ma anche solo un javascript: alert ('t'); non fa nulla.

Suggerisco quanto segue.

(function() {
    var ThisAction = 'https://your.urlgoes.here/build?optional=uri_get';
    /* A little JSON never hurt anyone */
    var ThisPost = {
        multiple: 'value',
        key: 'pairs',
        or: 'JSON like so...',
        note: 'the double quotes and last item with NO trailing comma.',
        json: '{parameter: [{name: "stuff"}]}'
    };

    var form = document.createElement('form');
    form.style.visibility = 'hidden';
    form.method = 'post';
    form.action = ThisAction;
    for (var key in ThisPost) {
        if (ThisPost.hasOwnProperty(key)) {
            var input = document.createElement('input');
            input.name = key;
            input.value = ThisPost[key];
            form.appendChild(input);
        }
    }
    document.body.appendChild(form);
    form.submit();
})();

Rimuovere le impostazioni di debug, ripulire l'input di esempio per una migliore chiarezza di ciò che è previsto. Esegui http://jscompress.com/ o qualsiasi altra cosa e ottieni una sola riga.

!function(){var e="https://your.urlgoes.here/build?optional=uri_get",t={multiple:"value",key:"pairs",or:"JSON like so...",note:"the double quotes and last item with NO trailing comma.",json:'{parameter: [{name: "stuff"}]}'},i=document.createElement("form");i.style.visibility="hidden",i.method="post",i.action=e;for(var o in t)if(t.hasOwnProperty(o)){var a=document.createElement("input");a.name=o,a.value=t[o],i.appendChild(a)}document.body.appendChild(i),i.submit()}();

Modifica: fornisce un esempio funzionante.

A Minneapolis, MN, USA, utilizzalo per accedere al WiFi gratuito ESSID "USIW Free WiFi". Dopo aver utilizzato https://login.usiwireless.com/mplsfree/logon.php?originalurl=www.google.com/ per registrare un account, desiderano una carta di credito per motivi di abuso.

Usa questo per accedere alla rete, con ovvie sostituzioni.

javascript:!function(){var e="https://login.usiwireless.com/mplsfree/logon.pl",o={usernameLogin:"USER",passwordLogin:"PASSWORD",originalurl:"www.google.com/"},n=document.createElement("form");n.style.visibility="hidden",n.method="post",n.action=e;for(var i in o)if(o.hasOwnProperty(i)){var t=document.createElement("input");t.name=i,t.value=o[i],n.appendChild(t)}document.body.appendChild(n),n.submit()}();

3

Una versione più breve dell'approccio bookmarklet javascript che utilizza le moderne funzionalità del browser ed ES6:

post('https://example.com', {foo: 'bar'})

function post(url, formData) {
  const makeElem = (tag, props) => Object.assign(document.createElement(tag), props)
  const form = makeElem('form', { action: url, method: 'post', style: 'display: none' })
  for (const [name, value] of Object.entries(formData)) {
    form.appendChild(makeElem('input', { name, value }))
  }
  document.body.appendChild(form)
  form.submit()
}

Impostare quanto segue come destinazione del segnalibro e sostituire URL e formData in modo appropriato.

javascript:post('https://example.com',{foo:'bar'});function post(a,b){const c=(e,f)=>Object.assign(document.createElement(e),f),d=c('form',{action:a,method:'post',style:'display: none'});for(const[e,f]of Object.entries(b))d.appendChild(c('input',{name:e,value:f}));document.body.appendChild(d),d.submit()}

0

Quando ho riscontrato lo stesso problema, ho trovato questo bellissimo componente aggiuntivo per Firefox: Bookmark POST

Con quel segnalibro i suoi quattro semplici passaggi per la tua richiesta POST con segnalibro (non è richiesto javascript):

  1. Apri la pagina con il modulo che desideri aggiungere ai segnalibri e compila il modulo in modo "tipico". NON inviare ancora.
  2. Apri gli Strumenti per sviluppatori Web -> Analisi di rete.
  3. Invia il tuo modulo. L'invio verrà visualizzato nell'analisi della rete. Lì puoi selezionare "Modifica e invia di nuovo" e copiare il "Corpo della richiesta".
  4. Creare un segnalibro nella pagina del modulo e aggiungere la stringa POSTDATA={YOUR_REQUEST_BODY_HERE}come descrizione dei segnalibri .

0

So che questa è una vecchia domanda con una risposta accettata. Questa risposta è piuttosto manuale, ma richiede uno sforzo di programmazione javascript per l'utente. Sono elencati altri componenti aggiuntivi / estensioni / plug-in del browser ma non funzionano con l'ultima versione del browser o sono ancora abbastanza manuali. Ho scritto un bookmarklet che genera un bookmarklet (che include il codice modificato dalla risposta di @ raphinesse). Il mio bookmarklet è qui: https://github.com/GlenCoakley/createFormSubmittingBookmarklets .

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.