찾다
백엔드 개발PHP 튜토리얼小白的边学边写,一个基于laravel的APP接口【API】(二)

前言

根据上一篇文章,我们已经吧 dingo/api给安装并且调试好了,那么下一步,就是来完善咱们的API了。

最首要的步骤一定是要先把注册的功能给完善了,好了,那就给第一条正式API起个名字吧——

http://localhost/register

首先先对这条API进行分析。这是一个用户注册的API,新用户通过访问它来注册账号,之后才能有权限进行其他的操作,享受其它的APP服务。那么我们在访问的时候,就应当把正确的信息输入进去,因为客户端是APP,所以要输入的字段应该是这些——(手机号)phone、(密码)password。

那么在一切准备就绪以后,当服务器处理完操作以后,我们又该获得什么callback呢?

接下来就是我自己作为一个新手小白的个人理解了。当注册成功以后,我们应该立即返回确认用户登录的token值,并且作为APP的config变量给储存起来,直到退出时删除,或者超出时间后删除。

分析完毕,开始实践

在开始之前呢,我们要在项目里安装 JWT(JSON WEB TOKEN),这是一种API的验证方式,详细的部分可以去看文档,它的主要作用就是在客户端的用户发出注册和登录的请求之后,返回一串token值,在之后成功登录以后以这个token值作为凭证来验证是否有获取资源的权限。

如何安装请看这个 JWT

确定安装好 JWT以后,首先就来创建路由吧。

首先打开routes.php,修改路由

Route::post('/register', 'Auth\AuthenticateController@register');

然后创建一个控制器,在laravel项目下运行

php artisan make:controller Auth/AuthenticateController

接下来,我们直接用纯html页面当做APP,去测试API,创建新的test文件夹,结构如下

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文件里添加内容

<!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 &middot;</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里添加如下函数

<?phpnamespace 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值。

这里就不得不来说说我遇到的一个大坑

其实按照以上的代码完全可以将新用户写入数据库的。但是!

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

在里面写上

<?phpnamespace 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~~

성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
PHP의 초록 클래스 또는 인터페이스에 대한 특성과 언제 특성을 사용 하시겠습니까?PHP의 초록 클래스 또는 인터페이스에 대한 특성과 언제 특성을 사용 하시겠습니까?Apr 10, 2025 am 09:39 AM

PHP에서, 특성은 방법 재사용이 필요하지만 상속에 적합하지 않은 상황에 적합합니다. 1) 특성은 클래스에서 다중 상속의 복잡성을 피할 수 있도록 수많은 방법을 허용합니다. 2) 특성을 사용할 때는 대안과 키워드를 통해 해결할 수있는 방법 충돌에주의를 기울여야합니다. 3) 성능을 최적화하고 코드 유지 보수성을 향상시키기 위해 특성을 과도하게 사용해야하며 단일 책임을 유지해야합니다.

DIC (Dependency Injection Container) 란 무엇이며 PHP에서 사용하는 이유는 무엇입니까?DIC (Dependency Injection Container) 란 무엇이며 PHP에서 사용하는 이유는 무엇입니까?Apr 10, 2025 am 09:38 AM

의존성 주입 컨테이너 (DIC)는 PHP 프로젝트에 사용하기위한 객체 종속성을 관리하고 제공하는 도구입니다. DIC의 주요 이점에는 다음이 포함됩니다. 1. 디커플링, 구성 요소 독립적 인 코드는 유지 관리 및 테스트가 쉽습니다. 2. 유연성, 의존성을 교체 또는 수정하기 쉽습니다. 3. 테스트 가능성, 단위 테스트를 위해 모의 객체를 주입하기에 편리합니다.

SPL SplfixedArray 및 일반 PHP 어레이에 비해 성능 특성을 설명하십시오.SPL SplfixedArray 및 일반 PHP 어레이에 비해 성능 특성을 설명하십시오.Apr 10, 2025 am 09:37 AM

SplfixedArray는 PHP의 고정 크기 배열로, 고성능 및 메모리 사용이 필요한 시나리오에 적합합니다. 1) 동적 조정으로 인한 오버 헤드를 피하기 위해 생성 할 때 크기를 지정해야합니다. 2) C 언어 배열을 기반으로 메모리 및 빠른 액세스 속도를 직접 작동합니다. 3) 대규모 데이터 처리 및 메모리에 민감한 환경에 적합하지만 크기가 고정되어 있으므로주의해서 사용해야합니다.

PHP는 파일 업로드를 어떻게 단단히 처리합니까?PHP는 파일 업로드를 어떻게 단단히 처리합니까?Apr 10, 2025 am 09:37 AM

PHP는 $ \ _ 파일 변수를 통해 파일 업로드를 처리합니다. 보안을 보장하는 방법에는 다음이 포함됩니다. 1. 오류 확인 확인, 2. 파일 유형 및 크기 확인, 3 파일 덮어 쓰기 방지, 4. 파일을 영구 저장소 위치로 이동하십시오.

Null Coalescing 연산자 (??) 및 Null Coalescing 할당 연산자 (?? =)은 무엇입니까?Null Coalescing 연산자 (??) 및 Null Coalescing 할당 연산자 (?? =)은 무엇입니까?Apr 10, 2025 am 09:33 AM

JavaScript에서는 NullCoalescingOperator (??) 및 NullCoalescingAssignmentOperator (?? =)를 사용할 수 있습니다. 1. 2. ??= 변수를 오른쪽 피연산자의 값에 할당하지만 변수가 무효 또는 정의되지 않은 경우에만. 이 연산자는 코드 로직을 단순화하고 가독성과 성능을 향상시킵니다.

CSP (Content Security Policy) 헤더 란 무엇이며 왜 중요한가요?CSP (Content Security Policy) 헤더 란 무엇이며 왜 중요한가요?Apr 09, 2025 am 12:10 AM

CSP는 XSS 공격을 방지하고 리소스로드를 제한하여 웹 사이트 보안을 향상시킬 수 있기 때문에 중요합니다. 1.CSP는 HTTP 응답 헤더의 일부이며 엄격한 정책을 통해 악의적 인 행동을 제한합니다. 2. 기본 사용법은 동일한 원점에서 자원을로드 할 수있는 것입니다. 3. 고급 사용량은 특정 도메인 이름을 스크립트와 스타일로드 할 수 있도록하는 것과 같은보다 세밀한 전략을 설정할 수 있습니다. 4. Content-Security Policy 보고서 전용 헤더를 사용하여 CSP 정책을 디버그하고 최적화하십시오.

HTTP 요청 방법 (Get, Post, Put, Delete 등)이란 무엇이며 언제 각각을 사용해야합니까?HTTP 요청 방법 (Get, Post, Put, Delete 등)이란 무엇이며 언제 각각을 사용해야합니까?Apr 09, 2025 am 12:09 AM

HTTP 요청 방법에는 각각 리소스를 확보, 제출, 업데이트 및 삭제하는 데 사용되는 Get, Post, Put and Delete가 포함됩니다. 1. GET 방법은 리소스를 얻는 데 사용되며 읽기 작업에 적합합니다. 2. 게시물은 데이터를 제출하는 데 사용되며 종종 새로운 리소스를 만드는 데 사용됩니다. 3. PUT 방법은 리소스를 업데이트하는 데 사용되며 완전한 업데이트에 적합합니다. 4. 삭제 방법은 자원을 삭제하는 데 사용되며 삭제 작업에 적합합니다.

HTTPS 란 무엇이며 웹 애플리케이션에 중요한 이유는 무엇입니까?HTTPS 란 무엇이며 웹 애플리케이션에 중요한 이유는 무엇입니까?Apr 09, 2025 am 12:08 AM

HTTPS는 HTTP를 기반으로 보안 계층을 추가하는 프로토콜로, 주로 암호화 된 데이터를 통해 사용자 개인 정보 및 데이터 보안을 보호합니다. 작업 원칙에는 TLS 핸드 셰이크, 인증서 확인 및 암호화 된 커뮤니케이션이 포함됩니다. HTTP를 구현할 때는 인증서 관리, 성능 영향 및 혼합 콘텐츠 문제에주의를 기울여야합니다.

See all articles

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전By尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

mPDF

mPDF

mPDF는 UTF-8로 인코딩된 HTML에서 PDF 파일을 생성할 수 있는 PHP 라이브러리입니다. 원저자인 Ian Back은 자신의 웹 사이트에서 "즉시" PDF 파일을 출력하고 다양한 언어를 처리하기 위해 mPDF를 작성했습니다. HTML2FPDF와 같은 원본 스크립트보다 유니코드 글꼴을 사용할 때 속도가 느리고 더 큰 파일을 생성하지만 CSS 스타일 등을 지원하고 많은 개선 사항이 있습니다. RTL(아랍어, 히브리어), CJK(중국어, 일본어, 한국어)를 포함한 거의 모든 언어를 지원합니다. 중첩된 블록 수준 요소(예: P, DIV)를 지원합니다.

SublimeText3 Linux 새 버전

SublimeText3 Linux 새 버전

SublimeText3 Linux 최신 버전

맨티스BT

맨티스BT

Mantis는 제품 결함 추적을 돕기 위해 설계된 배포하기 쉬운 웹 기반 결함 추적 도구입니다. PHP, MySQL 및 웹 서버가 필요합니다. 데모 및 호스팅 서비스를 확인해 보세요.

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

안전한 시험 브라우저

안전한 시험 브라우저

안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.