php – Opscode Chef REST API无效的JSON
我想通过
PHP与Chef集成
我使用库https://github.com/dv1r/php-chef与Hosted Enterprise Chef进行通信.当我从Chef检索信息时,一切都很好.我也可以删除客户端等. 当我尝试将数据发送到服务器时,问题就开始了.我总是得到错误“无效的JSON”. 有人知道我是否需要添加和编码类型到json_encode()以解决这个问题? 代码示例: try{ // Gets current data in Data-Bad `evns` Item `dev` (works) $res = $this->chef->get('/data/envs/dev'); } catch (Exception $e){ echo("Exception: ".$e->getMessage()); } // Alter Data $res->testtt = "testess"; try{ // Set's new data to Data-bag `envs` Item `dev` (FAILS) $ret = $this->chef->put("/data/envs/dev",$res); } catch (Exception $e){ die("Exception: <br>".$e->getMessage()); } 图书馆有趣的部分: // json encode data if ($data && !is_string($data)) { $data = json_encode($data,JSON_UNESCAPED_UNICODE); $this->debug("data encoded to json: {$data}"); } // sign the request $this->sign($endpoint,$method,$data,$header); $this->debug("request URL: {$url}"); // initiate curl $ch = curl_init(); curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); curl_setopt($ch,CURLOPT_FOLLOWLOCATION,CURLOPT_CONNECTTIMEOUT,$this->timeout); curl_setopt($ch,CURLOPT_HTTPHEADER,$header); curl_setopt($ch,CURLOPT_CUSTOMREQUEST,$method); // most people are using self-signed certs for chef,so its easiest to just // disable ssl verification curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false); curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,FALSE); // add data to post and put requests if ($method == 'POST' || $method == 'PUT') { curl_setopt($ch,CURLOPT_POST,true); curl_setopt($ch,CURLOPT_POSTFIELDS,$data); } // execute $raw_response = curl_exec($ch); 如果我错过了一些重要信息,请评论,我会补充. 谢谢. 编辑:更多调试信息 – 原始回应: 首先调用API(GET)raw_response:{“name”:“name”,“id”:“dev”} 第二次调用(PUT)raw_response:{“error”:[“无效的JSON”]} curl_getinfo($ch)[PUT]的输出: Array ( [url] => https://api.opscode.com/organizations/MY_ORG/data/envs/dev [content_type] => text/html [http_code] => 400 [header_size] => 426 [request_size] => 1665 [filetime] => -1 [ssl_verify_result] => 0 [redirect_count] => 1 [total_time] => 0.175739 [namelookup_time] => 2.0E-5 [connect_time] => 0.02709 [pretransfer_time] => 0.093261 [size_upload] => 0 [size_download] => 26 [speed_download] => 147 [speed_upload] => 0 [download_content_length] => 26 [upload_content_length] => 0 [starttransfer_time] => 0.126115 [redirect_time] => 0.049605 [certinfo] => Array() [primary_ip] => 184.106.28.81 [primary_port] => 443 [local_ip] => xxx.xxx.xxx.50 [local_port] => 33329 [redirect_url] => [request_header] => PUT /organizations/MY_ORG/data/envs/dev HTTP/1.1 Host: api.opscode.com Accept: application/json Content-Type: application/json X-Chef-Version: 11.8.2 X-Ops-Sign: algorithm=sha1;version=1.0 X-Ops-UserId: USER X-Ops-Timestamp: 2014-05-07T13:39:55Z X-Ops-Content-Hash: qk8fSIReFrOMJ+Wk2y8yoe3EAgk= X-Ops-Authorization-1: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx X-Ops-Authorization-2: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx X-Ops-Authorization-3: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx X-Ops-Authorization-4: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx X-Ops-Authorization-5: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx X-Ops-Authorization-6: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx ) 解决方法
$res-> testtt将是您的主要问题.
“神奇”的转换在某种程度上是错误的. 即: try{ // Gets current data in Data-Bad `evns` Item `dev` (works) $res = (array) $this->chef->get('/data/envs/dev'); } catch (Exception $e){ echo("Exception: ".$e->getMessage()); } // Alter Data $res['testtt'] = "testess"; try{ // Set's new data to Data-bag `envs` Item `dev` (FAILS) $ret = $this->chef->put("/data/envs/dev",$res); } catch (Exception $e){ die("Exception: <br>".$e->getMessage()); } 希望它会有所帮助. 编辑工作示例 <?php $envs = unserialize($_POST['envs']); foreach($_POST["datas"] as $env => $items) { ksort($items,SORT_NATURAL); $old = (array) $chef->get("/data/livraisons/".$env); $new = array_merge($old,$items); ksort($new,SORT_NATURAL); $chef->put("/data/livraisons/".$env,$new); } ?> 我希望它能帮助你搞清楚.. 警告: >我是开源厨师服务器(11.0.10),也许就是这样 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |