如何在 PHP CURL 中从 POST 切换到 GET

Posted

技术标签:

【中文标题】如何在 PHP CURL 中从 POST 切换到 GET【英文标题】:How to switch from POST to GET in PHP CURL 【发布时间】: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 愉快地跟踪了所有“删除”链接,并获得了可预测的结果。 【参考方案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);

【讨论】:

以上是关于如何在 PHP CURL 中从 POST 切换到 GET的主要内容,如果未能解决你的问题,请参考以下文章

在 PHP 中从 HTTP 切换到 HTTPS 时会话丢失

在 PHP 中从 HTTP 切换到 HTTPS 时会话丢失

PHP如何通过CURL上传文件

php curl如何直接转发当前php接收的headers?get请求如何直接转发get参数?post请求如何直接转发post参数?

Curl 和 PHP - 如何通过 curl 通过 PUT、POST、GET 传递 json

php curl模拟post请求提交数据样例总结