Итак, мы хотели создать частный API, который позволил бы другим взаимодействовать с нашими сервисами, такими как сохранение определенных вещей в нашем db через api или получение определенной информации.Индивидуальные стандарты создания API. Правильно ли этот API?
В самом API-интерфейсе ожидаются данные JSON, которые могут быть перенесены через любой язык программирования в API. В отличие от других API, таких как facebook, мы не предоставляем пользователям никаких файлов для использования API, так как facebook предоставляет классы для разных языков для взаимодействия с их api. Поэтому мы думали, что пользователи api могут использовать любой язык для отправки нам json-данных и на основе этих json-данных, мы можем вызывать определенные функции api через параметр use
, который они предоставляют через строку запроса.
Вот код API на самом базовом уровне, чтобы получить вам представление о том, как это работает:
class Api
{
/**
* Default function called when API url is accessed
*
* @return mixed
* @throws Exception
*/
public function index()
{
$appId = isset($_GET['appId']) ? $_GET['appId'] : null;
$apiKey = $_GET['apiKey'] ? $_GET['apiKey'] : null;
$method = $_GET['use'] ? $_GET['use'] : null;
$data = json_decode(file_get_contents("php://input"), true);
if ($this->validateRequest($appId, $apiKey, $method)) {
return call_user_func_array(array($this, $method), array($data));
}
}
private function validateRequest($appId, $apiKey, $method)
{
# check referer
$requestUri = isset($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : null;
if (!$requestUri) {
$this->bye('HTTP_REFERER is required!');
}
# check if method exists
if (!$method || !method_exists('Apicall', $method)) {
$this->bye('Invalid \'use\' value!');
}
# check appId, apiKey and requestUri
if (!$appId) {
$this->bye('Invalid appId!');
}
if (!$apiKey) {
$this->bye('Invalid apiKey!');
}
$db = new DB();
$db->where('appid', $appId);
$db->where('apikey', $apiKey);
$db->where('request_uri', pathWithoutEndingSlash($requestUri));
$db->get();
if ($db->exists() && $db->result_count() > 0) {
return true;
}
$this->bye('Request Denied!');
}
private function bye($error)
{
echo json_encode(array('Error' => $error));
exit;
}
private function getIntervals()
{
$values = array('monthly', 'quarterly', 'yearly', 'single_payment');
echo json_encode($values);
}
}
Как можно видеть, мы будем проверять, если это предусмотрено appId
, apiKey
и requestURI
существует в нашей дб (которые мы уже генерироваться для пользователей API), а затем вызвать метод, указанный в переменной строки запроса use
в вызове:
http://localhost/myapi/api.php?appId=local&apiKey=98a4d2e5b7fa21d424a0932c7f47a6943d57d64b&use=getIntervals
правильно ли это ж ay сделать частный API, или я все еще что-то не хватает?
Спасибо полезным, что мне не хватало. благодаря – Dev01