48

Im trying to do a POST request with jQuery but im getting a error 405 (Method Not Allowed), Im working with Laravel 5

THis is my code:

jQuery

<script type="text/javascript">
    $(document).ready(function () {
        $('.delete').click(function (e){
            e.preventDefault();
            var row = $(this).parents('tr');
            var id = row.data('id');
            var form = $('#formDelete');
            var url = form.attr('action').replace(':USER_ID', id);
            var data = form.serialize();
            $.post(url, data, function (result){
                alert(result);
            });
        });
    });
    </script>

HTML

{!! Form::open(['route' => ['companiesDelete', ':USER_ID'], 'method' =>'DELETE', 'id' => 'formDelete']) !!}

    {!!Form::close() !!}

Controller

public function delete($id, \Request $request){
        return $id;
    }

The Jquery error is http://localhost/laravel5.1/public/empresas/eliminar/5 405 (Method Not Allowed).

The url value is

http://localhost/laravel5.1/public/empresas/eliminar/5

and the data value is

_method=DELETE&_token=pCETpf1jDT1rY615o62W0UK7hs3UnTNm1t0vmIRZ.

If i change to $.get request it works fine, but i want to do a post request.

Anyone could help me?

Thanks.

EDIT!!

Route

Route::post('empresas/eliminar/{id}', ['as' => 'companiesDelete', 'uses' => 'CompaniesController@delete']);
1
  • 1
    check in your route file you may given a get method in route try it with post it will work....... Commented Jul 25, 2015 at 4:17

9 Answers 9

57

The methodNotAllowed exception indicates that a route doesn't exist for the HTTP method you are requesting.

Your form is set up to make a DELETE request, so your route needs to use Route::delete() to receive this.

Route::delete('empresas/eliminar/{id}', [
        'as' => 'companiesDelete',
        'uses' => 'CompaniesController@delete'
]);
Sign up to request clarification or add additional context in comments.

6 Comments

But he make an ajax post request. How is it related with form method?
It is a post request, but op serializes the form data which includes the method="delete" attribute and posts it via ajax.
I dont understand. Serialize is only a string.
When you use {!! Form::open( 'method' =>'DELETE' ) !!} in Laravel, it automatically adds a hidden input called _method with the designated value, in this case it is DELETE. Laravel automatically looks for this parameter in every request to determine if it is a DELETE, POST, PATCH, or GET request. I suggest reading the Laravel documentation on method spoofing. laravel.com/docs/5.0/routing#method-spoofing
Ah yes I understand. You are right. I cant remember all the documentation.
|
9

Your routes.php file needs to be setup correctly.

What I am assuming your current setup is like:

Route::post('/empresas/eliminar/{id}','CompanyController@companiesDelete');

or something. Define a route for the delete method instead.

Route::delete('/empresas/eliminar/{id}','CompanyController@companiesDelete');

Now if you are using a Route resource, the default route name to be used for the 'DELETE' method is .destroy. Define your delete logic in that function instead.

Comments

9

In my case the route in my router was:

Route::post('/new-order', 'Api\OrderController@initiateOrder')->name('newOrder');

and from the client app I was posting the request to:

https://my-domain/api/new-order/

So, because of the trailing slash I got a 405. Hope it helps someone

Comments

6

If you didn't have such an error during development and it props up only in production try

php artisan route:list to see if the route exists.

If it doesn't try

php artisan route:clear to clear your cache.

That worked for me.

1 Comment

This solved my issue, thank you! Clearing cache with php artisan cache:clear did not help, while php artisan route:clear did the job!
4

This might help someone so I'll put my inputs here as well.

I've encountered the same (or similar) problem. Apparently, the problem was the POST request was blocked by Modsec by the following rules: 350147, 340147, 340148, 350148

After blocking the request, I was redirected to the same endpoint but as a GET request of course and thus the 405.

I whitelisted those rules and voila, the 405 error was gone.

Hope this helps someone.

2 Comments

Thank you!! In my case it was rule 300016 causing the block.
In my case it was the REQUEST-911-METHOD-ENFORCEMENT.conf rule
3

If you're using the resource routes, then in the HTML body of the form, you can use method_field helper like this:

<form>
  {{ csrf_field() }}
  {{ method_field('PUT') }}
  <!-- ... -->
</form>

It will create hidden form input with method type, that is correctly interpereted by Laravel 5.5+.

Since Laravel 5.6 you can use following Blade directives in the templates:

<form>
  @method('put')
  @csrf
  <!-- ... -->
</form>

Hope this might help someone in the future.

Comments

0

When use method delete in form then must have to set route delete

Route::delete("empresas/eliminar/{id}", "CompaniesController@delete");

Comments

-1

I solved that issue by running php artisan route:cache which cleared the cache and it's start working.

Comments

-2

For Laravel 7 +, just in case you run into this, you should check if the route exists using

php artisan route:list

if it exists then you need to cache your routes

php artisan route:cache

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.