2012-02-28 77 views
2

我尝试使用php和curl发布帖子请求。这里是我的代码php + curl无法设置发布方法

//PHP 5.3.5 and curl: 7.18.2 
$ch = curl_init(); 
if(!empty($save_cookie)){ 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $save_cookie); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $save_cookie); 
}else{ 
    curl_setopt($ch, CURLOPT_COOKIE, $cookie); 
} 

curl_setopt($ch, CURLOPT_REFERER, $referer); 
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); 
curl_setopt($ch, CURLOPT_URL, 'http://localhost/post.php'); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $pars); 
curl_setopt($ch, CURLOPT_HEADER, $header); 
curl_setopt($ch, CURLOPT_NOBODY, !$body); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

$postResult = curl_exec($ch); 

if (curl_errno($ch)) { 
    return false; 
} 

curl_close($ch); 
return $postResult; 

http://localhost/post.php,我写

print_r($_SERVER); 

卷曲的结果回报总是

[REQUEST_METHOD] => GET 
+0

奇怪。你可以发布数据包跟踪吗? (使用Wireshark或类似的。)另外,是通过CGI还是作为模块调用PHP?什么网络服务器?另见http://redmine.lighttpd.net/issues/1472。我怀疑如果你要设置POST数据并在post.php中查看'$ _POST',你会看到你的数据。 – Brad 2012-02-28 01:17:45

+0

我正在使用apache + fastcgi。我也打印$ _POST,但它'空 – complez 2012-02-28 01:23:29

回答

2

取出CURLOPT_NOBODY选项,它会工作。或者将它放在CURLOPT_POST的上方。

我想我已经遇到过这一次,当试图得到一个响应的标题。设置

curl_setopt($ch, CURLOPT_NOBODY, true); 

有效指示curl发出HEAD请求,这是不是一个POST请求。我认为没有办法只从POST获得标题(并且在收到标题后就放弃连接)。作为一个副作用,CURLOPT_NOBODYfalse台请求类型设置为GET ...

你真的需要标志CURLOPT_NOBODY

+0

你节省了我的一天,它现在工作! – complez 2012-02-28 01:24:37

+0

但即使使用FALSE作为“NOBODY”setopt的第三个参数,问题仍然存在。这是一个错误,因为文档明确指出请求类型不应该重置为GET方式。 – raina77ow 2012-02-28 01:29:52

+0

@ raina77ow你应该提交一份错误报告! – mvds 2012-02-28 01:31:35

2

尝试将

curl_setopt($ch, CURLOPT_POSTFIELDS, $pars);

线前移动

curl_setopt($ch, CURLOPT_NOBODY, !$body);

行权。

这里有一个有趣的帖子在curl/set_opt page,这种行为脱落一些轻:

如果你的POST数据似乎消失(POST数据空,请求 正在由服务器处理的GET)请尝试使用CURLOPT_NOBODY重新排列 CURLOPT_POSTFIELDS设置的顺序。 CURLOPT_POSTFIELDS有 在CURLOPT_NOBODY设置后出现,因为如果它出现在它之后 会清除标头,该标头会告诉您的URL目标 请求是POST而不是GET。

+0

Content-Type标头不会告诉任何关于“POST”或“GET”的信息。 – mvds 2012-02-28 01:30:03

+0

是的,但为什么散布错误的话? – mvds 2012-02-28 01:33:06