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