【发布时间】:2017-04-25 19:36:57
【问题描述】:
我使用 cURL 在 PHP 中编写了一个基本的 API 脚本 - 并在另一个 API 上成功使用了它的一个版本,这个版本专门用于处理 DigitalOcean 上的域 DNS 管理 - 我无法发送数据?
前奏...
我知道有一个 PHP 库可用,我不追求功能齐全或依赖关系臃肿的东西 - 只是在本地使用的小东西 主要是为了帮助我了解 RESTful API 的工作原理在实践中更好 - 一种教育练习
违规代码...
function basic_api_handle($key, $method, $URI, $data) {
$ch = curl_init();
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Authorization: Bearer '.$key,
'Content-Type: application/json')
);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
curl_setopt($ch, CURLOPT_URL, $URI);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
$result = curl_exec($ch);
if($result === false) error_log("API ERROR: Connection failure: $URI", 0);
curl_close($ch);
return json_decode($result, true);
}
var_dump(basic_api_handle($api_key, 'POST', 'https://api.digitalocean.com/v2/domains', array('name' => 'my-domain.tld', 'ip_address' => '1.2.3.4')));
这适用于 GET 请求,例如列出帐户上的域,但似乎无法发布/发送数据...这会导致“unprocessable_entity”和“名称不能为空” - 因为名称是不是空白并且格式正确(据我所知)它向我表明数据没有正确发送?
到目前为止的解决方案尝试...
我尝试过对数据进行 json 编码(见代码),而不是 json 编码、带有和不带有 json 编码的 url 编码以及各种其他选项,但都没有运气。
我在网上看到过一些关于 DigitalOcean API(和另一个)的完全相同问题的帖子,但没有人解释(除了放弃并使用库或其他影响)。
直接从终端使用 cURL 确实可以工作等,因此用于创建域的 API 没有任何问题。
据我了解,身份验证工作正常,一般设置工作正常,因为我可以列出帐户中的域,我只是不能 POST 或 PUT 新数据。我一直在使用API's documentation 并且看不到我做错了什么,也许是某种错误的编码?
任何帮助将不胜感激! :)
编辑: 在大量工作和研究之后,即使是其他简单的 API 处理程序也无法与 Digital Ocean 一起使用(例如 https://github.com/ledfusion/php-rest-curl) - 这个 API 是否有特别需要的东西,或者我是否缺少关于 API 的基本知识?
【问题讨论】:
-
也许你错过了这个:
curl_setopt($ch, CURLOPT_POST, true); -
我认为对于这样的 API,您不需要将方法从 POST 更改为 GET 和 PUT 等其他方法
-
嘿!我只是想让你知道你不会发疯;这是一个看似复杂的问题!流行的“只设置
CURLOPT_POST不是答案,因为 PHP cURL 会自动为您完成。(php.net/manual/en/function.curl-setopt.php#108162) -
我已经能够使用您的代码创建一个新域。您可以使用 curl_getinfo($ch, CURLINFO_RESPONSE_CODE) 来获取 POST 操作的 HTTP 响应代码。它应该返回 201 以成功创建。
-
尝试了您的代码,它可以正常工作。该错误不是curl错误而是数字海洋错误,并且可能错误消息具有欺骗性,您可能需要检查您的域名是否正确以及IP地址是否正确。如果失败,那么也许您想检查您的计算机和 curl 版本。在 PHP 7 上测试,curl 版本 = 7.0.16
标签: php json rest curl digital-ocean