0

I am writing a laravel api and when I try to make delete and post requests I keep getting a method not allowed exception. Where should I be looking to diagnose this problem?

I have read though most of the other posts on this issue and here is what I have tried/looked at. • Made sure the route syntax was correct

• Made sure it didn't conflict with another route

• Made sure I was using the correct route (ran php artisan route:list to double check)

• Modified the .htaccess folder (maybe I did this incorrectly) to allow GET, POST, PUT, DELETE

Here is what the route looks like in api.php

Route::middleware('auth:api')->get('/user', function (Request $request) {
    return $request->user();
});
Route::delete('delete/{id}', 'LoginController@delete');
Route::get('stuff', 'LoginController@index');
Route::get('stuff1/{Username}', 'LoginController@show');

here is the function in the controller

 public function delete(Request $request, $id) {

        $user = Login::find($id);
        $user->delete();
        return "204";
    }

here is my .htaccess

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

RewriteEngine On

# 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]

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

 <Limit GET POST PUT DELETE>
 Allow from all
</Limit>
</IfModule>

I can get around this issue by changing Route::delete() to Route::get() and achieve the same functionality but this doesn't seem like standard practice.

rc1138
  • 51
  • 1
  • 7
  • You can see this: https://stackoverflow.com/questions/165779/are-the-put-delete-head-etc-methods-available-in-most-web-browsers – Md.Sukel Ali Apr 07 '19 at 07:57
  • Please can you show how you're making the request i.e. the form and/or the ajax call. – Rwd Apr 07 '19 at 08:11

1 Answers1

0

You have to set ajax type POST but send a parameter named _method with value delete like this:

$.ajax({
        type: "POST",
        data:{
         _method:"DELETE"
        },
        url: productRoute,
        headers: { 'X-CSRF-TOKEN' : productToken }
    });

Or because you use laravel html form helper so it generates _method hidden input automatically so you'd better send all your form inputs such as token and method like this:

 function()
{

    var formData=$('#yourForm').serialize();
    $.ajax({
        type: "POST",
        url: productRoute,
        data:formData
    })
});
Mohsin Ali
  • 37
  • 1
  • 8
  • 1
    This is only relevant if you are using an HTML form, because HTML forms don't support the DELETE method type. When using an API with a proper client, you can use any HTTP method. – Namoshek Apr 07 '19 at 08:32