根据上一篇文章,咱们已经吧dingo/api
给安装而且调试好了,那么下一步,就是来完善我们的API了。
最首要的步骤必定是要先把注册的功能给完善了,好了,那就给第一条正式API起个名字吧——javascript
http://localhost/register
首先先对这条API进行分析。这是一个用户注册的API,新用户经过访问它来注册帐号,以后才能有权限进行其余的操做,享受其它的APP服务。那么咱们在访问的时候,就应当把正确的信息输入进去,由于客户端是APP,因此要输入的字段应该是这些——(手机号)phone、(密码)password。
那么在一切准备就绪之后,当服务器处理完操做之后,咱们又该得到什么callback呢?
接下来就是我本身做为一个新手小白的我的理解了。当注册成功之后,咱们应该当即返回确认用户登陆的token值,而且做为APP的config变量给储存起来,直到退出时删除,或者超出时间后删除。php
在开始以前呢,咱们要在项目里安装JWT(JSON WEB TOKEN),这是一种API的验证方式,详细的部分能够去看文档,它的主要做用就是在客户端的用户发出注册和登陆的请求以后,返回一串token值,在以后成功登陆之后以这个token值做为凭证来验证是否有获取资源的权限。css
如何安装请看这个JWThtml
肯定安装好JWT
之后,首先就来建立路由吧。
首先打开routes.php,修改路由java
Route::post('/register', 'Auth\AuthenticateController@register');
而后建立一个控制器,在laravel项目下运行jquery
php artisan make:controller Auth/AuthenticateController
接下来,
咱们直接用纯html页面当作APP,去测试API,建立新的test文件夹,结构以下laravel
test/ ├── css/ │ └── bootstrap.min.css ├── js/ │ ├── jquery.min.js │ └── bootstrap.min.js ├── fonts/ │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ ├── glyphicons-halflings-regular.woff │ └── glyphicons-halflings-regular.woff2 └── register.html
在register.html文件里添加内容git
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>注册</title> <link href="css/bootstrap.min.css" rel="stylesheet"> </head> <body> <nav class="navbar navbar-default"> <div class="container"> <div class="navbar-header"> <!-- Collapsed Hamburger --> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#spark-navbar-collapse"> <span class="sr-only">切换导航</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <!-- Branding Image --> <a class="navbar-brand" href="#"> <b>i ·</b> APP </a> </div> <div class="collapse navbar-collapse" id="spark-navbar-collapse"> <!-- Left Side Of Navbar --> <ul class="nav navbar-nav"> <li><a href="#">登陆</a></li> </ul> <!-- Right Side Of Navbar --> <ul class="nav navbar-nav navbar-right"> <!-- Authentication Links --> </ul> </div> </div> </nav> <div class="container"> <div class="row"> <div class="col-md-8 col-md-offset-2"> <div class="panel panel-default"> <div class="panel-heading">注册</div> <div class="panel-body"> <form id="register" class="form-horizontal"> <div class="form-group"> <label class="col-md-4 control-label">用户名</label> <div class="col-md-6"> <input type="text" class="form-control" name="name"> </div> </div> <div class="form-group"> <label class="col-md-4 control-label">手机号</label> <div class="col-md-6"> <input type="text" class="form-control" name="phone"> </div> </div> <div class="form-group"> <label class="col-md-4 control-label">密码</label> <div class="col-md-6"> <input type="password" class="form-control" name="password"> </div> </div> <!-- <div class="form-group"> <label class="col-md-4 control-label">密码确认</label> <div class="col-md-6"> <input type="password" class="form-control" name="password_confirmation"> </div> </div> --> <div class="form-group"> <div class="col-md-6 col-md-offset-4"> <button type="submit" class="btn btn-primary"> <i class="fa fa-btn fa-user"></i>当即注册 </button> </div> </div> </form> </div> </div> </div> </div> </div> <script src="js/jquery.min.js"></script> <script src="js/bootstrap.min.js"></script> <script type="text/javascript"> var $registerForm = $('#register'); var response; $registerForm.submit(function(){ $.ajax({ type: "post", url: "http://localhost/register", data: $(this).serialize(), async: false, dataType:'json', success: function(data){ alert(JSON.stringify(data)); }, // complete: function(){ // alert('ok'); // }, // error: function(XMLHttpRequest, textStatus, errorThrown) { // alert(XMLHttpRequest.status); // alert(XMLHttpRequest.readyState); // alert(textStatus); // } }); }); </script> </body> </html>
在AuthenticateController
里添加以下函数github
<?php namespace App\Http\Controllers\Auth; use Illuminate\Http\Request; use App\Http\Requests; use App\Http\Controllers\Controller; use JWTAuth; use Tymon\JWTAuth\Exceptions\JWTException; use App\User; class AuthenticateController extends Controller { public function authenticate(Request $request) { // grab credentials from the request $credentials = $request->only('email', 'password'); try { // attempt to verify the credentials and create a token for the user if (! $token = JWTAuth::attempt($credentials)) { return response()->json(['error' => 'invalid_credentials'], 401); } } catch (JWTException $e) { // something went wrong whilst attempting to encode the token return response()->json(['error' => 'could_not_create_token'], 500); } // all good so return the token return response()->json(compact('token')); } public function register(Request $request) { $newUser = [ 'name' => $request->get('name'), 'phone' => $request->get('phone'), 'password' => bcrypt($request->get('password')), ]; $user = User::create($newUser); $token = JWTAuth::fromUser($user); return response()->json(compact('token')); } }
例子很简单,就是储存请求的数据而后返回token
值。ajax
其实按照以上的代码彻底能够将新用户写入数据库的。可是!token
值不能被返回!这就让人很头大了。因而我又看了看文章,发现以上的那些操做叫作跨域请求。在laravel文档里也有说起,对,就是那个叫jsonp
的东东。因而又看了些文章,把ajax方法修改为了这个样子
$.ajax({ type: "get", url: "http://localhost/register", data: $(this).serialize(), async: false, dataType:'jsonp', jsonp: 'callback' success: function(data){ alert(JSON.stringify(data)); }, complete: function(){ alert('ok'); }, error: function(XMLHttpRequest, textStatus, errorThrown) { alert(XMLHttpRequest.status); alert(XMLHttpRequest.readyState); alert(textStatus); } });
这下又能够写进去了,可是呢!仍是没有token
值的出现。。。
并且呢,请求方式也被换成了get,这是为何呢?后来才知道这是由于jsonp
和post
根本不可能实现,或者说实现起来太难,因此我也就不为难本身了。我到那时就彻底的跑偏了。。。又把ajax
的方法改了回去,打开控制台,再试一遍,才发现,原来想要实现跨域,要在请求的header
中加入Access-Control-Allow-Origin
属性。
这下子感受有但愿了,因而当即建立一个http
中间件吧。
php artisan make:middleware AccessMiddleware
在里面写上
<?php namespace App\Http\Middleware; use Closure; class AccessMiddleware { public function handle($request, Closure $next) { header('Access-Control-Allow-Origin: *'); header('Access-Control-Allow-Methods: GET, POST, OPTIONS'); header('Access-Control-Allow-Headers: Origin, Content-Type, Accept, Authorization, X-Request-With'); header('Access-Control-Allow-Credentials: true'); return $next($request); } }
记得在kernel.php文件中注册中间件哟,在$routeMiddleware
里添加
'access' => \App\Http\Middleware\AccessMiddleware::class,
接下来再来修改路由
Route::group(['middleware' => 'access'], function () { Route::post('/register','Auth\AuthenticateController@register'); });
而后再来测试一下,输入表单,点当即注册,以后bingo
,token值出来了。
用户信息也被正常写入,以后就能够欢快的扩展注册机制啦。
在这里先规划一下吧。首先在控制器内添加表单验证,而后返回不一样的json
数据给客户端。可是毕竟我不是专业的,我只是爱好这个才去写这些东西的,关于应该返回什么数据如今脑子里仍是一片混乱。若是有大神偶然间看到了个人这篇文章,但愿能够给我一点指导和建议,十分的感谢!
上面的例子彻底是我本身看文档+原创给整出来的,若是有错请及时告诉我哟~
上面的例子到最后虽然都实现了,可是我仍然以为很 low,毕竟我的的智慧仍是有限的。若是你们有对这个十分感兴趣,能够联系我,我们能够一块儿边学边作,共同进步!个人邮箱:lwx12525@qq.com
若是恰巧大神路过,请务必给我一些指导,小白将万分的感谢 O(∩_∩)O~~