laravel 10 API 端点(/dp 和 /dj)的 POST 意外执行 Web 路由而不是 API 路由,而其他 API 端点功能正常

问题描述 投票:0回答:1

我正在使用 Laravel 10 开发一个 Rest API 项目,尽管已经为端点(/dp 和 /dj)正确配置了 Laravel API 路由,但对这两个端点的 POST 请求意外地执行了 Web 路由,而不是预期的 api.php路线。奇怪的是,除了这两个端点(/dp 和 /dj)的 POST 之外的所有方法以及其他端点中的其他 POST 都可以正常运行。因此,例如,如果我点击这两个端点(/dp 和 /dj)的 put、get 或 delete 方法,它会按预期工作,但不会是 POST 方法。如果我在 web.php 中删除该路由,它会返回“404 未找到”。


Api.php 路由


<?php
Route::group(['namespace' => 'App\Http\Controllers', 'middleware' => 'auth:sanctum'],function () {
    Route::apiResource('users', UserController::class)->middleware(['auth','verified','role:admin']);
    Route::apiResource('mous', MouController::class)->middleware(['auth','verified','role:admin|nasabah|banker']);
    Route::apiResource('office', OfficeController::class)->middleware(['auth','verified','role:admin']);
    Route::apiResource('jdp', JDPController::class)->middleware(['auth','verified','role:admin|nasabah|banker']);
    Route::apiResource('dp', DPController::class)->middleware(['auth','verified','role:admin|nasabah']);
    Route::apiResource('jdj', JDJController::class)->middleware(['auth','verified','role:admin|nasabah']);
    Route::apiResource('dj', DJController::class)->middleware(['auth','verified','role:admin|nasabah']);
});

网络路线


Route::get('/', function () {
    return view('welcome');
});

DP 控制器(/dp 和 /dj 逻辑相似,所以我只展示其中之一)


<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\DokumenPribadi;
use App\Http\Resources\DPResource;
use Illuminate\Support\Facades\Auth;
use App\Http\Requests\StoreDPRequest;
use App\Http\Resources\DPCollection;
use App\Models\JenisDokumenPribadi;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Http\Response;

class DPController extends Controller
{
    /**
     * Display a listing of the resource.
     */
    public function index()
    {
        return new DPCollection(DokumenPribadi::paginate(5));
    }

    /**
     * Store a newly created resource in storage.
     */
    public function store(StoreDPRequest $request)
    {
        try {
            $jdpID = $request->input('id_jenis_dokumen_pribadi');
            $jdp = $jdpID ? JenisDokumenPribadi::findOrFail($jdpID) : null;
            if (!$jdp) {
                return response()->json(['error' => 'Jenis dokumen pribadi not found'], Response::HTTP_NOT_FOUND);
            }
            $dpData = $request->validated();
            $dpData['jenis'] = $jdp->nama;
            $dpData['created_by'] = Auth::id();
            $dp = DokumenPribadi::create($dpData);
            return response()->json($dp, Response::HTTP_CREATED);
        } catch (AuthorizationException $e) {
            return response()->json(['error' => 'Forbidden'], Response::HTTP_FORBIDDEN);
        }
    }

    /**
     * Display the specified resource.
     */
    public function show(DokumenPribadi $dp)
    {
        return new DPResource($dp);
    }

    /**
     * Update the specified resource in storage.
     */
    public function update(Request $request, DokumenPribadi $dp)
    {
        try {
            $data = $request->all();
            $data['updated_by'] = Auth::id();
            $dp->update($data); 
            $updatedDP = new DPResource($dp->fresh());
            return response()->json([
                'message' => 'Data Berhasil Terupdate',
                'data' => $updatedDP
            ]);
        } catch (\Exception $e) {
            return response()->json([
                'error' => 'Terjadi kesalahan saat memperbarui data: ' . $e->getMessage()
            ], 400);
        }
    }

    /**
     * Remove the specified resource from storage.
     */
    public function destroy(DokumenPribadi $dp)
    {
        try {
            $dp->delete();
            return response()->json(['message' => 'Data successfully deleted'], 200);
        } catch (\Exception $e) {
            return response()->json(['error' => 'Failed to delete data: ' . $e->getMessage()], 500);
        }
    }
}

当我尝试点击(/dj 或 /dp)端点时:

as shown in this photo

奇怪的是它返回welcome.blade.php的视图


如果我删除 web.php 上的该路由,它会返回:

photo here


它也存在于路线列表中:

photo here

php laravel rest routes
1个回答
0
投票

在邮递员中,在标题中添加以下内容:

{
   "accept": "application/json"
}

如下图:

您也可以查看Laravel Daily对此的解释。

© www.soinside.com 2019 - 2024. All rights reserved.