因此,我们想要创建一个私有API,允许其他人与我们的服务进行交互,例如通过api保存数据库中的某些内容或获取某些信息。
API本身只期望可以通过任何编程语言向API提供的JSON数据。与facebook等其他API不同,我们不会向用户提供任何文件,因为facebook会提供不同语言的类来与他们的api进行交互。所以我们认为api用户可以使用任何语言向我们发送json数据,并根据json数据,我们可以通过查询字符串提供的use
参数调用api的某些函数。
以下是最基本级别的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用户生成)中,然后调用通过{指定的方法{1}}调用中的查询字符串变量:
use
这是制作私有API的正确方法还是我还缺少什么?
答案 0 :(得分:1)
任何听取请求的人(如果您通过WIFI或AJAX呼叫呼叫您的api)将能够看到您的appId和apiKey。所以他们也可以打电话给你的api。更好的方法是:
如果你想要一个快速的REST API我可以推荐Restler。它还包含身份验证。 http://luracast.com/products/restler