Codeigniter RESTful API在Postman调用时报错:Invalid Request
问题排查与解决:CodeIgniter REST API 全局返回"Invalid Request"错误
可能的原因及对应解决办法
1. 路由配置未正确映射data_model前缀
CodeIgniter的REST路由需要明确配置前缀与控制器的关联,否则请求无法正确路由到对应的控制器。
- 检查
application/config/routes.php,确认是否添加了data_model的路由规则:
若使用REST_Controller的路由功能,也可在控制器构造函数中配置:// 若data_model下的请求对应根目录下的控制器 $route['data_model/(:any)'] = '$1'; // 若Users控制器对应data_model/users路径 $route['data_model/users/(:any)'] = 'users/$1';class Users extends REST_Controller { public function __construct() { parent::__construct(); $this->config->set_item('rest_format', 'json'); } }
2. 请求方式不匹配
REST_Controller默认严格校验请求方法,比如login接口通常需要POST请求,使用GET访问会直接返回无效请求。
- 验证请求方法:在Postman中确保请求方法为
POST(匹配login业务逻辑);其他接口需确认控制器方法命名符合REST规范(如get_xxx对应GET请求,post_xxx对应POST请求)。 - 若需允许多种请求方法,可在控制器构造函数中设置:
public function __construct() { parent::__construct(); $this->methods['login']['methods'] = ['POST', 'GET']; // 允许POST和GET访问login }
3. REST_Controller全局验证未通过
错误码100100大概率是自定义的全局校验失败标识,可能是控制器构造函数中存在前置校验逻辑(如API密钥、请求头检查)。
- 检查控制器构造函数:确认是否存在类似全局校验代码:
若存在此类校验,需在请求中携带正确的验证信息(如Postman Headers中添加public function __construct() { parent::__construct(); // 示例:检查请求头中的API密钥 $api_key = $this->input->get_request_header('API-Key'); if (!$api_key || $api_key != 'your_valid_key') { return_data(false, 'Invalid Request', [], '100100'); exit; } }API-Key字段),或暂时注释校验代码测试。
4. .htaccess配置导致URL重写失败
若启用了URL重写(去掉index.php),.htaccess配置错误会导致请求无法正确解析。
- 检查项目根目录的.htaccess文件,确保配置正确:
同时确认RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteRule ^(.*)$ index.php/$1 [L]application/config/config.php中:$config['index_page'] = ''; $config['uri_protocol'] = 'REQUEST_URI';
5. 控制器未正确继承REST_Controller
若控制器类未正确继承REST_Controller,会导致REST功能失效,触发默认错误返回。
- 确认控制器类定义:
同时确保class Users extends REST_Controller { // ... 你的方法实现 }REST_Controller和Format库已正确放置在application/libraries目录下。
额外代码优化建议
你提供的login方法存在逻辑错误:
// 原代码中两个判断条件均为$user['status'] == 1,第二个分支永远无法触发 if ($user['status'] == 1) return_data(false, 'Your Account Disabled', json_decode("{}")); else if ($user['status'] == 1) return_data(false, 'Account Deleted', json_decode("{}"));
建议修正为:
if ($user['status'] == 1) { return_data(false, 'Your Account Disabled', (object)[]); } else if ($user['status'] == 2) { // 假设账号删除对应的status值为2 return_data(false, 'Account Deleted', (object)[]); } else { return_data(true, 'User authentication successful.', $user); }
另外,json_decode("{}")可直接替换为(object)[]或[],更简洁高效。
内容的提问来源于stack exchange,提问作者Vikrant Malhotra
相关产品推荐
相关产品推荐

