2013-03-19 65 views
1

我想通过新的Basecamp Api编辑现有的Basecamp项目。我收到此错误:cURL PHP Basecamp API“PUT”

lexical error: malformed number, a digit is required after the minus sign. ---------------  ---------------6 (right here) ------^ 

我的代码:

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
curl_setopt($ch, CURLOPT_URL, 'https://basecamp.com/****/api/v1/projects/****.json'); 
curl_setopt($ch, CURLOPT_USERAGENT, "User-Agent : Holy Grail ([email protected])"); 
curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json')); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT"); 
curl_setopt($ch, CURLOPT_POSTFIELDS, array("name" => "from cURL")); 



$result = curl_exec($ch); 
echo $result; 
curl_close($ch); 


if ($result == false) { 
echo "Fetch failed" ; 
} 
else { 
$obj = json_decode($result, true); 
} 

//var_dump($obj); 



?> 

我敢肯定,我只是在做一些愚蠢的事,但任何帮助表示赞赏。

谢谢!

UPDATE 我现在拥有的一切:

$username = 'user'; 
$password = 'pass'; 
$data = json_encode(array("name" => "from cURL")); 

$ch = curl_init(); 
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
curl_setopt($ch, CURLOPT_URL, 'https://basecamp.com/****/api/v1/projects/*****.json'); 
curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
curl_setopt($ch, CURLOPT_USERPWD, "$username:$password"); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_PUT, 1); 
curl_setopt($ch, CURLOPT_USERAGENT, 'User-Agent : Holy Grail  ([email protected])'); 
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
               'Content-Type :application/json', 
               'Content-Length: ' .strlen($data))); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 





$result = curl_exec($ch); 
echo $result; 
curl_close($ch); 


if ($result == false) { 
echo "Fetch failed" ; 
} 
else { 
$obj = json_decode($result, true); 
} 

//var_dump($obj); 



?> 
</body> 
</html> 

回答

1

BasecampAPI只接受JSON数据,你可以在这里看到-d参数 -

curl -u username:password \ 
    -H 'Content-Type: application/json' \ 
    -H 'User-Agent: MyApp ([email protected])' \ 
    -d '{ "name": "My new project!" }' \ 
    https://basecamp.com/999999999/api/v1/projects.json 

所以,你不发送JSON数据在这一行 -

curl_setopt($ch, CURLOPT_POSTFIELDS, array("name" => "from cURL")); 

删除CUSTOMREQUEST选项并添加CURLOPT_PUT。修改你的代码到 -

$data_string = json_encode(array("name" => "from cURL")); 
... 

curl_setopt($ch, CURLOPT_HEADER, 1); 
curl_setopt($ch, CURLOPT_PUT, True); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);                 
curl_setopt($ch, CURLOPT_HTTPHEADER, array(                   
    'Content-Type: application/json',                     
    'Content-Length: ' . strlen($data_string))                  
);     
+0

我现在正在'403 Forbidden'。我不明白为什么。 – 2013-03-20 14:19:53

+0

我正在使用账户持有人的登录信息。我知道用户和pass对请求有权限 – 2013-03-20 14:36:27

+0

尝试在'CURLOPT_USERPWD'行之前放置'curl_setopt($ ch,CURLOPT_RETURNTRANSFER,true);'* *。同时将'CURLOPT_HEADER'添加到'True'。 – 2013-03-20 15:47:14