dingo / api

A RESTful API package for the Laravel and Lumen frameworks.
BSD 3-Clause "New" or "Revised" License
9.33k stars 1.25k forks source link

405 Method Not Allowed when making post request #1538

Closed laclance closed 6 years ago

laclance commented 6 years ago
Q A
Bug? yes
New Feature? no
Framework Laravel
Framework version 7.1.14
Package version 2.0.0-alpha1
PHP version 7.1.14

Actual Behaviour

{"message":"405 Method Not Allowed","status_code":405}

Expected Behaviour

Expecting to be able to make a post request

Steps to Reproduce

Make a post request to 'api/v1/users/language/2' (I am removing trailing slashes from url)

.env

   API_PREFIX=api
   API_VERSION=v1

api.config

    'auth' => [
        'jwt' => 'Dingo\Api\Auth\Provider\JWT'
    ],

    'middleware' => [
        '\App\Http\Middleware\HandleCors'
    ],

Route

        $api = app('Dingo\Api\Routing\Router');

        $api->version('v1', function ($api) {
            $api->group(['prefix' => 'v1/users'], function ($api) {

                $api->post('/language/{language_id}', 'Fastacademy\Aweza\Controllers\Api\V1\UsersController@updateLanguage')
                    ->name('fastacademy.aweza.user.updateLanguage');
            });
        });

Controller method:

    public function updateLanguage($language_id)
    {
        $user = \JWTAuth::parseToken()->authenticate();

        $user->language_id = $language_id;

        if (!$user->save()) {
            return $this->response()->error('Unable to update language_id', 500);
        } else {
            return $this->response();
        }
    }

HandleCors (extends Barryvdh\Cors\HandleCors)

    public function handle($request, Closure $next)
    {
        $cors = $this->cors;

        $this->events->listen(ResponseWasMorphed::class, function (ResponseWasMorphed $event) use($cors, $request) {
            $cors->addActualRequestHeaders($event->response, $request);
        });

        return $next($request);
    }
}
laclance commented 6 years ago

Postman request obviously defaults to http so had to add https://