2009-08-04 99 views
63

我尝试从先前的Post请求切换到Get请求。它假设它是一个Get,但最终会发布一个帖子。如何从PHP切换POST到GET CURL

我试图在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错误。

+3

请小心Get请求。谷歌与他们玩得很开心。 ;) – NotMe 2009-08-04 02:11:10

+8

@Chris - 一位朋友发现,当他建立一个通过GET请求管理用户贡献内容的网站时,这是一种艰难的方式。 Googlebot乐于遵循所有'删除'链接,并带来可预测的结果。 – 2009-08-04 18:59:34

回答

28

解决:问题就出在这里:

我同时通过_CUSTOMREQUEST_POST设置POST_CUSTOMREQUEST坚持为POST_POST切换到_HTTPGET。服务器假设从_CUSTOMREQUEST头是正确的,带回来一个411

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

确保在执行GET请求时将查询字符串放在URL的末尾。从curl_setopt() docsCURLOPT_HTTPGET(强调)

 
$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; 
 
With a POST you pass the data via the CURLOPT_POSTFIELDS option instead 
of passing it in the 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; 

注:

[设置CURLOPT_HTTPGET等于] TRUE复位 HTTP请求方法得到的。
由于GET是默认值,因此只有在请求方法已更改时才需要。

+0

这是一个非常邪恶的方式来设置51秒的超时! – 2017-05-18 12:02:36

39

调用curl_exec($ curl_handle)默认

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

卷曲请求之前添加这是GET,你不必设置任何选项来创建GET CURL请求。