'Lumen POST Routes not Working

Consider the following:

$router->group([
    'prefix' => 'api/v1/group',
    'middleware' => 'auth'
], function () use ($router) {

    $router->get('/', [
        'as'    => 'group.list',
        'uses'  => 'Api\V1\GroupController@list'
    ]);

    $router->post('/', [
        'as'    => 'group.create',
        'uses'  =>'Api\V1\GroupController@create'
    ]);

    $router->get('/{groupUUID}', [
        'as'    => 'group.retrieve',
        'uses'  =>'Api\V1\GroupController@retrieve'
    ]);

    $router->put('/{groupUUID}', [
        'as'    => 'group.update',
        'uses'  => 'Api\V1\GroupController@update'
    ]);


});

As you can see, a pretty typical route setup. However, I'm seeing some incredibly odd behaviour - in short, the POST route seems to be being interpreted by the app as a GET route. When I make a POST request to api/v1/group (via Postman) I don't see the result of Api\V1\GroupController@create, but the result of Api\V1\GroupController@list.

I wondered if perhaps this was something to do with both routes having the same endpoint (shouldn't matter, but maybe it's different in Lumen? I usually work in full-on Laravel). So I commented out the get route. That made me just see a 404.

I then wondered if perhaps this entire route group was somehow broken. So I made two catchall endpoints:

$router->get('/{any:.*}', function () use ($router) {
    return 'I am a get route';
});

$router->post('/{any:.*}', function () use ($router) {
    return 'I am a post route';
});

And placed them at the top of the routes file, and commented out all other routes. Regardless of the route I hit or the method used, I always saw the same thing: I am a get route.

What's going on? What could cause my app to understand all POST requests as GET requests?

PS: It's also worth noting that these routes were working, until recently, without any real associated changes. Could something have been updated in a Lumen package that caused this?

PPS: I also tried using Insomnia instead of Postman, just in case it was a problem with Postman. Same result.



Solution 1:[1]

$router->get('/api/item/{table}/{id}', "ItemController@itemHandler");
$router->post('/api/item/{table}', "ItemController@itemHandler");
$router->put('/api/item/{table}/{id}', "ItemController@itemHandler");
$router->delete('/api/item/{table}/{id}', "ItemController@itemHandler");

Solution 2:[2]

I had pretty much the same issue. In my case - since I use Laravel Valet as development environment - I was able to make a POST request again, after serving the API locally over HTTP by executing valet unsecure my-project. On my production server, I still can use HTTPS, but for my local development environment, this solved the issue. Hope this helps some future readers.

Solution 3:[3]

Try api/v1/group/ (with trailing slash).

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 user610961
Solution 2 kwe
Solution 3 Jan Worpenberg