【问题标题】:How can I make a request with both GET and POST parameters in PHP with cURL?如何使用 cURL 在 PHP 中同时使用 GET 和 POST 参数发出请求?
【发布时间】:2014-10-28 02:15:37
【问题描述】:

其他人已经问过如何从 perl、java、bash 等中执行此操作,但我需要在 PHP 中执行此操作,而且我没有看到任何与 PHP 相关(或答案)的问题.

我的代码:

    $ch = curl_init($url);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $fields);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $result = curl_exec($ch);

这不起作用。目标站点有print_r($_GET); print_r($_POST);,所以当我检查$result 时,我应该能够看到正在发送的字段。但是,$_POST 数组是空的——我只看到 get 变量。如果我从 $url 中删除 ?... 查询字符串,则正确填充 POST 数组。但现在我没有 GET 参数。我该怎么做?

我的具体情况是,我需要发送太多数据以将其放入查询字符串中,但我无法将其全部发送为 POST,因为我要提交的站点正在为基于发布的数据选择处理程序在 GET 字符串中的变量上。我可以尝试更改它,但理想情况下,我希望能够在同一个查询中同时发送 get 和 post 数据。

【问题讨论】:

  • 您不能同时执行 POST 和 GET,但是您可以向您的 url 添加一些查询字符串参数,但是要添加 POST 变量,您必须执行 POST。
  • @ParagTyagi 是的,这是一个非常好的基础教程,但它没有解决我的问题 - 我如何同时发送 GET 和 POST
  • 你不能,但不要让 PHP 的 $_GET$_POST 超全局变量让你误以为查询字符串是一个特殊的 GET 请求。
  • @Benubird 您应该阅读 HTTP 如何工作才能真正理解这一点。每个请求只有一个动词。正如 Quentin 和 Dan 所说,您可以在查询字符串中包含变量并仍然使用 POST 动词。

标签: php post curl get


【解决方案1】:
# GET query goes in the URL you're hitting
$ch = curl_init('http://example.com/script.php?query=parameter');
# POST fields go here.
curl_setopt($ch, CURLOPT_POSTFIELDS, array('post' => 'parameter', 'values' => 'go here'));

如果执行 POST,PHP 本身不会决定忽略 GET 参数。无论使用哪种 http 动词加载页面,它都会填充 $_GET - 如果 URL 中有查询参数,它们将进入 $_GET。

如果你没有得到 $_POST 和 $_GET ,那么某些东西正在导致重定向或以其他方式杀死某些东西。例如您是否检查过$_SERVER['REQUEST_METHOD'] 以查看您的代码是否实际上作为 POST 运行?如果帖子实际上没有执行,PHP 将不会填充 $_POST。您可能已经向服务器发送了一个帖子,但这并不意味着您的代码实际上会在 POST 机制下执行 - 例如mod_rewrite 重定向。

由于您启用了 FOLLOW_REDIRECT,因此您只是假设您实际上在执行代码时收到了一条帖子。

【讨论】:

  • 这就是我正在做的,但它不起作用!我错过了什么吗?我需要一些特殊的 php.ini 设置吗?
  • @Benubird 不,没有特殊设置。这就是它的工作原理,如果它不适合你,你应该发布你的实际代码。您的代码中没有任何地方显示您的 URL。它确实有效,所以你的网址一定是不正确的。
  • @Brad 这是我的网址:https://ec2-54-225-37-120.compute-1.amazonaws.com/wordpress/?wc-api=paddle_wc_payment_gateway
  • 从命令行尝试使用curl -I 或类似的URL 以查看响应标头。你几乎肯定会被重定向。
  • 没有。 30x 重定向也将请求新的 url 作为获取。有 307,应该作为 POST 重定向,但它并不广为人知/支持。
【解决方案2】:

我不知道您是否已经拥有了,但您的 $url 是否具有所需的获取参数?喜欢:

$url = "http://example.com/index.php?param1=value1&param2=value2";

【讨论】:

  • 是的,确实如此 - 就像我在问题中所说的那样,我可以看到 post 字段或 get 字段,但不能同时看到两者。
  • 这不能回答问题。
  • @randomizer 怎么不行?
  • @Brad,因为 Benubird 正在像这样传递 get 变量,但只能看到 GET 或 POST 与他当前的脚本。阅读问题.. 他说他删除了 ?查询字符串,所以我假设他已经传递了类似这个答案的 get 参数。
  • @randomizer 我确实阅读了他的问题,但他没有表明他实际上正在这样做。如果他这样做了,那就行了。这很简单。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-22
  • 2018-03-30
  • 2011-12-16
  • 2015-03-05
  • 2017-04-22
  • 1970-01-01
相关资源
最近更新 更多