简体   繁体   English

如何在 URL 中传递 POST 参数?

[英]How can I pass POST parameters in a URL?

Basically, I think that I can't, but I would be very happy to be proven wrong.基本上,我认为我做不到,但我会很高兴被证明是错误的。

I am generating an HTML menu dynamically in PHP, adding one item for each current user, so that I get something like <a href="process_user.php?user=<user>> , but I have a preference for POST over GET.我在 PHP 中动态生成 HTML 菜单,为每个当前用户添加一个项目,以便我得到类似<a href="process_user.php?user=<user>> GET 的内容。

Is there a way to pass the information as a POST parameter, rather than GET from a clickable HREF link?有没有办法将信息作为 POST 参数传递,而不是从可点击的 HREF 链接获取?

I am not allowed to use JavaScript.我不允许使用 JavaScript。


It looks like Rob is on to something with "You could use a button instead of an anchor and just style the button to look like a link. That way you could have your values in hidden fields inside the same form to be sent via POST"看起来Rob 正在使用“您可以使用按钮而不是锚点并将按钮设置为看起来像链接的样式。这样您就可以在同一表单内的隐藏字段中通过 POST 发送您的值”

You could use a form styled as a link.您可以使用样式为链接的表单。 No JavaScript is required:不需要 JavaScript:

<form action="/do/stuff.php" method="post">
    <input type="hidden" name="user_id" value="123" />
    <button>Go to user 123</button>
</form>

CSS: CSS:

button {
    border: 0;
    padding: 0;
    display: inline;
    background: none;
    text-decoration: underline;
    color: blue;
}
button:hover {
    cursor: pointer;
}

See: http://jsfiddle.net/SkQRN/见: http://jsfiddle.net/SkQRN/

Parameters in the URL are GET parameters, a request body, if present, is POST data. URL 中的参数是 GET 参数,请求正文(如果存在)是 POST 数据。 So your basic premise is by definition not achievable.因此,根据定义,您的基本前提是无法实现的。

You should choose whether to use POST or GET based on the action.您应该根据操作选择使用 POST 还是 GET。 Any destructive action, ie something that permanently changes the state of the server (deleting, adding, editing) should always be invoked by POST requests.任何破坏性操作,即永久更改服务器的 state 的操作(删除、添加、编辑)都应始终由 POST 请求调用。 Any pure "information retrieval" should be accessible via an unchanging URL (ie GET requests).任何纯粹的“信息检索”都应该可以通过不变的 URL(即 GET 请求)访问。

To make a POST request, you need to create a <form> .要发出 POST 请求,您需要创建一个<form> You could use Javascript to create a POST request instead, but I wouldn't recommend using Javascript for something so basic.可以使用 Javascript 来创建 POST 请求,但我不建议将 Javascript 用于如此基本的事情。 If you want your submit button to look like a link, I'd suggest you create a normal form with a normal submit button, then use CSS to restyle the button and/or use Javascript to replace the button with a link that submits the form using Javascript (depending on what reproduces the desired behavior better).如果您希望提交按钮看起来像一个链接,我建议您使用普通提交按钮创建一个普通表单,然后使用 CSS 重新设置按钮的样式和/或使用 Javascript 将按钮替换为提交表单的链接使用 Javascript (取决于更好地再现所需行为的内容)。 That'd be a good example of progressive enhancement .那将是渐进增强的一个很好的例子。

You can make a link perform an Ajax post request when it's clicked.您可以使链接在单击时执行 Ajax 发布请求。

In jQuery:在 jQuery 中:

$('a').click(function(e) {
    var $this = $(this);
    e.preventDefault();
    $.post('url', {'user': 'something', 'foo': 'bar'}, function() {
        window.location = $this.attr('href');
    });
});

You could also make the link submit a POST form with JavaScript:您还可以使用 JavaScript 使链接提交 POST 表单:

<form action="url" method="post">
    <input type="hidden" name="user" value="something" />
    <a href="#">CLick</a>
</form>

<script>
    $('a').click(function(e) {
        e.preventDefault();
        $(this).parents('form').submit();
    });
</script>

I would like to share my implementation as well.我也想分享我的实现。 It does require some JavaScript code though.不过,它确实需要一些 JavaScript 代码。

<form action="./index.php" id="homePage" method="post" style="display: none;">
    <input type="hidden" name="action" value="homePage" />
</form>

<a href="javascript:;" onclick="javascript:
document.getElementById('homePage').submit()">Home</a>

The nice thing about this is that, contrary to GET requests, it doesn't show the parameters in the URL, which is safer.这样做的好处是,与 GET 请求相反,它不显示 URL 中的参数,这样更安全。

First off, a disclaimer: I don't think marrying POST with URL parameters is a brilliant idea.首先,免责声明:我不认为将 POST 与 URL 参数结合是一个绝妙的主意。 Like others suggested, you're better off using a hidden form for passing user information.像其他人建议的那样,您最好使用隐藏表单来传递用户信息。

However, a question made me curious how PHP is handling such a case.然而,一个问题让我很好奇 PHP 是如何处理这种情况的。 It turned out that it's possible in theory.事实证明,理论上是可行的。 Here's a proof:这是一个证明:

post_url_params.html post_url_params.html

<!DOCTYPE html>
<html>
    <head></head>
    <body>
        <form method="post" action="post_url_params.php?key1=value1">
            <input type="hidden" name="key2" value="value2">
            <input type="hidden" name="key3" value="value3">
            <input type="submit" value="click me">
        </form>
    </body>
</html>

post_url_params.php post_url_params.php

<?php
    print_r($_POST);
    print_r($_GET);
    echo $_SERVER['REQUEST_METHOD'];
?>

Output Output

Array ( [key2] => value2 [key3] => value3 )
Array ( [key1] => value1 )
POST

One can clearly see that PHP stores URL parameters in the $_GET variable and form data in the $_POST variable.可以清楚地看到,PHP 将 URL 参数存储在$_GET变量中,将表单数据存储在$_POST变量中。 I suspect it's very PHP- and server-specific, though, and is definitely not a thing to rely on.不过,我怀疑它非常特定于 PHP 和服务器,并且绝对不是可以依赖的东西。

No, you cannot do that.不,你不能那样做。 I invite you to read a POST definition .我邀请您阅读POST 定义

Or this page:HTTP, request methods或本页:HTTP,请求方法

This could work if the PHP script generates a form for each entry with hidden fields and the href uses JavaScript to post the form.如果 PHP 脚本为每个带有隐藏字段的条目生成一个表单,并且 href 使用 JavaScript 发布表单,这可能会起作用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM