【问题标题】:How to switch from POST to GET in PHP CURL如何在 PHP CURL 中从 POST 切换到 GET
【发布时间】:2010-11-16 13:26:34
【问题描述】:

我尝试从之前的 Post 请求切换到 Get 请求。假设它是一个 Get 但最终会发布一个帖子。

我在 PHP 中尝试了以下内容:

curl_setopt($curl_handle, CURLOPT_POSTFIELDS, null);
curl_setopt($curl_handle, CURLOPT_POST, FALSE);
curl_setopt($curl_handle, CURLOPT_HTTPGET, TRUE);

我错过了什么?

附加信息: 我已经有一个设置为执行 POST 请求的连接。这成功完成,但后来当我尝试重用连接并使用上面的 setopts 切换回 GET 时,它仍然最终在内部使用不完整的 POST 标头进行 POST。问题是它认为它在执行 GET 但最终放置了一个没有 content-length 参数的 POST 标头,并且连接失败并出现 411 错误。

【问题讨论】:

  • 小心获取请求。谷歌和他们玩得很开心。 ;)
  • @Chris - 一位朋友在建立一个通过 GET 请求管理用户贡献内容的网站时发现了这一点。 Googlebot 愉快地跟踪了所有“删除”链接,并获得了可预测的结果。

标签: php post curl get


【解决方案1】:

确保在执行 GET 请求时将查询字符串放在 URL 的末尾。

$qry_str = "?x=10&y=20";
$ch = curl_init();

// Set query data here with the URL
curl_setopt($ch, CURLOPT_URL, 'http://example.com/test.php' . $qry_str); 

curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);
$content = trim(curl_exec($ch));
curl_close($ch);
print $content;

使用 POST,您可以改为通过 CURLOPT_POSTFIELDS 选项传递数据 在 CURLOPT__URL 中传递它。

$qry_str = "x=10&y=20";
curl_setopt($ch, CURLOPT_URL, 'http://example.com/test.php');  
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 3);

// Set request method to POST
curl_setopt($ch, CURLOPT_POST, 1);

// Set query data here with CURLOPT_POSTFIELDS
curl_setopt($ch, CURLOPT_POSTFIELDS, $qry_str);

$content = trim(curl_exec($ch));
curl_close($ch);
print $content;

curl_setopt() docsCURLOPT_HTTPGET 的注释(已添加重点):

[Set CURLOPT_HTTPGET equal to] TRUE to reset HTTP 请求方法为 GET。
由于 GET 是默认设置,因此只有在请求方法已更改时才需要这样做。

【讨论】:

  • 将超时时间设置为 51 秒是一种非常邪恶的方式!
  • 不错的收获@JackGoossen!
【解决方案2】:

已解决:问题出在这里:

我通过_CUSTOMREQUEST_POST 设置POST_CUSTOMREQUEST 保持为POST,而_POST 切换到_HTTPGET。服务器假定来自 _CUSTOMREQUEST 的标头是正确的,并返回 411。

curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'POST');

【讨论】:

    【解决方案3】:

    在调用 curl_exec($curl_handle) 之前添加它

    curl_setopt($curl_handle, CURLOPT_CUSTOMREQUEST, 'GET');
    

    【讨论】:

      【解决方案4】:

      CURL 请求默认为 GET,您无需设置任何选项即可发出 GET CURL 请求。

      【讨论】:

        【解决方案5】:

        根据条件添加。此行代码为 POST 请求,否则默认为 GET。即使是 POST 请求,我们也可以在 URL 的末尾添加参数

        curl_setopt($curl_handle, CURLOPT_POST, 1);

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-21
          • 1970-01-01
          • 2015-10-31
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多