我正在设法将基于codeigniter构建的现有web应用程序转换为rest API后端。我是整个REST API的新手。
作为旁注,我知道每个人似乎都在使用rest-server library,但是我对这条路线不感兴趣,因此我正在寻找不在该库的上下文。
我似乎无法找到答案的是,首先加载页面时,从DB检索数据,然后加载视图。这是一个get请求,但并不完全适合其余的API类型体系结构。您将获得页面所需的一堆东西(可能是一个或多个资源),并将其放入数据数组中,然后调用视图。
最好的方法是先通过is_ajax_request()
方法检查请求是否为ajax,从而将这些调用与api分开吗?还是我在想这是错误的方式?
这是我为API调用设置概念证明的方式,但是我对如何将其与传统的“以我为视角”的体系结构集成感到迷茫。也许不是,我在所有这些方面都是完全错误的。
我正在使用路由来确保正确配置网址:
$route['users'] = 'users/index';
$route['users/(:any)'] = 'users/index';
从那里,我的基本控制器构造函数方法创建了一些类:
$this->request = new stdClass()
$this->api = new stdClass();
$this->request->http_method =($this->input->method()) ?? 'get';
$this->request->resource = $this->uri->segment(1);
我在处理初始请求的基础控制器中放置了一个索引方法:
function index()
{
$method = $this->route_request();
$id = ($this->uri->segment(2)) ?? NULL;
if(method_exists($this, $method))
{
$this->{$method}($id);
}
else
{
$this->output->set_status_header(404);
exit;
}
}
请求被路由到适当的类方法:
protected function route_request()
{
$this->api->method = $this->request->resource . '_';
switch($this->request->http_method)
{
case 'get':
$this->parse_params();
$this->api->method .= $this->request->http_method;
break;
case 'post':
echo 'post';
break;
case 'patch':
echo 'patch';
break;
case 'delete':
echo 'delete';
break;
}
return $this->api->method;
}
并且此方法解析查询字符串以获取请求:
protected function parse_params()
{
$input = $this->input->get();
$this->request->params['select_fields'] = ($input['fields']) ?? '*';
unset($input['fields']);
if(sizeOf($input) > 0)
{
$this->request->params['filters'] = $input;
}
}
以上所有结果均称为:
function users_get($id)
{
$response = $this->Users_model->read($id, $this->request->params);
echo json_encode($response);
}