Reputation: 2859
I've built a REST API in Laravel, it's currently running locally using MAMP although I have tried it out on a live server and the same issue crops up.
When I try to post my form to the API it doesn't work unless I simultaneously have Artisan serve the site on a different port number and post to that URL i.e www.mysite.com:2834/api/courses, I can GET the page in a browser no problem, it's just POST'ing that causes an issue.
I have CORs enabled and I have tried to do the same POST request using PostMan and it gives the same results i.e does not work when it's just the normal URL www.mysite.com/api/courses that I post to but works when I also run Artisan on a different port and post to www.mysite.com:2834/api/courses.
Oddly enough the POST works without Artisan running when done using CURL:
curl -i -H "X-Requested-With: XMLHttpRequest" -H "Content-Type: application/x-www-form-urlencoded" -X POST http://www.mysite.io/api/courses --data "&author=tertertert&name=ertertert&description=ertertret&price=ertretret"
Here is my routes list :
| | GET|HEAD | api/courses | api.courses.index | App\Http\Controllers\CourseController@index | web,cors |
| | POST | api/courses | api.courses.store | App\Http\Controllers\CourseController@store | web,cors |
| | GET|HEAD | api/courses/{courses} | api.courses.show | App\Http\Controllers\CourseController@show | web,cors |
| | PUT|PATCH | api/courses/{courses} | api.courses.update | App\Http\Controllers\CourseController@update | web,cors |
| | DELETE | api/courses/{courses} | api.courses.destroy | App\Http\Controllers\CourseController@destroy | web,cors |
and my controller :
<?php
namespace App\Http\Controllers;
use App\Course;
use App\Http\Requests;
use App\Http\Requests\CourseForm;
class CourseController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$courses = Course::all();
return response()->json(['courses' => $courses]);
}
/**
* @param CourseForm $request
* @return \Illuminate\Http\JsonResponse
*/
public function store(CourseForm $request)
{
$course = new Course();
$course->author = $request->input('author');
$course->name = $request->input('name');
$course->description = $request->input('description');
$course->price = $request->input('price');
$course->save();
return response()->json(['message' => 'Course saved']);
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
$course = Course::find($id);
return response()->json(['course' => $course]);
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(CourseForm $request, $id)
{
if($request->ajax())
{
$course = Course::find($id);
$course->author = $request->input('author');
$course->name = $request->input('name');
$course->description = $request->input('description');
$course->price = $request->input('price');
$course->save();
return response()->json(['message' => 'Course updated']);
}
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
$course = Course::find($id);
$course->delete();
return response()->json(['message' => 'Course removed']);
}
}
and my routes file:
<?php
Route::group(['prefix' => 'api', 'middleware' => ['cors']], function(){
Route::resource('courses', 'CourseController', ['except' => [
'create', 'edit'
]]);
});
Route::group(['prefix' => 'api', 'middleware' => ['cors']], function(){
Route::resource('test', 'HomepageController@index');
Route::resource('projects', 'ProjectController@index');
});
Route::controllers([
'auth' => 'Auth\AuthController',
'password' => 'Auth\PasswordController',
]);
Route::group(['before' => 'auth', 'middleware' => ['auth']], function() {
Route::get('/admin/','DashboardController@overview');
});
//Route::get('/test', 'HomepageController@index');
Upvotes: 0
Views: 4955
Reputation: 2859
Ladies and Gentlemen in true face palm fashion Ive figured out what the hell was wrong... it was the trailing slash on the end of the url that was messing it all up..
Upvotes: 5