如何在 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 curl如何直接转发当前php接收的headers?get请求如何直接转发get参数?post请求如何直接转发post参数?