Almacenar una solicitud HTTP POST en un marcador o algo similar como lo haría con una solicitud GET

26

Puede almacenar un marcador con una solicitud GET como esta:

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

¿Puedes almacenar una solicitud POST de alguna manera en Chrome? Tal vez con un complemento? O tal vez en Firefox?

La idea es que guarde esto en un marcador y lo active rápidamente en lugar de tener que completar un formulario cada vez.

Petruza
fuente
1
Dependiendo de su sistema operativo, es posible que desee utilizar curlpara enviar la solicitud POST desde un archivo
slhck
Verifique la extensión Greasemonkey, disponible para FF y Chrome.
ott--

Respuestas:

17

La idea es que guarde esto en un marcador y lo active rápidamente en lugar de tener que completar un formulario cada vez.

Para este propósito, la siguiente página HTML servirá. Debería funcionar en la mayoría de los navegadores.

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

Guárdelo como C:\getToPosty puede marcar la siguiente URL:

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

Podrá usar la mayoría de los caracteres en nombres o valores literalmente. Codifique lo siguiente como de costumbre:

#   ->   %23
%   ->   %25
&   ->   %26
=   ->   %3D
Dennis
fuente
Esto ha funcionado directamente para un sitio, gracias! Sin embargo, para otro sitio que usa AJAX (creo) todavía no funciona (podría estar haciendo algo mal); ¿hay algo que cambiaría si AJAX maneja el get / post-thing?
loco por natty
6

Si busca una solución de navegador cruzado que no necesite depender de complementos o archivos externos, Javascript se puede colocar en un marcador directamente para lograr esto, utilizando esta sintaxis:

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

Tomando prestado algún código de la respuesta de Denis para ilustrar:

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();}
)();

La desventaja es que todo esto tiene que ir en una sola línea, porque un marcador es una sola línea, por lo que puede ser un poco difícil trabajar con él. Esto va en el marcador en sí:

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();   })();

Se pueden usar varios espacios para convertir fácilmente a algo más legible y volver a la línea única. En el ejemplo anterior, "" se puede reemplazar con \ r \ n en algo como Notepad ++ para convertirlo nuevamente en multilínea. Luego, para volver a convertirlo en una sola línea, busque y reemplace para \ r \ n reemplazar con "" lo convierte de nuevo en una sola línea. Eso hace que sea un poco menos alucinante ...

jotap
fuente
3

¡Sobre la base de las otras respuestas!

La versión de depuración del código, más la limpieza Y 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(); */
})();

Obviamente, sin el html correspondiente, el elemento con el nombre de etiqueta 'form' bien podría no existir ... y las cosas son peores si lo hace. Lo anterior demuestra esto bien. Tenga en cuenta que en javascript de cromo: los URI / marcadores no funcionan en una nueva pestaña, primero debe navegar una vez. Esto llena el objeto del documento, pero incluso solo un javascript: alert ('t'); no hace nada.

Sugiero lo siguiente.

(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();
})();

Elimine la configuración de depuración, limpie la entrada de ejemplo para una mejor claridad de lo que se espera. Ejecute http://jscompress.com/ o lo que sea y obtenga una sola línea.

!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()}();

Editar: proporcione un ejemplo de trabajo.

En Minneapolis, MN, EE. UU., Use esto para acceder al WiFi gratuito ESSID "WiFi gratuito USIW". Después de usar https://login.usiwireless.com/mplsfree/logon.php?originalurl=www.google.com/ para registrar una cuenta, quieren una tarjeta de crédito por motivos de abuso.

Use esto para iniciar sesión en la red, con los reemplazos obvios.

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()}();
Mike Mestnik
fuente
3

Una versión más corta del enfoque de marcador de JavaScript usando las características modernas del navegador y 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()
}

Establezca lo siguiente como el objetivo del marcador y reemplace URL y formData apropiadamente.

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()}
raphinesse
fuente
0

Cuando me enfrenté al mismo problema, encontré este hermoso complemento para Firefox: Bookmark POST

Con ese marcador, sus cuatro pasos sencillos para su solicitud POST marcada (no se requiere JavaScript):

  1. Abra la página con el formulario que desea marcar y complete el formulario de una manera "típica". NO lo envíe aún.
  2. Abra las Herramientas para desarrolladores web -> Análisis de red.
  3. Envía tu formulario. El envío se mostrará en el análisis de red. Allí puede seleccionar "Editar y enviar nuevamente" y copiar el "Cuerpo de solicitud".
  4. Cree un marcador en la página del formulario y agregue la cadena POSTDATA={YOUR_REQUEST_BODY_HERE}como la descripción de los marcadores .
SebastianH
fuente
0

Sé que esta es una vieja pregunta con una respuesta aceptada. Sin embargo, esa respuesta es bastante manual, ya que requiere un esfuerzo de programación de JavaScript para el usuario. Hay otros complementos / extensiones / complementos del navegador enumerados, pero no funcionan con la última versión del navegador o siguen siendo bastante manuales. Escribí un bookmarklet que genera un bookmarklet (que incluye código modificado de la respuesta de @ raphinesse). Mi bookmarklet está aquí: https://github.com/GlenCoakley/createFormSubmittingBookmarklets .

Cañada
fuente