工作中,客户端的朋友难免遇到与后端关于接口数据结构问题的扯皮,大大浪费了时间,针对这点学习一点后端知识,能把多数无技术含量的扯皮扼杀在后端小学生开口之前.
经过改良后的开发流程大概这样:
根据接口定义完成开发, 在服务器上根据定义构造测试数据, 服务器上编写好相关的接口, 更改电脑host至服务器, 手机捆绑代理, 测试完成, 把自测流程和结果提给测试, 远离扯皮, 愉快喝茶(加班).
用到的知识点
1.服务器搭建(是否开启ssl要和app中同步,原因后讲) 2.host, 3.php编写接口 ;
php简直是世界上最好的语言, 没有之一….
这里不讲搭建服务器,不懂得小兄弟自行谷歌…需要具有一定的php语言和调试基础 :
1.搭建服务器
不要一味追求https来使得更炫酷,要保证和app的服务器同步, 因为如果你的app对应的服务器不是https, 而你使用开启ssl的服务器来host, 此时会有这样的现象(从抓包工具,或者浏览器可以看到): 开始访问原始url之后(http), host解析域名重新指向主机(https), 此时url中紧邻域名之后的位置会自动删掉一个字符, 这个字符可能是 反斜杠,问号等有意义的字符,进而导致重定向失败,初步分析是http协议栈为防止url溢出,申请了固定长度的字符串来容纳url的域名段,http定向到https后,前段的字符串增加了1,即字符 “s” ,因此导致了末尾的裁剪 . 有小伙伴能解决这个问题的(除去重编译内核) 愿听详解.
2.更改电脑端的host
把你要测试的域名映射到服务器的ip, 以使得相关的接口定向到自己的服务器, 拦截到请求. 这里推荐一款软件 switchHosts, 能很轻易的切换host, 不需要重复输入密码, 但软件安全上存在一定的风险, 酌情考虑使用.
3. 重点在接口的提供和各个url的拦截
1. 更改了host之后, 原来访问正常服务器的url被重新指向了新的服务器, 处理逻辑定向到 apache 配置的根路径的 index.html或index.php, 这里应该放置一个index.php文件, 用于给所有接口分流(根据参数, 把请求分发给相关的处理逻辑).
2. 在index.php文件中,不要加相关接口的处理逻辑, 建议只应该放针对不同参数url的分流, 例如 ? a=say_hello 接口和 ?a=say_goodbye 接口, 其处理逻辑应该分别定向到其他文件中.
index.php请求拦截逻辑如:
<?php
$url = 'http://www.macro-c.cn/wordpress/';
if(count($_GET)!=0)
{
$param_a = $_GET['a'];
//根据 a 参数区分不同接口
if($param_a=='check-user-first-come')
{
$url = $url.'api_test/check-user-first-come.php';
}
else if($param_a == 'book-detail' or $param_a == 'get-long-comment-info')
{
$url = $url.'api_test/community.php';
}
else if($param_a == 'after-share')
{
$url = $url.'api_test/after-share.php';
}
else
{
//未定义的接口:代理服务器请求原接口,将返回数据转发
$url = $url.'api_test/final-url.php';
$url = $url.'?'.$_SERVER['QUERY_STRING'];
}
}
header("Location: $url");
?>
上例中php代码, 首先根据参数 a 的值不同, 重新拼接url , 将url定向到不同的处理接口, 再根据具体的需求在各个处理接口返回相应的假数据. 其中header( )方法这里的作用是url转发;
保护周边接口,降低影响范围:
注意一点, 一个app,从启动到切换到测试页面过程中,可能需要调用非常多个接口, 在自己的服务器中全部定义相关的接口是不可能的, 但此时由于已经将目标服务器的host定向到了本机, 所有的请求不会再指向原来的服务器, 此时可能造成很多页面得不到数据. 因此上例中else逻辑处, 对url进行了重新拼接,并且还原了原url的所有参数, 定向到了final-url.php中,
周边接口统一处理逻辑final-url.php形式如:
<?php
header("Content-Type: text/html;charset=utf-8");
$url_full = 'http://mapi7.dangdang.com/index.php'.'?'.$_SERVER['QUERY_STRING'];
echo file_get_contents($url_full);
?>
上例的作用是以当前服务器作为客户端做url请求, 并将结果原样返回.
这样一番操作, 就能根据url的接口不同, 返回不同类型的测试数据, 并且可以做到不影响其他接口.
拦截接口的处理逻辑:
其他接口处理函数 如 after-share.php其代码形式如下:
<?php
header("Content-Type: text/html;charset=utf-8");
include_once 'tools_headfile.php';
$task =
'{
"errorCode":0,
"errorMsg":"成功",
"hasGetReWard":"2"
}';
$str_task =
'{
"toast":"呵呵傻逼",
"btnStr":"跳任务列表",
"linkUrl":"communitytasklist://"
}';
$arrayOut = string_to_array($task);
$arrayOut_task = string_to_array($str_task);
$arrayOut['task'] = $arrayOut_task;
echo JSON($arrayOut);
?>
其中string_to_array()和JSON()都是 封装的函数, 作用是将字符串转换成php数组(键值对数组), 和将数组(键值对数组)转换成json对象.
只需基本的php知识, 方便了前端,后端,测试同学的工作. 现在, 一言不合送给测试代理的ip地址和端口号, 完
友情推荐几款工具: switch hosts很方便的切换host; sublime text 神器;filezilla神器