本篇笔记为大家分享下thinkphp5与mui前端框架开发中的跨域解决方法。其实在写接口方面,市场上有很多专门用来写接口的开发框架,thinkphp5不似5.1已经内置了跨域请求的处理,因此就需要我们单独实现一下。
效果预览图:
想要实现跨域请求,首先需要明白的是CROS同源策略,这个波波不去分享,百度一下教程很多。我们需要明白的一点就是这个必须通过服务器接口端设置header来实现。下面我们看下CORS请求的整个流程。
其次需要明白的一点就是前端在发起POST请求时会先发送一个options请求,来判断服务器端资源是否允许跨域。因此基于以上两点我们来实现TP5的跨域。
首先我们封装一个BasicApi的控制器,源码大致如下:
- class BasicApi extends Controller
- {
- /**
- * 访问请求对象
- * @var Request
- */
- public $request;
- /**
- * 当前访问身份
- * @var string
- */
- public $token;
- /*
- * 用户信息
- */
- public $UserInfo;
- /**
- * 基础接口SDK
- * @param Request|null $request
- */
- public function __construct(Request $request = null)
- {
- // 输入对象
- ToolsService::corsRequestHander();
- $this->request = is_null($request) ? Request::instance() : $request;
- if(!$this->request->isPost()){
- $this->response(1,"不合法的请求方式");
- }
- }
- /**
- * 输出返回数据
- * @param string $msg 提示消息内容
- * @param string $code 业务状态码
- * @param mixed $data 要返回的数据
- * @param string $type 返回类型 JSON XML
- * @return Response
- */
- public function response($code = 'SUCCESS',$msg, $data = [], $type = 'json')
- {
- $result = ['code' => $code,'msg' => $msg, 'data' => $data, 'type' => strtolower($type)];
- $response = Response::create($result, $type)->header(ToolsService::corsRequestHander())->code(200);
- return $response->send();
- }
- }
我的所有接口是禁止除POST请求之外的其他类型请求的,大家若复制代码的话可删除相关判断。中间有一个ToolsService::corsRequestHander(); 同源检测,同源检测的代码如下:
- /**
- * Cors Options 授权处理
- */
- public static function corsOptionsHandler()
- {
- if (request()->isOptions()) {
- header('Access-Control-Allow-Origin:*');
- header('Access-Control-Allow-Headers:Accept,Referer,Host,Keep-Alive,User-Agent,X-Requested-With,Cache-Control,Content-Type,Cookie,token');
- header('Access-Control-Allow-Credentials:true');
- header('Access-Control-Allow-Methods:GET,POST,OPTIONS');
- header('Access-Control-Max-Age:1728000');
- header('Content-Type:text/plain charset=UTF-8');
- header('Content-Length: 0', true);
- header('status: 204');
- header('HTTP/1.0 204 No Content');
- }else{
- header('Access-Control-Allow-Origin:*');
- header('Access-Control-Allow-Headers:Accept,Referer,Host,Keep-Alive,User-Agent,X-Requested-With,Cache-Control,Content-Type,Cookie,token');
- header('Access-Control-Allow-Credentials:true');
- header('Access-Control-Allow-Methods:GET,POST,OPTIONS');
- }
- }
OK,处理完接口的基础控制器之后我们就可以正式开始写接口了,正式的接口需要继承BasicApi控制器,前端代码POST请求很简单,我就不再赘述了。给大家一个示例:
- var postData = {"account":mobile,"password":passstr};
- $.ajax({
- url:host+'index/login',
- type:"post",
- dataType:"json",
- data:postData,
- success:function(data){
- if(data.code == 0){
- mui.toast('登陆成功');
- //将用户数据写入本地并执行跳转
- }else{
- mui.toast(data.msg);
- }
- },
- error:function(){
- mui.toast('请求异常');
- }
- })
这是一种处理方式,另外一种方式就是tp5的中间件。我们可以注册一个中间件来实现CORS跨域,当然了也有更省事的人会在接口上直接加header,但是说实话我也不太清楚什么原因,接口加header在一些情况下可以用,在一些情况下用不了。而上面这个方法则适合前后端完全分离时的数据交互。
相关功能已经更新到了最新版的开发框架中,需要的朋友可以直接下载。https://gitee.com/zkii_admin/Tp-admin
这个开发框架虽然开发时间只有短短7~8天时间,但基本上已经是最终版本了。这套框架也会继续维护下去,希望给开发者们提供一套简单,易用的后台开发框架。