gpt4 book ai didi

php - 如何制作简单的 PHP API 处理程序?

转载 作者:可可西里 更新时间:2023-10-31 23:45:19 26 4
gpt4 key购买 nike

我已经使用 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”和“Name can't be blank”——因为名称是不是空白且格式正确(据我所知)这表明数据未正确发送?

到目前为止的解决方案尝试...

我尝试过对数据进行 json 编码(在代码中看到),而不是 json 编码、使用和不使用 json 编码的 url 编码以及各种其他选项,但没有成功。

我在网上看到一些关于这个完全相同的问题的帖子,特别是关于 DigitalOcean 的 API(和另一个),但没有人给出解释(除了放弃并使用库或其他影响)

直接从终端使用 cURL 确实有效,因此创建域的 API 没有任何问题。

据我所知,身份验证工作正常,一般设置工作正常,因为我可以在帐户中列出域,我只是不能发布或放置新数据。我去过 API's documentation看不出我做错了什么,也许是某种错误的编码?

任何帮助将不胜感激! :)

编辑:经过大量 的工作和研究,甚至其他简单的 API 处理程序也无法与 Digital Ocean 一起使用(例如 https://github.com/ledfusion/php-rest-curl )- 这个 API 是否有特别需要的东西,或者我是否遗漏了一些关于 API 的基本知识?

最佳答案

从技术上讲,这不是修复,而是解决方法。 感谢大家的意见和想法,不幸的是,没有任何工作/修复代码和赏金过期:(

虽然我不知道为什么 PHP cURL 选项不起作用(HTTP 起作用,只是 Digital Ocean 因未知原因吐出与验证发布数据相关的错误)...

我确实有一个新方法,它最终行之有效...(感谢 jtittle post on the Digital Ocean Community forum)

以防万一该链接在未来失效...他是使用流和 file_get_contents 的工作函数并且不是 curl...

<?php
function doapi( $key, $method, $uri, array $data = [] )
{
/**
* DigitalOcean API URI
*/
$api = 'https://api.digitalocean.com/v2';

/**
* Merge DigitalOcean API URI and Endpoint URI
*
* i.e if $uri is set to 'domains', then $api ends up as
* $api = 'https://api.digitalocean.com/v2/domains'
*/
$uri = $api . DIRECTORY_SEPARATOR . $uri;

/**
* Define Authorization and Content-Type Header.
*/
$headers = "Authorization: Bearer $key \r\n" .
"Content-Type: application/json";

/**
* If $data array is not empty, assume we're passing data, so we'll encode
* it and pass it to 'content'. If $data is empty, assume we're not passing
* data, so we won't sent 'content'.
*/
if ( ! empty( $data ) )
{
$data = [
'http' => [
'method' => strtoupper( $method ),
'header' => $headers,
'content' => json_encode( $data )
]
];
}
else
{
$data = [
'http' => [
'method' => strtoupper( $method ),
'header' => $headers
]
];
}

/**
* Create Stream Context
* http://php.net/manual/en/function.stream-context-create.php
*/
$context = stream_context_create( $data );

/**
* Send Request and Store to $response.
*/
$response = file_get_contents( $uri, false, $context );

/**
* Return as decoded JSON (i.e. an array)
*/
return json_decode( $response, true );
}

/**
* Example Usage
*/

var_dump(doapi(
'do-api-key',
'get',
'domains'
));

我用它实际上成功地发布了数据......

var_dump(doapi(
$api_key,
'post',
'domains',
array("name" => (string) $newDomain, "ip_address" => "1.2.3.4")
));

关于php - 如何制作简单的 PHP API 处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43619504/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com