如何在CodeIgniter中为API URI添加.json扩展名?
在CodeIgniter中实现带.json后缀的API URL
嘿,我看你已经在尝试用路由配置来实现.json后缀的URL了,不过现有配置里有个小细节需要调整,另外我还可以给你提供更灵活的方案,让你既能实现单个接口的.json后缀,也能支持全局的接口都用这种格式~
首先修正你现有路由的问题
你写的$route['/data.json'] = "/data/index";里,路由规则开头的斜杠是多余的,CodeIgniter的路由匹配是从URI的第一个分段开始的,不需要加开头的/,正确的写法应该是:
$route['default_controller'] = 'data'; $route['404_override'] = ''; $route['translate_uri_dashes'] = FALSE; // 修正后的单个路由配置 $route['data.json'] = 'data/index';
这样访问www.example.com/data.json就会正确映射到data控制器的index方法了。
更灵活的全局.json后缀支持
如果你的API有多个接口,不想一个个写路由,那可以用正则表达式来匹配所有带.json后缀的URI,自动去掉后缀并映射到对应的控制器和方法:
// 匹配 控制器/方法.json 的格式 $route['([a-zA-Z0-9_-]+)/([a-zA-Z0-9_-]+)\.json'] = '$1/$2'; // 匹配 控制器.json 的格式(默认调用index方法) $route['([a-zA-Z0-9_-]+)\.json'] = '$1/index';
这样不管是www.example.com/user.json还是www.example.com/user/profile.json,都会分别映射到user/index和user/profile方法。
在控制器中处理JSON响应
当然,光路由映射还不够,你可能需要在控制器里判断当前请求是要返回JSON数据,这里有两种简单的方式:
方式1:通过路由传递格式参数
修改路由,把格式作为参数传给控制器方法:
$route['data.json'] = 'data/index/json';
然后在data控制器的index方法里处理:
public function index($format = '') { // 准备要返回的数据 $response_data = [ 'status' => 'success', 'data' => ['id' => 1, 'name' => 'Sample Data'] ]; if ($format === 'json') { // 设置响应头为JSON格式,输出JSON数据 $this->output ->set_content_type('application/json') ->set_output(json_encode($response_data)); } else { // 如果是普通请求,返回视图或者其他格式 $this->load->view('data_view', $response_data); } }
方式2:直接检查URI后缀(适合全局正则的情况)
如果用了全局正则路由,你可以通过$this->uri->uri_string()来检查原始URI是否包含.json:
public function index() { $response_data = [ 'status' => 'success', 'data' => ['id' => 1, 'name' => 'Sample Data'] ]; if (str_ends_with($this->uri->uri_string(), '.json')) { $this->output ->set_content_type('application/json') ->set_output(json_encode($response_data)); } else { $this->load->view('data_view', $response_data); } }
这样就能完美实现你想要的.json后缀URL功能啦~
内容的提问来源于stack exchange,提问作者Saad Amir
相关产品推荐
相关产品推荐

