Laravel v8.15.0 (PHP v7.3.23) 共享服务器上的移动应用程序 API POST 路由不起作用

Posted

技术标签:

【中文标题】Laravel v8.15.0 (PHP v7.3.23) 共享服务器上的移动应用程序 API POST 路由不起作用【英文标题】:Laravel v8.15.0 (PHP v7.3.23) An API for Mobile Application on a Shared Server POST Routes not working 【发布时间】:2021-03-11 02:11:09 【问题描述】:

我在共享服务器上。

Laravel v8.15.0 (php v7.3.23)

无法正确设置。

Sanctum 和 Passport 都尝试过,但由于 500 内部服务器错误而崩溃。所以删除了它们。

https://townies.pk/api/v1/getCart 正在工作。 另一个获取图片的 GET 路径也在工作。

但是https://townies.pk/api/register POST 或https://townies.pk/api/v1/register POST 不起作用。 500 内部服务器错误。

而https://townies.pk/api/login POST 或https://townies.pk/api/v1/login POST 不起作用。 500 内部服务器错误。

api.php

<?php

use App\Models\User;
use App\Http\Controllers\AuthController;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Hash;
use Illuminate\Validation\ValidationException;
use Illuminate\Support\Facades\DB;

/*
|--------------------------------------------------------------------------
| API Routes
|--------------------------------------------------------------------------
|
| Here is where you can register API routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| is assigned the "api" middleware group. Enjoy building your API!
|
*/

/*Route::middleware('auth:api')->get('/user', function (Request $request) 
    return $request->user();
);*/

Route::get('/v1/getCart', function(Request $request)
    return response()->json([
        'success'=> true, 
        'msg'=> "yes",
        'cartItems' => ['Beef Salaami Large: Rs. 780/-', 'Chicken Supreme Small: Rs. 290/-', 'Super Supreme Medium: Rs. 530/-' ]
    ])
    ->header('Content-Type', 'application/json');
);

Route::post('/v1/register', [AuthController::class, 'register'])->name('register');
Route::post('/v1/login', [AuthController::class, 'login'])->name('login');

AuthController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;

class AuthController extends Controller

    public function register(Request $request)
    
        $validator = Validator::make($request->all(), [
            'name' => 'required',
            'email' => 'required|email',
            'password' => 'required'
        ]);

        if($validator->fails())
        
            Log::error('Something is really going wrong.');
            return response()->json(['status_code' => 400, 'message' => 'Bad Request']);
        

        $user = new User();
        $user->name = $request->name;
        $user->email = $request->email;
        $user->password = algo($request->password);
        $user->save();

        return response()->json([
            'status_code' => 201,
            'message' => 'User Registration Successful.'
        ]);
    

    public function login(Request $request)
    
        $validator = Validator::make($request->all(), [
            'email' => 'required|email',
            'password' => 'required'
        ]);

        if($validator->fails())
        
            return response()->json(['status_code' => 400, 'message' => 'Bad Request']);
        

        $credentials = request(['email', 'password']);

        if(!Auth::attempt($credentials))
        
                return response()->json([
                    'status_code' => 401,
                    'message' => 'Unauthorised'
                ]);
        

        $user = User::where('email', $request->email)->first();

        $tokenResult = $user->createToken('authToken')->plaitTextToken;

        return response()->json([
            'status_code' => 200,
            'token' => $tokenResult
        ]);
    

    public function logout(Request $request)
    
        $request->user()->currentAccessToken()->delete();
        return response()->json([
            'status_code' => 200,
            'message' => 'LogOut Successful'
        ]);
    

我的数据库架构

【问题讨论】:

您需要 500 的内容来进一步调试它。另外,我的直觉说这不是 Laravel 中的错误,因为您还在那里发布了跟踪器,而是您的配置错误。 是的,我知道这是我的错误配置。但现在无法弄清楚2天。我只能做 GET 请求。但没有 POST 请求。 【参考方案1】:

下次,请分享您日志中的异常消息。当我们对错误消息本身有清晰的了解时,调试错误会更容易和更快。

我尝试使用 Laravel Sanctum 和 /register 在将缺少的导入添加到 AuthControllerHasApiTokens 特征到 User 模型后正常工作,如下所述。

/login 仍然失败,直到修复此行的错字:

$tokenResult = $user->createToken('authToken')->plaitTextToken;

plaitTextToken 拼写错误。应该是:plainTextToken

这些是 AuthController 上缺少的导入:

use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Validator;

另外,请务必:

Laravel\Sanctum\HasApiTokens 特征添加到User 模型 将 Sanctum 所需的中间件添加到 ./app/Http/Kernel.phpapi 中间件组下 发布和运行 Laravel Sanctum 迁移

所有这些都在 Laravel Sanctum 安装指南中列出,请务必严格按照安装指南进行操作:

https://laravel.com/docs/8.x/sanctum#installation

应用上述更改后,我尝试使用 PHPStorm HTTP 客户端使用这些请求:

POST http://my-app.test/api/v1/register
Accept: application/json
Content-Type: application/json

"name": "bar", "email": "bar@example.com", "password": "password"

###

POST http://my-app.test/api/v1/login
Accept: application/json
Content-Type: application/json

"email": "bar@example.com", "password": "password"

###

这些对应的响应:

POST http://my-app.test/api/v1/register

HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Cache-Control: no-cache, private
Date: Sun, 29 Nov 2020 01:26:22 GMT
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 59
Access-Control-Allow-Origin: *


  "status_code": 200,
  "message": "User Registration Successful."


Response code: 200 (OK); Time: 80ms; Content length: 61 bytes

POST http://my-app.test/api/v1/login

HTTP/1.1 200 OK
Server: nginx/1.18.0 (Ubuntu)
Content-Type: application/json
Transfer-Encoding: chunked
Connection: keep-alive
Vary: Accept-Encoding
Cache-Control: no-cache, private
Date: Sun, 29 Nov 2020 01:27:17 GMT
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 58
Access-Control-Allow-Origin: *


    "status_code": 200,
    "token": "1|5ImkzdVQgNhQyotxlZzs5Hr2YDkTPKfpfovthx1o"


Response code: 200 (OK); Time: 86ms; Content length: 72 bytes

【讨论】:

让我再试一次。必须删除错字。在此共享服务器上,我没有错误或调试日志。一旦我再次测试它,让我更新你..谢谢 @RonnieDepp 您应该在应用程序根文件夹下有一个名为./storage/logs 的可写文件夹。否则 Laravel 每次尝试向日志写入内容时都会崩溃,例如发生异常时。我说的不是系统日志,而是常规的应用程序日志。另外请阅读完整的回复,不仅仅是错字,缺少导入和特征,而且我不确定您是否拥有正确安装 Sanctum 后运行迁移所需的所有表。 Storage/logs 全部为 755。但仍然没有一个日志。存储文件夹有视图、会话、缓存,都是 Laravel 创建的更新日期/时间文件。一旦我按照您的描述成功实施它,我将更新您。我还在主要问题中附上了 DB-SCHEMA 的图像。 我卡住了。每当我将 Auth:Sanctum 中间件添加到 API 路由组时,我都会收到 500 内部服务器错误。没有 laravel 自动记录的错误详细信息。这是我的移动应用程序,它将发出 api 请求。 SinglePageApplication SPA 也将访问这些 API 路由。 laravel.log 文件仅在我明确 Log::error("some error occurred"); - 导入 done - 错字更正 - sanctum 中间件添加到内核文件。 - 特征添加到模型。 - auth:sanctum 之外的路线在启用 Sanctum 后无法访问。 personal_access_tokens 为空。

以上是关于Laravel v8.15.0 (PHP v7.3.23) 共享服务器上的移动应用程序 API POST 路由不起作用的主要内容,如果未能解决你的问题,请参考以下文章

如何通过 h5py 读取 v7.3 mat 文件?

在python中创建一个v7.3的.mat文件

保存 .mat 文件,使用 -v7.3 开关?

如何打开未使用 -v7.3 标志保存的大型 .mat 文件?

php [Laravel Logs] Como loguear cosas con laravel #laravel #php

记完整版Astgo 2014 v7.3全自动安装教程