CodeIgniter 是一个轻量级的 PHP MVC 框架,以其简单性和高性能著称。它提供了清晰的架构和丰富的库,适合构建 Web 应用程序和 API。
AJAX (Asynchronous JavaScript and XML) 是一种在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术。
首先创建一个控制器来处理 AJAX 请求:
// application/controllers/Api.php
defined('BASEPATH') OR exit('No direct script access allowed');
class Api extends CI_Controller {
public function __construct() {
parent::__construct();
// 加载必要的模型或库
}
// 处理 GET 请求的示例
public function get_data() {
// 确保是 AJAX 请求
if (!$this->input->is_ajax_request()) {
exit('No direct script access allowed');
}
// 获取请求参数
$param1 = $this->input->get('param1');
// 处理业务逻辑
$data = [
'status' => 'success',
'message' => 'Data retrieved successfully',
'data' => [
'id' => 1,
'name' => 'Sample Data',
'param_received' => $param1
]
];
// 设置响应头并返回 JSON
$this->output
->set_content_type('application/json')
->set_output(json_encode($data));
}
// 处理 POST 请求的示例
public function post_data() {
if (!$this->input->is_ajax_request()) {
exit('No direct script access allowed');
}
// 获取 POST 数据
$post_data = $this->input->post();
// 处理业务逻辑
$response = [
'status' => 'success',
'message' => 'Data saved successfully',
'received_data' => $post_data
];
$this->output
->set_content_type('application/json')
->set_output(json_encode($response));
}
}
// GET 请求示例
$.ajax({
url: '/api/get_data',
type: 'GET',
data: {
param1: 'value1'
},
dataType: 'json',
success: function(response) {
console.log('GET Response:', response);
// 处理响应数据
},
error: function(xhr, status, error) {
console.error('Error:', error);
}
});
// POST 请求示例
$.ajax({
url: '/api/post_data',
type: 'POST',
data: {
name: 'John Doe',
email: 'john@example.com'
},
dataType: 'json',
success: function(response) {
console.log('POST Response:', response);
// 处理响应数据
},
error: function(xhr, status, error) {
console.error('Error:', error);
}
});
// GET 请求示例
fetch('/api/get_data?param1=value1')
.then(response => response.json())
.then(data => {
console.log('GET Response:', data);
// 处理响应数据
})
.catch(error => console.error('Error:', error));
// POST 请求示例
fetch('/api/post_data', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify({
name: 'John Doe',
email: 'john@example.com'
})
})
.then(response => response.json())
.then(data => {
console.log('POST Response:', data);
// 处理响应数据
})
.catch(error => console.error('Error:', error));
如果前端和后端不在同一个域,可能会遇到跨域问题。解决方案:
在 CodeIgniter 控制器中添加 CORS 头:
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, Authorization');
或者在 config.php
中设置:
$config['allow_headers'] = ['Content-Type', 'Authorization', 'X-Requested-With'];
$config['allow_methods'] = ['GET', 'POST', 'OPTIONS'];
CodeIgniter 默认启用 CSRF 保护,对于 AJAX 请求:
在 config.php
中:
$config['csrf_protection'] = FALSE;
在视图中添加:
var csrf_token = '<?php echo $this->security->get_csrf_hash(); ?>';
然后在 AJAX 请求中添加:
headers: {
'X-CSRF-TOKEN': csrf_token
}
或者在表单数据中添加:
data: {
<?php echo $this->security->get_csrf_token_name(); ?>: csrf_token,
// 其他数据...
}
确保服务器返回正确的 JSON 格式:
$this->output
->set_content_type('application/json')
->set_output(json_encode($data));
使用浏览器开发者工具:
console.log()
输出调试信息$this->input->is_ajax_request()
确保只处理 AJAX 请求可以使用 CodeIgniter 的 REST 库构建更完整的 RESTful API:
// 加载 REST 库
$this->load->library('rest');
// 定义资源
$this->rest->resource([
'users' => [
'get' => 'Users/get_users',
'post' => 'Users/create_user',
'put' => 'Users/update_user',
'delete' => 'Users/delete_user'
]
]);
对于需要认证的 API,可以集成 JWT:
// JWT 验证示例
public function secure_endpoint() {
$token = $this->input->get_request_header('Authorization');
try {
$decoded = JWT::decode($token, $secret_key, ['HS256']);
// 处理业务逻辑
} catch (Exception $e) {
$this->output
->set_status_header(401)
->set_content_type('application/json')
->set_output(json_encode(['error' => 'Unauthorized']));
}
}
通过以上方法,您可以有效地在 CodeIgniter 中创建 API 并通过 AJAX 获取响应。