- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试通过 PHP
与 Chef
集成
我使用了库 https://github.com/dv1r/php-chef与 Hosted Enterprise Chef
通信。当我从 Chef
检索信息时,一切正常。我还可以删除客户端等。
当我尝试向服务器发送数据时,问题就出现了。我总是收到错误“无效的 JSON”。根据 http://jsonlint.com/,我发送的 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, true);
curl_setopt($ch, 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":["invalid 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);
}
?>
希望能帮到你..
警告:
关于php - Opscode Chef REST API JSON 无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23456790/
我们有一个用例,我们希望 Chef 编排等到机器中的特定目录被删除。有什么办法可以实现吗? 我在网上搜索了一下,发现了以下cookbook 我觉得它可以使用,但我很难理解如何使用它,没有关于使用它的读
我正在注册一个在运行列表中搜索其他节点属性的节点。 问题是当节点信息太大而无法通过 HTTP 放在服务器上时。 然后chef-client 打印“FATAL: Net::HTTPServerExcep
我找不到如何使用 chef 在 linux 中只安装一次设备。这意味着在其他 Chef 客户端上不应执行资源,因为那里的设备已经安装到特定路径。我怎样才能利用 Chef 的幂等性来做到这一点? ...
我的 Chef 服务器中有几个节点在引导时出现问题并且错过了 FQDN 和域自动属性,因此它们没有被 SOLR 索引并且不能被 knife 搜索。我无法重新启动这些机器,但想修复这个问题,我花了一段时
我使用 Vagrant 生成一个标准的“precise32”框并使用 Chef 对其进行配置,这样我就可以在 Windows 机器上工作时在 Linux 上测试我的 Node.js 代码。这很好用。
我们在我们的管道中使用 Opscode Chef,我们注意到部署(参见 http://docs.opscode.com/resource_deploy.html)创建了我们源代码的完整副本到/shar
我不久前使用了 Vagrant,并且能够使用以下内容: config.vm.provision :chef_solo do |chef| chef.recipe_url = 'https://gith
我正在尝试通过 PHP 与 Chef 集成 我使用了库 https://github.com/dv1r/php-chef与 Hosted Enterprise Chef 通信。当我从 Chef 检索信
我是 opscode 厨师的新手。我想在我的 Web 应用程序中集成 opscode Chef。我使用 web console 创建了一个节点Amazon EC2 上的操作码。现在我想知道该怎么做以及
我对厨师非常陌生,我正在尝试创建一个在 Digital Ocean Ubuntu 14.04 droplet 上运行的厨师服务器。我正在使用 this guide用于安装。我下载了 .deb 并安装得
我正在尝试使用 opscode chef cookbook 安装 tomcat6。我收到以下错误。 Recipe: tomcat::default * package[tomcat6] actio
我打算使用 https://github.com/opscode-cookbooks/mysql但是当我运行 vagrant provision 时 找不到菜谱 mysql 的 recipe ruby
我是一名优秀的程序员,十分优秀!