在Nginx上搭建OS Restful 或API访问测试环境步骤及常见错误解决
当下的系统更多要求适应多终端展现,实现所谓“高内聚与低耦合”,就是能够封装数据,便宜不同终端程序调用,最常适配的除了PC端和H5端,就是APP与微信小程序。所以很多产品都在开发独立的API以便调用。如果使用Nginx搭建OS的API测试环境需注意:
一. 开启重写与路由
1. 环境准备:
PHP Study 2018 + OpenSNS 5.7开源版。安装过程略。安装过程中注意:
(1)不要使用二级域名,使用www.XXX.com(或XXX.com)顶级域名,此处假定我们使用http://www.myapi.io作为网站域名。
(2)确定域名是虚拟主机路径的根目录。不要将主程序置于根目录的子目录中。
2. 检查httpd.conf文件是否设置了正确的虚拟路径。
锚点位置:DocumentRoot。假设物理路径为:D:\WWW
3. 检查httpd.conf文件中是否开启了重写设置。
锚点位置:LoadModule rewrite_module modules/mod_rewrite.so
4. OpenSNS设置
打开OS后台【系统】—>【网站设置】—>【系统配置】,检查URL模式,选择“兼容模式”。
或者修改文件设置,位置在:/Conf/common.php,找到’'URL_MODEL',一共有4个值,即0,1,2,3,代表四种模式,其中:
0 - 传统的URL参数模式,例如:http://www.myapi.io/weibo/index/weibodetail?id=1.html
1 - TP系统默认的智能模式,即PathInfo模式,例如:
http://www.myapi.io/index.php?s=/weibo/index/weibodetail/id/1.html
或
http://www.myapi.io/weibo/index/weibodetail/id/1.html
这里第一个参数会被解析为模块名称,或者路由路径名称,即weibo;
第二个参数被解析为控制器名称,即IndexController;
第三个参数被解析为方法名称,即weiboDetail();
而之后的参数即为方法中所带参数,即id值。
2 - Rewrite模式,需要定义.htaccess文件内容,例如隐藏入口index.php文件等
3 - 兼容模式,即传统模式0和智能模式1的结合,兼容模式的好处是不用切换URL模式设置,直接由浏览器判断匹配模式类型。
具体可参考文档TP文档:https://www.kancloud.cn/manual/thinkphp/1697
二. 添加重写规则与错误排查
1. 常规设置
先测试完整的网址访问网站是否成功,包括:
http://www.myapi.io/index.php?s=home/index/index
成功后利用PHP Study打开文件vhost.conf,找到该域名的设置,代码如下:
server {
listen 80;
server_name www.myapi.io ;
root "D:\WWW\myapi";
location / {
index index.html index.htm index.php;
#autoindex on;
}
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}
检查设置是否已包含上述代码,特别是fastcgi_split_path,fastcgi_param。如果齐全,可直接添加如下代码:
server {
listen 80;
server_name www.myapi.io ;
root "D:\WWW\myapi";
location / {
index index.html index.htm index.php;
#autoindex on;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
rewrite ^(.*)$ /index.php$1 last;
break;
}
}
location ~ \.php(.*)$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}
很明显,这段代码是利用Rewrite模式,去除入口文件index.php,去除之后,加上之前的配置,就可以使用Restful风格的路由地址了!于是可以测试如下网址:
http://www.myapi.io/home/index/index
如果访问成功,则说明配置正确。
2. 常见问题
(1)无法加载控制器
A. 物理路劲与虚拟路径不匹配,可检查域名和路径设置。
B. index.php没有被重写,可检查代码。
C. Restful风格的OS URL路径写错,可检查正确路径。
D. 模块配置代码中有其它路由写法。
(2)关于开启模块中的路由写法
根据TP规则和OS定义,在每个模块的配置文件,即config.php文件中,可以根据自身需求开启路由,以微博模块为例:
微博模块原本的URL为:http://www.myapi.io//index.php?s=weibo/index/index
正常重写后可以这样访问:http://www.myapi.io/weibo/index/index
如果访问出错,还可以检查weibo/conf/config.php,开启路由的代码定义如下:
return array(
//开启路由及定义路由规则
'URL_ROUTER_ON' => true,
'URL_ROUTE_RULES' => array();
);
在路由规则中,检查是否定义不同的路由规则。在OS中的路由规则文件是: route_rules.php
三. 测试API访问
可以使用API测试工具进行接口访问测试。本人使用Postman。测试时可以参考OS的API文档:
http://os.opensns.cn/book/index/read/id/5.html,也可自行编写简单的API端口测试代码进行测试。简单的 API接口编写与测试步骤(具体代码略):
1. 在模块控制器中编写功能代码
2. 在模块控制器中引入TP规则
3. 定义路由规则
4. 返回值格式定义为Json格式
5. 测试
完整实例可参考TP文档:https://www.kancloud.cn/manual/thinkphp/1711
这里说明一下测试,测试的前提必须保证路由成功。可现在浏览器中测试,以微博为例,发布一条微博内容,如“自定义测试”,按之前所述,访问如下地址:
http://www.myapi.io/weibo/index/weibodetail/id/1.html
如果访问正常,显示所发微博内容为:“自定义测试”,那么可以使用Postman工具进行调试了:
(1)方法:GET
(2)地址:http://www.myapi.io/weibo/index/weibodetail
(3)参数:id=1
至此便可看到返回的Json结果值为“自定义测试”。整个配置与测试过程即告完毕。