Cómo leer los parámetros de la solicitud de publicación usando JavaScript


92

Estoy tratando de leer los parámetros de la solicitud de publicación desde mi HTML. Puedo leer los parámetros de solicitud de obtención usando el siguiente código en JavaScript.

$wnd.location.search

Pero no funciona para solicitudes posteriores. ¿Alguien puede decirme cómo leer los valores del parámetro de solicitud de publicación en mi HTML usando JavaScript?

Respuestas:


184

Los datos POST son datos que se manejan en el lado del servidor . Y Javascript está del lado del cliente. Por lo tanto, no hay forma de que pueda leer los datos de una publicación usando JavaScript.


69
Aunque la conclusión es correcta (no puede obtener esos datos de javascript), el razonamiento es incorrecto. El cliente (el navegador) es el que envía los datos POST al servidor en primer lugar. Entonces el cliente sabe muy bien cuáles son esos datos. La razón real es simplemente que el navegador no pone esos datos a disposición de JavaScript (pero perfectamente podría hacerlo).
GetFree el

@GetFree: ¿De qué sirve este supuesto conocimiento de las variables POST para un desarrollador web? Ningún desarrollador web escribirá un script del lado del cliente basado en el navegador que posiblemente haga que los datos de la publicación estén disponibles para JavaScript ya que, como usted señala, nunca sucede en la práctica . Por lo tanto, en el mundo real , la respuesta que se presenta aquí es correcta, así como la mía.
Platinum Azure

34
@PlatinumAzure, no estoy seguro de que entiendas el punto. Dice que los datos POST existen en el servidor y, dado que javascript se ejecuta en el cliente, no hay forma de que JS pueda acceder a esos datos. Eso está mal, los datos POST existen tanto en el cliente como en el servidor y la razón por la que JS no puede acceder a esos datos es simplemente porque el cliente (el navegador) no los pone a disposición de JS. Tan sencillo como eso.
GetFree

13
@PlatinumAzure, Sí, no se puede hacer por ningún motivo. Pero si va a explicar cuál es esa razón, asegúrese de que sea la razón correcta. Tu explicación de por qué no es posible está mal, ese es el punto.
GetFree

10
Dado que los navegadores obtienen cosas como aplicaciones web, aplicaciones que se ejecutan (a menudo) al 100 por ciento en el navegador (sin servidor, que no sea el alojamiento de archivos), se convertirá en una necesidad natural poder recibir grandes cantidades de datos. Hay un límite en el tamaño de la cadena de consulta (método GET) (piense en 4K), por lo que la capacidad de leer fragmentos más grandes de datos POSTED desde javascript sería una gran idea en mi humilde opinión.
Netsi1964

26

Un pequeño fragmento de PHP para que el servidor complete una variable de JavaScript es rápido y fácil:

var my_javascript_variable = <?php echo json_encode($_POST['my_post'] ?? null) ?>;

Luego acceda a la variable JavaScript de la forma habitual.

Tenga en cuenta que no hay garantía de que se publiquen datos o tipos de datos a menos que usted marque: todos los campos de entrada son sugerencias, no garantías.


12
Tenga cuidado de escapar / agregar comillas / etc. a sus datos POST si sigue esta ruta. Una alternativa es usar json_encode (), que funcionará para prácticamente cualquier tipo de datos. Ejemplo: abeautifulsite.net/passing-data-from-php-to-javascript
claviska

Ahora, esto es lo que yo llamo pensar fuera de la caja.
I.Am.A.Guy

Esta es la forma más sencilla de hacer esto con seguridad. Esto funcionó para mí en wordpress creando una nueva página de tema y simplemente exponiendo los datos de la publicación en el nivel de la ventana como window.my_prefix_post_data = <? Php echo $ _POST ['my_post']?>; y luego acceder a los datos de la publicación desde cualquier ámbito fácilmente de esa manera. Esto no sería recomendable para sitios con una gran cantidad de datos de publicaciones confidenciales que se procesan todo el tiempo, pero para el alcance de nuestra página / sitio funciona muy bien.
OG Sean

2
esto no es viable, podría haber un problema de escape del personaje.
MathieuAuclair

1
Hackeado, seguro. No use el método anterior sin escapar.
reggie

10

JavaScript es un lenguaje de programación del lado del cliente, lo que significa que todo el código se ejecuta en la máquina del usuario web. Las variables POST, por otro lado, van al servidor y residen allí. Los navegadores no proporcionan esas variables al entorno de JavaScript, ni ningún desarrollador debe esperar que estén allí mágicamente.

Dado que el navegador no permite que JavaScript acceda a los datos POST, es prácticamente imposible leer las variables POST sin que un actor externo como PHP haga eco de los valores POST en una variable de script o una extensión / complemento que capture los valores POST en tránsito. Las variables GET están disponibles a través de una solución alternativa porque están en la URL que puede ser analizada por la máquina cliente.


3
Enfáticamente no estoy de acuerdo con tu -1. En ninguna parte del OP la pregunta especificó AJAX, por lo que deja abierta la posibilidad de clics en enlaces y envíos de formularios no realizados por JavaScript. Este último en particular es un ejemplo en el que existen variables POST pero no están disponibles en el lado del cliente, a menos que la respuesta del servidor sea generada por un script y el script elija hacer eco de los valores de las variables POST en el código JS. Si pudiera -1 tu comentario, lo haría.
Platinum Azure

2
No estoy hablando de AJAX. Mi argumento se refiere a cualquier forma de solicitud POST. El navegador conoce todos los parámetros enviados como parte de la solicitud HTTP, que incluye, entre otros, la URL y los parámetros POST. Algunos de esos parámetros están disponibles para JavaScript, otros no. Es simplemente una restricción impuesta por el navegador, bien podría dar acceso a los parámetros POST de JS, pero no es así, esa es la verdad.
GetFree

1
No entiendes mi punto. Nadie escribirá un JavaScript esperando que las variables POST estén disponibles a menos que el servidor las proporcione explícitamente. Si el servidor no los proporciona, entonces, en lo que respecta a un desarrollador web que escribe código JavaScript, es posible que no esté del lado del cliente en absoluto.
Platinum Azure

1
En tu respuesta dices que no es posible, lo cual es correcto. Pero también explica por qué no es posible. Esa explicación es incorrecta. Es por eso que obtienes un -1
GetFree

3
Mi explicación fue incompleta, no incorrecta. He editado mi respuesta para que incluso tú estés feliz. Si no es así, en lugar de darme -1 y comentarios sarcásticos, edítelo usted mismo.
Platinum Azure

9

Utilice sessionStorage!

$(function(){
    $('form').submit{
       document.sessionStorage["form-data"] =  $('this').serialize();
       document.location.href = 'another-page.html';
    }
});

En otra página.html:

var formData = document.sessionStorage["form-data"];

Enlace de referencia: https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage


Un error tipográfico: sumbit.
Alejandro Salamanca Mazuelo

¿Qué pasa si la solicitud de publicación proviene de un subdominio u otro dominio? Concepción rota.
indefinido

Debería serform.on('submit',function(){document.sessionStorage["form-data"] = $('this').serialize();window.location.href = 'another-page.html';})
Justin Liu

@ZefirZdravkov Puede configurar una cookie con Chrome samesite = Noney Secureasí permitir su uso.
Justin Liu

6

¿Por qué no utilizar localStorage o cualquier otra forma de establecer el valor que le gustaría pasar?

¡De esa manera tendrá acceso a él desde cualquier lugar!

Por cualquier lugar me refiero dentro del dominio / contexto dado


2
¿Por qué no una simple galleta?
jj_

1
¿Qué pasa si la solicitud de publicación proviene de un subdominio u otro dominio? Concepción rota.
indefinido

@ZefirZdravkov, aunque estoy de acuerdo con usted sobre la existencia de la limitación dada, existe debido a implementaciones de seguridad basadas en navegador. Solo puedo imaginar el horror ilimitado si fuera un escenario de 'cualquier sitio puede leer el contenido de cualquier otro'.
Ian Mbae

@Ian Cualquier sitio puede leer el contenido de cualquier otro a través de CURL o Ajax. Si se refiere a 'almacenamiento local de cualquier otro sitio', entonces, sí, sería abominable. Todo lo que digo es que esta respuesta solo funcionaría si está recibiendo / enviando solicitudes POST solo a este dominio. Por ejemplo, una solicitud POST de cloudianos.comno llegaría api.cloudianos.comal JavaScript, ya que no comparten lo mismo localStorage.
Indefinido

2

Puede leer el parámetro de solicitud de publicación con jQuery-PostCapture ( @ ssut / jQuery-PostCapture ).

El complemento PostCapture consta de algunos trucos.

Cuando hagas clic en el botón Enviar, onsubmitse enviará el evento.

En ese momento, PostCapture serializará los datos del formulario y los guardará en html5 localStorage (si está disponible) o en el almacenamiento de cookies.


Esto solo funcionará para envíos de publicaciones entre el mismo dominio (los subdominios tampoco funcionarán)
indefinido

1

POST es lo que el navegador envía desde el cliente (su navegador) al servidor web. Los datos de publicación se envían al servidor a través de encabezados http, y están disponibles solo en el extremo del servidor o entre la ruta (ejemplo: un servidor proxy) desde el cliente (su navegador) al servidor web. Por lo tanto, no se puede manejar desde scripts del lado del cliente como JavaScript. Debe manejarlo a través de scripts del lado del servidor como CGI, PHP, Java, etc. Si aún necesita escribir en JavaScript, debe tener un servidor web que comprenda y ejecute JavaScript en su servidor como Node.js


1

Si está trabajando con una API de Java / REST, una solución alternativa es fácil. En la página JSP puede hacer lo siguiente:

    <%
    String action = request.getParameter("action");
    String postData = request.getParameter("dataInput");
    %>
    <script>
        var doAction = "<% out.print(action); %>";
        var postData = "<% out.print(postData); %>";
        window.alert(doAction + " " + postData);
    </script>

1
<script>
<?php
if($_POST) { // Check to make sure params have been sent via POST
  foreach($_POST as $field => $value) { // Go through each POST param and output as JavaScript variable
    $val = json_encode($value); // Escape value
    $vars .= "var $field = $val;\n";
  }
  echo "<script>\n$vars</script>\n";
}
?>
</script>

O utilícelo para ponerlos en un diccionario que una función podría recuperar:

<script>
<?php
if($_POST) {
  $vars = array();
  foreach($_POST as $field => $value) {
    array_push($vars,"$field:".json_encode($value)); // Push to $vars array so we can just implode() it, escape value
  }
  echo "<script>var post = {".implode(", ",$vars)."}</script>\n"; // Implode array, javascript will interpret as dictionary
}
?>
</script>

Luego en JavaScript:

var myText = post['text'];

// Or use a function instead if you want to do stuff to it first
function Post(variable) {
  // do stuff to variable before returning...
  var thisVar = post[variable];
  return thisVar;
}

Este es solo un ejemplo y no debe usarse para ningún dato sensible como una contraseña, etc. El método POST existe por una razón; enviar datos de forma segura al backend, por lo que frustraría el propósito.

Pero si solo necesita un montón de datos de formulario no confidenciales para ir a su página siguiente sin /page?blah=value&bleh=value&blahbleh=valuesu URL, esto lo haría para una URL más limpia y su JavaScript puede interactuar inmediatamente con sus datos POST.


1

Tengo un código simple para hacerlo:

En su index.php:

<input id="first_post_data" type="hidden" value="<?= $_POST['first_param']; ?>"/>

En su main.js:

let my_first_post_param = $("#first_post_data").val();

Entonces, cuando incluya main.js en index.php ( <script type="text/javascript" src="./main.js"></script>), podría obtener el valor de su entrada oculta que contiene los datos de su publicación.


0

Puede 'json_encode' para codificar primero sus variables de publicación a través de PHP. Luego cree un objeto JS (matriz) a partir de las variables de publicación codificadas en JSON. Luego use un bucle de JavaScript para manipular esas variables ... Como, en este ejemplo a continuación, para completar un formulario HTML:

<script>

    <?php $post_vars_json_encode =  json_encode($this->input->post()); ?>

    // SET POST VALUES OBJECT/ARRAY
    var post_value_Arr = <?php echo $post_vars_json_encode; ?>;// creates a JS object with your post variables
    console.log(post_value_Arr);

    // POPULATE FIELDS BASED ON POST VALUES
    for(var key in post_value_Arr){// Loop post variables array

        if(document.getElementById(key)){// Field Exists
            console.log("found post_value_Arr key form field = "+key);
            document.getElementById(key).value = post_value_Arr[key];
        }
    }


</script>

0

Una opción es configurar una cookie en PHP.

Por ejemplo: una cookie denominada no válida con el valor de $invalidcaducar en 1 día:

setcookie('invalid', $invalid, time() + 60 * 60 * 24);

Luego, vuelva a leerlo en JS (usando el complemento JS Cookie ):

var invalid = Cookies.get('invalid');

if(invalid !== undefined) {
    Cookies.remove('invalid');
}

Ahora puede acceder al valor de la invalidvariable en JavaScript.


0

Depende de lo que defina como JavaScript. Actualmente tenemos JS en programas del lado del servidor como NodeJS. Es exactamente el mismo JavaScript que codifica en su navegador, excepto como idioma del servidor. Entonces puedes hacer algo como esto: ( Código de Casey Chu: https://stackoverflow.com/a/4310087/5698805 )

var qs = require('querystring');

function (request, response) {
    if (request.method == 'POST') {
        var body = '';

        request.on('data', function (data) {
            body += data;

            // Too much POST data, kill the connection!
            // 1e6 === 1 * Math.pow(10, 6) === 1 * 1000000 ~~~ 1MB
            if (body.length > 1e6)
                request.connection.destroy();
        });

        request.on('end', function () {
            var post = qs.parse(body);
            // use post['blah'], etc.
        });
    }
}

Y de ahí su uso, post['key'] = newVal;etc ...


-1

Las variables POST solo están disponibles para el navegador si ese mismo navegador las envió en primer lugar. Si otro formulario de sitio web se envía a través de POST a otra URL, el navegador no verá los datos de POST.

SITIO A: tiene un formulario enviado a una URL externa (sitio B) usando POST SITE B: recibirá al visitante pero solo con variables GET


-1
function getParameterByName(name, url) {
            if (!url) url = window.location.href;
            name = name.replace(/[\[\]]/g, "\\$&");
            var regex = new RegExp("[?&]" + name + "(=([^&#]*)|&|#|$)"),
                results = regex.exec(url);
            if (!results) return null;
            if (!results[2]) return '';
            return decodeURIComponent(results[2].replace(/\+/g, " "));
        }
var formObj = document.getElementById("pageID");
formObj.response_order_id.value = getParameterByName("name");

Esta es la variable GET, OP solicitó específicamente POST var y señaló que ya tiene variables GET fácilmente.
OG Sean

-3
$(function(){
    $('form').sumbit{
        $('this').serialize();
    }
});

En jQuery, el código anterior le daría la cadena de URL con los parámetros POST en la URL. No es imposible extraer los parámetros POST.

Para usar jQuery , debe incluir la biblioteca jQuery. Utilice lo siguiente para eso:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js" type="text/javascript"></script>

4
Esto sólo obtendría los parámetros de entrada de la página donde la forma se presenta a partir . Parece una suposición segura el PO quiere obtener parámetros POST en la página del formulario se ha enviado a . Eso es imposible de hacer.
John Washam

-3

Podemos recopilar los parámetros de formulario enviados mediante POST con el concepto de serialización .

Prueba esto:

$('form').serialize(); 

Solo adjúntelo alerta, muestra todos los parámetros incluidos los ocultos.


-4
<head><script>var xxx = ${params.xxx}</script></head>

Usando la expresión EL $ {param.xxx} <head>para obtener los parámetros de un método de publicación, y asegúrese de que el archivo js esté incluido después <head>para que pueda manejar un parámetro como 'xxx' directamente en su archivo js.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.