如何使用JavaScript读取发布请求参数


91

我正在尝试从HTML中读取发布请求参数。我可以使用以下JavaScript代码读取get请求参数。

$wnd.location.search

但这不适用于发布请求。谁能告诉我如何使用JavaScript读取HTML中的发布请求参数值?

Answers:


183

POST数据是在服务器端处理的数据。Javascript位于客户端。因此,您无法使用JavaScript读取帖子数据。


69
尽管结论是正确的(您无法从javascript获取数据),但推理是错误的。客户端(浏览器)是首先将POST数据发送到服务器的客户端。因此客户非常清楚这些数据是什么。实际原因仅仅是因为浏览器没有将这些数据提供给javascript(但完全可以)。
GetFree

@GetFree:所谓的POST变量知识对Web开发人员有什么好处?没有网络开发人员会在浏览器上编写客户端脚本,这可能会使帖子数据可用于JavaScript,因为如您所指出的那样,实际上它从未发生过。因此,在现实世界中,这里给出的答案以及我自己的答案都是正确的。
白金Azure

34
@PlatinumAzure,我不确定您是否明白这一点。您说POST数据存在于服务器中,并且由于javascript在客户端中运行,因此JS无法访问该数据。这是错误的,客户端和服务器中都存在POST数据,而JS无法访问该数据的原因仅仅是因为客户端(浏览器)无法将其提供给JS。就如此容易。
GetFree

13
@PlatinumAzure,是的,无论出于何种原因都无法完成。但是,如果您要解释该原因是什么,请确保这是正确的原因。您对为什么不可能的解释是错误的,这就是重点。
GetFree

10
由于浏览器正在获取Web应用程序之类的东西,因此应用程序在浏览器中(通常)100%地运行(除了托管文件之外,没有服务器),因此能够接收更大的数据块将成为自然需要。查询字符串(GET方法)的大小是有限制的(认为是4K),因此从javascript读取更大块的POSTED数据的功能将是个好主意。
Netsi1964

26

使用一小段PHP即可让服务器填充一个JavaScript变量,这是快速简便的:

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

然后只需以常规方式访问JavaScript变量即可。

请注意,除非您进行检查,否则不保证任何给定的数据或某种数据将被过帐-所有输入字段均为建议,而非保证。


12
小心转义/添加引号/等。如果您选择此路线,则将其保存到POST数据中。一种替代方法是使用json_encode(),它将几乎适用于任何数据类型。示例:abeautifulsite.net/passing-data-from-php-to-javascript
claviska

现在,这就是我所说的开箱即用的想法。
I.A.A.Guy

当然,这是最简单的方法。通过创建一个新的主题页面并简单地在窗口级别(如window.my_prefix_post_data = <?php echo $ _POST ['my_post']?>;)公开帖子数据,这在wordpress中为我工作 然后以这种方式轻松地从任何范围访问发布数据。对于不时有大量敏感帖子数据的网站,不建议使用此方法,但对于我们的页面/网站而言,它的效果很好。
OG肖恩

2
这是不可行的,可能存在字符转义问题。
MathieuAuclair'4

1
确实被黑了。不要逃避使用上面的方法。
雷吉

10

JavaScript是一种客户端脚本语言,这意味着所有代码都在Web用户的计算机上执行。另一方面,POST变量将转到服务器并驻留在该服务器上。浏览器不会将这些变量提供给JavaScript环境,任何开发人员也不应期望它们会神奇地出现在其中。

由于浏览器禁止JavaScript访问POST数据,因此如果没有外部参与者(如PHP)将POST值回显到脚本变量或捕获正在传输的POST值的扩展/附件中,则几乎不可能读取POST变量。GET变量可通过一种解决方法来使用,因为它们位于可以由客户端计算机解析的URL中。


3
我强烈不同意您的-1。在OP中没有任何问题指定AJAX,从而使链接点击和表单提交无法由JavaScript执行的可能性成为可能。后者尤其是一个示例,其中POST变量存在但在客户端不可用,除非服务器响应是通过脚本生成的,并且脚本选择将POST变量的值回显到JS代码中。如果我可以-1的意见,我会的。
白金Azure

2
我不是在谈论AJAX。我的论点涉及任何形式的POST请求。浏览器知道作为HTTP请求的一部分发送的每个参数,其中包括URL和POST参数。其中一些参数可用于javascript,而其他参数则不可用。这仅仅是浏览器施加的限制,它很可能允许从JS访问POST参数,但是事实并非如此,这很简单。
GetFree

1
你不明白我的意思。除非服务器显式提供POST变量,否则没人会编写JavaScript期望POST变量可用。如果服务器不提供它们,那么就编写JavaScript代码的Web开发人员而言,它们也可能根本不在客户端。
2013年

1
您在回答中说这是不可能的,这是正确的。但您也要解释为什么这不可能。这种解释是错误的。这就是为什么你会得到一个-1
GetFree

3
我的解释不完整,没有错。我已经对答案进行了编辑,以便您也应该开心。如果您不是,则不要给我-1并发表评论,而是自己进行编辑。
白金Azure

9

使用sessionStorage!

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

在another-page.html:

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

参考链接-https://developer.mozilla.org/zh-CN/docs/Web/API/Window/sessionStorage



如果发布请求来自子域或另一个域怎么办?构想破灭了。
不确定

它应该是 form.on('submit',function(){document.sessionStorage["form-data"] = $('this').serialize();window.location.href = 'another-page.html';})
Justin Liu

@ZefirZdravkov您可以设置一个cookie与samesite = NoneSecure因此Chrome允许它的使用。
贾斯汀·刘

6

为什么不使用localStorage或任何其他方式设置您想要传递的值?

这样,您可以从任何地方访问它!

通过 任何给定的域/上下文中,我的意思是


2
为什么不只是一个简单的cookie?
jj_

1
如果发布请求来自子域或另一个域怎么办?构想破灭了。
不确定

@ZefirZdravkov,尽管我同意给定限制的存在,但由于基于浏览器的安全性实现,因此存在该限制。我只能想象,如果这是一个“任何站点都可以读取任何其他内容”的场景,那将是无尽的恐怖。
伊恩·姆贝

@Ian任何站点实际上都可以通过CURL或Ajax读取任何其他人的内容。如果引用“任何其他站点的localStorage”,那是可恶的。我要说的是,仅当您仅将POST请求接收/发送到该域时,此答案才有效。例如,来自的POST请求cloudianos.com不会到达api.cloudianos.com的JavaScript,因为它们没有共享localStorage
不确定

2

您可以使用jQuery-PostCapture(@ ssut / jQuery-PostCapture)阅读发布请求参数。

PostCapture插件由一些技巧组成。

单击提交按钮后,onsubmit将调度该事件。

届时,PostCapture将序列化表单数据并保存到html5 localStorage(如果有)或cookie存储中。


这仅适用于同一域之间的帖子提交(子域也不起作用)
未定义,

1

POST是浏览器从客户端(您的浏览器)发送到Web服务器的内容。发布数据通过http标头发送到服务器,并且仅在服务器端或从客户端(您的浏览器)到Web服务器的路径(例如:代理服务器)之间可用。因此,无法从JavaScript之类的客户端脚本进行处理。您需要通过服务器端脚本(例如CGI,PHP,Java等)来处理它。如果仍然需要用JavaScript编写,则需要有一个网络服务器,该服务器可以理解并执行服务器中的JavaScript,例如Node.js。


1

如果您使用的是Java / REST API,则解决方法很容易。在JSP页面中,您可以执行以下操作:

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

或使用它将它们放入函数可以检索的字典中:

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

然后在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;
}

这仅是一个示例,不应将其用于任何敏感数据(例如密码等)。将数据安全地发送到后端,这样会达到目的。

但是,如果您只需要一堆不敏感的表单数据而无需/page?blah=value&bleh=value&blahbleh=value输入url,就可以进入下一页,这将使URL更加整洁,并且JavaScript可以立即与POST数据进行交互。


1

我有一个简单的代码可以做到这一点:

在您的index.php中:

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

在您的main.js中:

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

因此,当将main.js包含在index.php(<script type="text/javascript" src="./main.js"></script>)中时,您将获得包含输入数据的隐藏输入的值。


0

您可以使用json_encode首先通过PHP对发布变量进行编码。然后根据JSON编码的post变量创建一个JS对象(数组)。然后使用JavaScript循环操作这些变量...像-在下面的示例中-填充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

一种选择是在PHP中设置cookie。

例如:一个名为invalid的cookie ,其值$invalid在1天后到期:

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

然后在JS中读取它(使用JS Cookie插件):

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

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

现在,您可以从invalidJavaScript中的变量访问值。


0

这取决于您定义为JavaScript的内容。如今,实际上我们在诸如NodeJS之类的服务器端程序中都有JS。它与您在浏览器中编码的JavaScript完全相同,例如作为服务器语言。因此,您可以执行以下操作:(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.
        });
    }
}

并由此使用post['key'] = newVal;等...


-1

POST变量仅在该浏览器首先发送时才可用。如果另一个网站表单通过POST提交到另一个URL,则浏览器将看不到POST数据。

站点A:具有使用POST提交到外部URL(站点B)的表单站点B:将接收访问者,但只有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");

这是GET变量,OP专门要求POST var,并指出他已经很容易拥有GET变量。
OG肖恩

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

在jQuery中,上面的代码将为您提供URL字符串以及URL中的POST参数。提取POST参数并非不可能。

要使用jQuery,您需要包括jQuery库。为此,请使用以下命令:

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

4
这将只能获得其中的形式提交页面上的POST参数。这似乎是一个安全的假设,OP希望得到提交表单的页面上POST参数。那是不可能的。
约翰·沃斯塔姆2014年

-3

我们可以使用序列化概念来收集使用POST提交的表单参数。

试试这个:

$('form').serialize(); 

只需将其封闭起来,它就会显示所有参数,包括隐藏的参数。


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

使用EL表达式$ {param.xxx}<head>来获取post方法的参数,并确保之后包含js文件,<head>以便您可以直接在js文件中处理“ xxx”之类的参数。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.