thinkphp5+mui跨域请求实现

本篇笔记为大家分享下thinkphp5与mui前端框架开发中的跨域解决方法。其实在写接口方面,市场上有很多专门用来写接口的开发框架,thinkphp5不似5.1已经内置了跨域请求的处理,因此就需要我们单独实现一下。

效果预览图:

thinkphp5跨域请求

想要实现跨域请求,首先需要明白的是CROS同源策略,这个波波不去分享,百度一下教程很多。我们需要明白的一点就是这个必须通过服务器接口端设置header来实现。下面我们看下CORS请求的整个流程。

cros流程图

其次需要明白的一点就是前端在发起POST请求时会先发送一个options请求,来判断服务器端资源是否允许跨域。因此基于以上两点我们来实现TP5的跨域。

首先我们封装一个BasicApi的控制器,源码大致如下:

  1. class BasicApi extends Controller
  2. {
  3.     /**
  4.      * 访问请求对象
  5.      * @var Request
  6.      */
  7.     public $request;
  8.     /**
  9.      * 当前访问身份
  10.      * @var string
  11.      */
  12.     public $token;
  13.     /*
  14.      * 用户信息
  15.      */
  16.     public $UserInfo;
  17.     /**
  18.      * 基础接口SDK
  19.      * @param Request|null $request
  20.      */
  21.     public function __construct(Request $request = null)
  22.     {
  23.         // 输入对象
  24.         ToolsService::corsRequestHander();
  25.         $this->request = is_null($request) ? Request::instance() : $request;
  26.         if(!$this->request->isPost()){
  27.             $this->response(1,"不合法的请求方式");
  28.         }
  29.     }
  30.     /**
  31.      * 输出返回数据
  32.      * @param string $msg 提示消息内容
  33.      * @param string $code 业务状态码
  34.      * @param mixed $data 要返回的数据
  35.      * @param string $type 返回类型 JSON XML
  36.      * @return Response
  37.      */
  38.     public function response($code = 'SUCCESS',$msg$data = [], $type = 'json')
  39.     {
  40.         $result = ['code' => $code,'msg' => $msg, 'data' => $data, 'type' => strtolower($type)];
  41.         $response = Response::create($result$type)->header(ToolsService::corsRequestHander())->code(200);
  42.         return $response->send();
  43.     }
  44. }

我的所有接口是禁止除POST请求之外的其他类型请求的,大家若复制代码的话可删除相关判断。中间有一个ToolsService::corsRequestHander();  同源检测,同源检测的代码如下:

  1. /**
  2.  * Cors Options 授权处理
  3.  */
  4. public static function corsOptionsHandler()
  5. {
  6.     if (request()->isOptions()) {
  7.         header('Access-Control-Allow-Origin:*');
  8.         header('Access-Control-Allow-Headers:Accept,Referer,Host,Keep-Alive,User-Agent,X-Requested-With,Cache-Control,Content-Type,Cookie,token');
  9.         header('Access-Control-Allow-Credentials:true');
  10.         header('Access-Control-Allow-Methods:GET,POST,OPTIONS');
  11.         header('Access-Control-Max-Age:1728000');
  12.         header('Content-Type:text/plain charset=UTF-8');
  13.         header('Content-Length: 0', true);
  14.         header('status: 204');
  15.         header('HTTP/1.0 204 No Content');
  16.     }else{
  17.         header('Access-Control-Allow-Origin:*');
  18.         header('Access-Control-Allow-Headers:Accept,Referer,Host,Keep-Alive,User-Agent,X-Requested-With,Cache-Control,Content-Type,Cookie,token');
  19.         header('Access-Control-Allow-Credentials:true');
  20.         header('Access-Control-Allow-Methods:GET,POST,OPTIONS');
  21.     }
  22. }

OK,处理完接口的基础控制器之后我们就可以正式开始写接口了,正式的接口需要继承BasicApi控制器,前端代码POST请求很简单,我就不再赘述了。给大家一个示例:

  1. var postData = {"account":mobile,"password":passstr};
  2. $.ajax({
  3.     url:host+'index/login',
  4.     type:"post",
  5.     dataType:"json",
  6.     data:postData,
  7.     success:function(data){
  8.         if(data.code == 0){
  9.             mui.toast('登陆成功');
  10.             //将用户数据写入本地并执行跳转
  11.         }else{
  12.             mui.toast(data.msg);
  13.         }
  14.     },
  15.     error:function(){
  16.         mui.toast('请求异常');
  17.     }
  18. })

这是一种处理方式,另外一种方式就是tp5的中间件。我们可以注册一个中间件来实现CORS跨域,当然了也有更省事的人会在接口上直接加header,但是说实话我也不太清楚什么原因,接口加header在一些情况下可以用,在一些情况下用不了。而上面这个方法则适合前后端完全分离时的数据交互。

相关功能已经更新到了最新版的开发框架中,需要的朋友可以直接下载。https://gitee.com/zkii_admin/Tp-admin

这个开发框架虽然开发时间只有短短7~8天时间,但基本上已经是最终版本了。这套框架也会继续维护下去,希望给开发者们提供一套简单,易用的后台开发框架。

 

 

你想把广告放到这里吗?

发表评论

您必须 登录 才能发表留言!