首页 > 解决方案 > Laravel 在 API Post 上路由总是 404

问题描述

我在 Windows 中的 Laravel 5.8 中尝试创建入站 API 路由。当我尝试走这条路线时,邮递员总是给我一个 404:

http://MYHOSTISHERE/api/v1?event=NewDealerSetUp&api_key=MYKEYISHERE

卷曲与

curl -X POST "http://rx-0-unicorn.local/api/v1?event=NewDealerSetUp&api_key=MYAPIKEYHERE"

也给了我一个404。

有人可以指出我做错了什么吗?我秃了,但我可能会在一分钟内开始拔胡须。

详情如下,谢谢!

我在 app.php 中有这条路线:

Route::post('v1?event={event}&api_key={api_key}', 'API\APIController@index');

该路线显示在工匠路线列表中:


|        | POST      | api/v1?event={event}&api_key={api_key}                                                                                                     |                                    | App\Http\Controllers\API\APIController@index                                             | api                        |


VerifyCsrfToken 中间件(只是看看它是否可以工作):

    protected $except = [
        'api/*'
    ];

控制器启动:


namespace App\Http\Controllers\API;

use App\Models\Log\LogAPI;
use App\Models\Members;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Redirect;

class APIController extends Controller
{
    public function index($event, $api_key, Request $request)
    {
        $data = filter_var_array((array)$request, FILTER_SANITIZE_SPECIAL_CHARS);

        [...]

        if($event == 'NewDealerSetUp'){
            $setup = new NewDealerSetup();

            return $setup->newDealerSetup($request);
        }

.htaccess

<IfModule mod_rewrite.c>
    <IfModule mod_negotiation.c>
        Options -MultiViews -Indexes
    </IfModule>

    RewriteEngine On

    # Handle Authorization Header
    RewriteCond %{HTTP:Authorization} .
    RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]

    # Redirect Trailing Slashes If Not A Folder...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_URI} (.+)/$
    RewriteRule ^ %1 [L,R=301]

    # Handle Front Controller...
    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^ index.php [L]
    
    # ------------------------------------------------------------------------------------------------------
    # NOTES: 
    # the log: strip per-dir prefix: C:/apache/htdocs/MYAPPNAME/public/ ->[EMPTY]  ... takes the ^[EMPTY] and returns an empty
    # ------------------------------------------------------------------------------------------------------

</IfModule>

标签: laravelrouteslaravel-5.8

解决方案


您的路线定义是这里的问题。您在路由定义v1?event={event}&api_key={api_key}中使用了错误的查询参数。我不确定,但我以前从未见过像这样的路由定义,因为在路由定义中,我们通常只定义端点并且不提供任何查询参数

您的控制器定义是

public function index($event, $api_key, Request $request)

为此,您的路线需要类似于

Route::post('v1/{event}/{api_key}', 'API\APIController@index');

或类似的东西

Route::post('v1/event/{event}/api_key/{api_key}', 'API\APIController@index');

如果您必须使用查询参数,那么您将不得不使用

Route::post('v1', 'API\APIController@index');

并处理控制器中的参数

public function index(Request $request)
{
    $event = $request->event;
    $api_key = $request->api_key;
    // Rest of code
}

推荐阅读