Comment lire les paramètres de demande de publication à l'aide de JavaScript

92

J'essaye de lire les paramètres de demande de publication de mon HTML. Je peux lire les paramètres de demande d'obtention en utilisant le code suivant en JavaScript.

$wnd.location.search

Mais cela ne fonctionne pas pour la demande de publication. Quelqu'un peut-il me dire comment lire les valeurs des paramètres de demande de publication dans mon HTML à l'aide de JavaScript?

DonX
la source

Réponses:

184

Les données POST sont des données gérées côté serveur . Et Javascript est du côté client. Il n'y a donc aucun moyen de lire les données d'une publication en utilisant JavaScript.

rahul
la source
69
Bien que la conclusion soit correcte (vous ne pouvez pas obtenir ces données à partir de javascript), le raisonnement est faux. Le client (le navigateur) est celui qui envoie les données POST au serveur en premier lieu. Le client sait donc très bien quelles sont ces données. La raison réelle est simplement que le navigateur ne rend pas ces données disponibles pour javascript (mais cela pourrait parfaitement le faire).
GetFree
@GetFree: À quoi sert cette soi-disant connaissance des variables POST pour un développeur Web? Aucun développeur Web n'écrira un script côté client basé sur le navigateur, rendant éventuellement les données de publication disponibles pour JavaScript car, comme vous le faites remarquer, cela ne se produit jamais dans la pratique . Ainsi, dans le monde réel , la réponse présentée ici est correcte, ainsi que la mienne.
Platinum Azure
34
@PlatinumAzure, je ne suis pas sûr que vous compreniez le point. Vous dites que les données POST existent sur le serveur, et puisque javascript s'exécute dans le client, il n'y a aucun moyen que JS puisse accéder à ces données. C'est faux, les données POST existent à la fois dans le client et le serveur et la raison pour laquelle JS ne peut pas accéder à ces données est simplement parce que le client (le navigateur) ne les met pas à la disposition de JS. Aussi simple que cela.
GetFree
13
@PlatinumAzure, oui, cela ne peut pas être fait pour une raison quelconque. Mais si vous voulez expliquer quelle est cette raison, assurez-vous que c'est la bonne raison. Vous expliquez pourquoi ce n'est pas possible est faux, c'est le point.
GetFree
10
Étant donné que les navigateurs obtiennent des éléments tels que des applications Web, des applications exécutées (souvent) à 100% dans le navigateur (pas de serveur, autre que l'hébergement de fichiers), il deviendra un besoin naturel de pouvoir recevoir de plus grandes quantités de données. Il y a une limite sur la taille de la chaîne de requête (méthode GET) (pensez à 4K), donc la possibilité de lire de plus gros morceaux de données POSTED à partir de javascript serait une excellente idée à mon humble avis.
Netsi1964
26

Un petit morceau de PHP pour que le serveur remplisse une variable JavaScript est simple et rapide:

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

Ensuite, accédez simplement à la variable JavaScript de la manière habituelle.

Notez qu'il n'y a aucune garantie que des données ou types de données donnés seront affichés à moins que vous ne vérifiiez - tous les champs de saisie sont des suggestions, pas des garanties.

Roger
la source
12
Faites attention à échapper / ajouter des guillemets / etc. à vos données POST si vous suivez cette voie. Une alternative est d'utiliser json_encode (), qui fonctionnera pour pratiquement tous les types de données. Exemple: abeautifulsite.net/passing-data-from-php-to-javascript
claviska
Maintenant, c'est ce que j'appelle penser hors de la boîte.
I.Am.A.Guy
C'est le moyen le plus simple de le faire à coup sûr. Cela a fonctionné pour moi dans wordpress en créant une nouvelle page de thème et en exposant simplement les données de publication au niveau de la fenêtre comme window.my_prefix_post_data = <? Php echo $ _POST ['my_post']?>; puis accéder facilement aux données de publication à partir de n'importe quelle portée. Cela ne serait pas recommandé pour les sites avec beaucoup de données de publication sensibles en permanence, mais pour la portée de notre page / site, cela fonctionne très bien.
OG Sean
2
ce n'est pas viable, il pourrait y avoir un problème de fuite de personnage.
MathieuAuclair
1
Hacké, bien sûr. N'utilisez pas la méthode ci-dessus sans échapper.
reggie
10

JavaScript est un langage de script côté client, ce qui signifie que tout le code est exécuté sur la machine de l'utilisateur Web. Les variables POST, par contre, vont au serveur et y résident. Les navigateurs ne fournissent pas ces variables à l'environnement JavaScript, et aucun développeur ne devrait s'attendre à ce qu'elles soient là comme par magie.

Étant donné que le navigateur interdit à JavaScript d'accéder aux données POST, il est pratiquement impossible de lire les variables POST sans qu'un acteur extérieur comme PHP ne fasse écho aux valeurs POST dans une variable de script ou une extension / addon qui capture les valeurs POST en transit. Les variables GET sont disponibles via une solution de contournement car elles sont dans l'URL qui peut être analysée par l'ordinateur client.

Platine Azure
la source
3
Je suis catégoriquement en désaccord avec votre -1. Nulle part dans l'OP la question ne spécifiait AJAX, ce qui laisse ouverte la possibilité de clics sur les liens et d'envois de formulaires non effectués par JavaScript. Ce dernier en particulier est un exemple où des variables POST existent mais ne sont pas disponibles côté client, à moins que la réponse du serveur ne soit générée par un script et que le script choisisse de faire écho aux valeurs des variables POST dans le code JS. Si je pouvais - votre commentaire, je le ferais.
Platinum Azure
2
Je ne parle pas d'AJAX. Mon argument se réfère à toute forme de demande POST. Le navigateur connaît chaque paramètre envoyé dans le cadre de la requête HTTP, qui comprend, entre autres, l'URL et les paramètres POST. Certains de ces paramètres sont disponibles pour javascript, d'autres ne le sont pas. C'est simplement une restriction imposée par le navigateur, cela pourrait très bien donner accès aux paramètres POST de JS, mais ce n'est pas le cas, c'est la simple vérité.
GetFree
1
Vous ne comprenez pas mon point. Personne n'écrira un JavaScript en s'attendant à ce que les variables POST soient disponibles à moins que le serveur ne les fournisse explicitement. Si le serveur ne les fournit pas, alors en ce qui concerne un développeur Web qui écrit du code JavaScript, ils pourraient tout aussi bien ne pas être du tout côté client.
Platinum Azure
1
Dans votre réponse, vous dites que ce n'est pas possible, ce qui est exact. Mais vous expliquez aussi pourquoi ce n'est pas possible. Cette explication est fausse. C'est pourquoi vous obtenez un -1
GetFree
3
Mon explication était incomplète, pas fausse. J'ai édité ma réponse pour que même vous soyez heureux. Si ce n'est pas le cas, au lieu de me donner -1 et des commentaires sournois, modifiez-le vous-même.
Platinum Azure du
9

Utilisez sessionStorage!

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

Sur une autre page.html:

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

Lien de référence - https://developer.mozilla.org/en-US/docs/Web/API/Window/sessionStorage

Alexandre Parpinelli
la source
Une faute de frappe: sumbit.
Alejandro Salamanca Mazuelo
Que faire si la demande de publication provient d'un sous-domaine ou d'un autre domaine? Conception éclatée.
undefined
Ça devrait êtreform.on('submit',function(){document.sessionStorage["form-data"] = $('this').serialize();window.location.href = 'another-page.html';})
Justin Liu
@ZefirZdravkov Vous pouvez définir un cookie avec samesite = Noneet Secureainsi chrome autorise son utilisation.
Justin Liu
6

Pourquoi ne pas utiliser localStorage ou tout autre moyen pour définir la valeur que vous souhaitez transmettre?

De cette façon, vous y avez accès de n'importe où!

Par n'importe où, je veux dire dans le domaine / contexte donné

Ian Mbae
la source
2
pourquoi pas juste un simple cookie?
jj_
1
Que faire si la demande de publication provient d'un sous-domaine ou d'un autre domaine? Conception éclatée.
undefined
@ZefirZdravkov, bien que je sois d'accord avec vous sur l'existence de la limitation donnée, elle existe en raison des implémentations de sécurité basées sur le navigateur. Je ne peux imaginer l'horreur sans limites que s'il s'agissait d'un scénario «n'importe quel site peut lire le contenu de n'importe quel autre».
Ian Mbae
@Ian N'importe quel site peut lire le contenu de n'importe quel autre via CURL ou Ajax. Si vous vous référez à «localStorage d'un autre site», alors, oui, ce serait abominable. Tout ce que je dis, c'est que cette réponse ne fonctionnera que si vous recevez / envoyez des demandes POST à ​​ce domaine uniquement. Par exemple, une requête POST de cloudianos.comn'atteindrait pas api.cloudianos.comle JavaScript de, car ils ne partagent pas le même localStorage.
undefined
2

Vous pouvez lire le paramètre de demande de publication avec jQuery-PostCapture ( @ ssut / jQuery-PostCapture ).

Le plugin PostCapture est composé de quelques astuces.

Lorsque vous cliquez sur le bouton Soumettre, l' onsubmitévénement sera distribué.

À ce moment-là, PostCapture sérialisera les données du formulaire et les sauvegardera dans html5 localStorage (si disponible) ou dans le stockage des cookies.

ssut
la source
Cela ne fonctionnera que pour les soumissions d'articles entre le même domaine (les sous-domaines ne fonctionneront pas non plus)
undefined
1

POST est ce que le navigateur envoie du client (votre broswer) au serveur Web. Les données de publication sont envoyées au serveur via les en-têtes http, et elles sont disponibles uniquement à l'extrémité du serveur ou entre le chemin (exemple: un serveur proxy) du client (votre navigateur) au serveur Web. Il ne peut donc pas être géré à partir de scripts côté client comme JavaScript. Vous devez le gérer via des scripts côté serveur comme CGI, PHP, Java, etc. Si vous avez encore besoin d'écrire en JavaScript, vous devez avoir un serveur Web qui comprend et exécute JavaScript sur votre serveur comme Node.js

Kiranvj
la source
1

Si vous travaillez avec une API Java / REST, une solution de contournement est simple. Dans la page JSP, vous pouvez effectuer les opérations suivantes:

    <%
    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>
user3260912
la source
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>

Ou utilisez-le pour les mettre dans un dictionnaire qu'une fonction pourrait récupérer:

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

Puis 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;
}

Ceci n'est qu'un exemple et ne doit pas être utilisé pour des données sensibles comme un mot de passe, etc. La méthode POST existe pour une raison; pour envoyer des données en toute sécurité au backend, ce qui irait à l'encontre de l'objectif.

Mais si vous avez juste besoin d'un tas de données de formulaire non sensibles pour accéder à votre page suivante sans /page?blah=value&bleh=value&blahbleh=valuevotre URL, cela créerait une URL plus propre et votre JavaScript pourrait interagir immédiatement avec vos données POST.

internetgho5t
la source
1

J'ai un code simple pour le faire:

Dans votre index.php:

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

Dans votre main.js:

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

Ainsi, lorsque vous incluez main.js dans index.php ( <script type="text/javascript" src="./main.js"></script>), vous pouvez obtenir la valeur de votre entrée masquée qui contient vos données de publication.

Louis Hervé
la source
0

Vous pouvez «json_encode» pour encoder d'abord vos variables de publication via PHP. Créez ensuite un objet JS (tableau) à partir des variables de publication codées JSON. Ensuite, utilisez une boucle JavaScript pour manipuler ces variables ... Comme - dans cet exemple ci-dessous - pour remplir un formulaire 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>
TV-C-15
la source
0

Une option consiste à définir un cookie en PHP.

Par exemple: un cookie nommé invalide avec la valeur $invalidexpirant dans 1 jour:

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

Ensuite, relisez-le dans JS (en utilisant le plugin JS Cookie ):

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

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

Vous pouvez maintenant accéder à la valeur de la invalidvariable en JavaScript.

Danny Beckett
la source
0

Cela dépend de ce que vous définissez comme JavaScript. Aujourd'hui, nous avons JS dans des programmes côté serveur tels que NodeJS. C'est exactement le même JavaScript que vous codez dans votre navigateur, sauf en tant que langage serveur. Vous pouvez donc faire quelque chose comme ceci: ( Code 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.
        });
    }
}

Et de là utiliser post['key'] = newVal;etc ...

William R.
la source
-1

Les variables POST ne sont disponibles pour le navigateur que si ce même navigateur les a envoyées en premier lieu. Si un autre formulaire de site Web est soumis via POST à ​​une autre URL, le navigateur ne verra pas les données POST entrer.

SITE A: a un formulaire soumis à une URL externe (site B) en utilisant POST SITE B: recevra le visiteur mais avec uniquement des variables GET

Chris Denman
la source
-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");
le cuong
la source
Il s'agit de la variable GET, OP a spécifiquement demandé la variable POST et a noté qu'il avait déjà facilement des variables GET.
OG Sean
-3
$(function(){
    $('form').sumbit{
        $('this').serialize();
    }
});

Dans jQuery, le code ci-dessus vous donnerait la chaîne d'URL avec les paramètres POST dans l'URL. Il n'est pas impossible d'extraire les paramètres POST.

Pour utiliser jQuery , vous devez inclure la bibliothèque jQuery. Utilisez ce qui suit pour cela:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.1/jquery.min.js" type="text/javascript"></script>
Lapin
la source
4
Cela n'obtenir les paramètres POST sur la page où le formulaire est soumis à partir . Il semble une hypothèse sûre l'OP veut obtenir des paramètres POST sur la page du formulaire a été envoyé à . C'est impossible à faire.
John Washam
-3

Nous pouvons collecter les paramètres de formulaire soumis en utilisant POST avec le concept de sérialisation .

Essaye ça:

$('form').serialize(); 

Il suffit de le mettre en alerte, il affiche tous les paramètres, y compris caché.

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

Utilisation de l'expression EL $ {param.xxx} <head>pour obtenir les paramètres d'une méthode post, et assurez-vous que le fichier js est inclus après <head>afin que vous puissiez gérer un paramètre comme «xxx» directement dans votre fichier js.

MikeMiller
la source