摘要:之前我們已經(jīng)準(zhǔn)備好了基本的安裝過程現(xiàn)在我們?nèi)?shí)現(xiàn)一下具體的業(yè)務(wù)部分用戶的登錄與注冊(cè)對(duì)于用戶注冊(cè)這對(duì)于一款應(yīng)用來說再正常不過了為了接下來我們的效果我們可以去生成一個(gè)即在項(xiàng)目終端執(zhí)行生成用戶之后我們暫時(shí)先不去編輯字段后面我們需要用到時(shí)再加返回字
之前我們已經(jīng)準(zhǔn)備好了基本的安裝過程 現(xiàn)在我們?nèi)?shí)現(xiàn)一下具體的業(yè)務(wù)部分
用戶的登錄與注冊(cè)對(duì)于用戶注冊(cè) 這對(duì)于一款應(yīng)用來說再正常不過了 為了接下來我們的效果 我們可以去生成一個(gè)UserController
即在項(xiàng)目終端執(zhí)行
$ php artisan make:controller AppApiControllersUserController
生成用戶之后我們暫時(shí)先不去編輯字段 后面我們需要用到時(shí)再加
返回字段數(shù)據(jù)沿用之前創(chuàng)建的Lesson Model 這里我們先在routes/api.php加上我們的基本路由
Route::middleware("auth:api")->get("/user", function (Request $request) { return $request->user(); }); $api = app("DingoApiRoutingRouter"); $api->version("v1", function ($api) { $api->group(["namespace" => "AppApiControllers"], function ($api) { $api->get("lessons", "LessonsController@index"); $api->get("lessons/{id}", "LessonsController@show"); }); });
我們就去訪問這個(gè)http://host/api/lessons 先去完成控制器的相關(guān)方法
public function index() { $lessons = Lesson::all(); return response()->json($data); }
這只是簡單的返回Lessons的全部字段信息 但是我們可以看到已經(jīng)返回了所有的字段信息
但是這個(gè)時(shí)候有個(gè)問題就是 我們的字段返回時(shí)不可能是全部返回的 我們肯定會(huì)對(duì)一些字段進(jìn)行篩選 這就用到了我們之前創(chuàng)建的Transformers這個(gè)文件下的了
話不多說 在App/Api/Transformers目錄下新建LessonTranformer
use AppLesson; use LeagueFractalTransformerAbstract; class LessonTransformer extends TransformerAbstract { public function transform(Lesson $lesson) { return [ "title" => $lesson["title"], "content" => $lesson["body"], "is_free" => (boolean)$lesson["free"] ]; } }
這樣我們就實(shí)現(xiàn)了對(duì)字段數(shù)據(jù)的映射 再去LessonController去對(duì)之前的所有字段進(jìn)行映射
public function index() { $lessons = Lesson::all(); return $this->collection($lessons,new LessonTransformer()); }
當(dāng)然這個(gè)要想實(shí)現(xiàn)這個(gè)collection我們需要使用Dingo提供給我們的Helpers trait
這樣一來的話我們之前所繼承的基類可以這樣寫
use DingoApiRoutingHelpers; class Controller extends BaseController { use Helpers,AuthorizesRequests, DispatchesJobs, ValidatesRequests; }
這樣我們返回的就只有title content is_free這三個(gè)字段
同樣的如果我們想要獲取其中一條數(shù)據(jù)的話 我們也是可以這樣去映射字段的
public function show($id) { $lesson = Lesson::find($id); if(!$lesson){ return $this->response()->errorNotFound("Lesson nt found"); } return $this->response()->item($lesson,new LessonTransformer()); }
這里我用的是Dingo提供給的返回方法 如果沒有這條數(shù)據(jù)會(huì)返回404和對(duì)應(yīng)的錯(cuò)誤信息
下面就是 結(jié)合jwt的auth認(rèn)證
為此我們?cè)?b>AppApiControllers目錄下新建一個(gè)AuthController
這里我們需要去編寫我們的認(rèn)證方法和獲取認(rèn)證用戶的方法
新建認(rèn)證
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")); }
為了執(zhí)行這個(gè)方法 可以去路由中定義
$api->version("v1", function ($api) { $api->group(["namespace" => "AppApiControllers"], function ($api) { $api->post("user/login","AuthController@authenticate"); $api->post("user/register","AuthController@register"); }); });
這個(gè)時(shí)候再去查看一下我們的路由的話就會(huì)看到新定義的post路由
為了驗(yàn)證請(qǐng)求的結(jié)果 我們可以使用postman這個(gè)chrome工具 去請(qǐng)求http://localhost:8000/api/use...
這個(gè)時(shí)候是會(huì)返回{"error":"invalid_credentials"}
為了能夠正確通過,我們可以在body部分給出用戶郵箱和密碼(用戶可用thinker創(chuàng)建一個(gè)) 這個(gè)時(shí)候就會(huì)正確返回一個(gè)token
當(dāng)然為了測試的話可以直接去tinker新建一個(gè)用戶即可 這里我已經(jīng)新建了一個(gè)用戶郵箱是jellybean@163.com的用戶
這樣我們就可以拿到用戶的token 我們?cè)诩?b>jwt認(rèn)證時(shí) 添加了jwt:auth的中間件
這個(gè)其實(shí)很好理解 就比如一篇文章 如果用戶沒有登錄進(jìn)來你是不能對(duì)文章進(jìn)行收藏 評(píng)論等操作的
那么這個(gè)token我們是在用戶登錄之后或者用戶注冊(cè)之后會(huì)返回給客戶段一個(gè)token值 這樣用戶憑借這個(gè)token
也就是一個(gè)證明你是已經(jīng)登錄的用戶 你是我們這個(gè)網(wǎng)站的用戶 這樣你就可以發(fā)表文章等操作
這樣的話我們可以為一些路由添加一些中間件
$api->group(["namespace" => "AppApiControllers","middleware"=>"jwt.auth"],function ($api){ $api->get("lessons","LessonsController@index"); $api->get("lessons/{id}","LessonsController@show"); });
這樣的話我們?cè)偃ピL問某一個(gè)lesson的話
提示我們?nèi)鄙?b>token 因?yàn)楝F(xiàn)在相當(dāng)于一個(gè)沒有登錄的用戶去訪問這條路由 那么我們?cè)偃ソ由衔覀兊?b>token的話
這下我們就可以訪問到對(duì)應(yīng)的數(shù)據(jù)了 這個(gè)token也是會(huì)有過期時(shí)間的 如果過期了 我們需要去更新這個(gè)token
在應(yīng)用中我們可以加一個(gè)api_token字段來存儲(chǔ)這個(gè)字段 這樣每次用戶去訪問相應(yīng)的路由的話我們會(huì)去驗(yàn)證這個(gè)token
當(dāng)然 jwt 安裝成功后 ,默認(rèn)使用的 auth 進(jìn)行 認(rèn)證 ,讀取的也是users表的數(shù)據(jù)
如果是需要驗(yàn)證其他的數(shù)據(jù)表的話可以參照這篇文章 jwt 自定義 數(shù)據(jù)表 區(qū)別于 auth 中的 users 表
這樣基本就實(shí)現(xiàn)了一個(gè)基本的后臺(tái)接口的請(qǐng)求過程
參考我的博客文章Laravel API開發(fā)初探
Laravel API結(jié)合Dingo API和JWT
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/25635.html
摘要:介紹在開發(fā)后臺(tái)接口現(xiàn)在更多的企業(yè)選擇了來開發(fā)后臺(tái)接口當(dāng)然和不失為是一種不錯(cuò)的選擇不過這里就以為例基于框架開發(fā)后臺(tái)這里也是如果你是從事其他方向想做一些后臺(tái)開發(fā)都可以去嘗試一下的當(dāng)然實(shí)例項(xiàng)目我會(huì)不放在我的上僅供參考地址前期準(zhǔn)備當(dāng)然前提是安裝 介紹 在開發(fā)后臺(tái)接口現(xiàn)在更多的企業(yè)選擇了PHP來開發(fā)后臺(tái)接口 當(dāng)然Python和NodeJs不失為是一種不錯(cuò)的選擇 不過這里就以PHP為例 基于Lar...
摘要:后端開發(fā)的疑惑后端開發(fā)最常面對(duì)的一個(gè)問題性能高并發(fā)等等。而到了時(shí)代,在方面有了前后端分離概念移動(dòng)后端更是無力渲染天然前后端分離。 先來上一張前端頁面的效果圖(Vue + Vux + Vuex + Vue-Router)。showImg(https://segmentfault.com/img/remote/1460000010207850); 第一次做gif 沒什么經(jīng)驗(yàn),太大了。加載...
摘要:前期準(zhǔn)備原文地址前言,為什么做以及要做個(gè)啥本人姓小名白,不折不扣編程屆小白一名,但是自從大一那會(huì)兒接觸到編程這件奇妙的事情,就完完全全的陷入的程序的世界??蚣?,是我最喜歡的框架了,沒有之一。 前期準(zhǔn)備 原文地址前言,為什么做以及要做個(gè)啥本人姓小名白,不折不扣編程屆小白一名,但是自從大一那會(huì)兒接觸到編程這件奇妙的事情,就完完全全的陷入的程序的世界。這不,最近又開始折騰APP了,話說現(xiàn)在開...
閱讀 2122·2023-04-26 02:23
閱讀 1860·2021-09-03 10:30
閱讀 1427·2019-08-30 15:43
閱讀 1262·2019-08-29 16:29
閱讀 623·2019-08-29 12:28
閱讀 2398·2019-08-26 12:13
閱讀 2357·2019-08-26 12:01
閱讀 2487·2019-08-26 11:56