Я делаю JSON API с Laravel. и я пытаюсь протестировать его с помощью POSTMAN, прежде чем продолжать создавать для него внешний интерфейс. Мой API — это серверная часть панели новостей, которая выполняет функции CRUD.
Вот маршруты:
Route::get('/news', 'App\Http\Controllers\NewsController@index')->name('news.index');
Route::get('/news/{newsItem}', 'App\Http\Controllers\NewsController@show')->name('news.show');
Route::post('/news', 'App\Http\Controllers\NewsController@store')->name('news.store');
Route::patch('/news/{newsItem}', 'App\Http\Controllers\NewsController@update')->name('news.update');
Route::delete('/news/{newsItem}', 'App\Http\Controllers\NewsController@destroy')->name('news.destroy');
/news показывает мне и пустой массив [] , потому что БД пока пуста. почтальон GET тоже возвращает 200 OK. Я попытался опубликовать полезную нагрузку JSON с помощью почтальона:
{
"title": "Example News Item",
"content": "This is the content of the news item.",
"category_id": 1,
"tags": [1, 2, 3]
}
Сначала я получаю сообщение об ошибке 419 unknown status ; затем я переместил свои маршруты с web.php на api.php, а индекс /api/news вместо /news.
Так что тестирую /api/news
GET http://127.0.0.1:8000/api/news/ возвращается 200 OK
но
POST http://127.0.0.1:8000/api/news/ возвращается 405 Method Not Allowed
почему это? что-то не так с моим кодом?
Вот метод store() в контроллере новостей:
public function store(Request $request)
{
$request->validate([
'title' => 'required',
'body' => 'required',
'category_id' => 'nullable|exists:categories,id',
'tags' => 'array',
'tags.*' => 'exists:tags,id'
]);
$newsItem = new NewsItem;
$newsItem->title = $request->title;
$newsItem->body = $request->body;
$newsItem->category_id = $request->category_id;
$newsItem->url = $request->url;
$newsItem->save();
$newsItem->tags()->attach($request->tags);
return response()->json($newsItem, 201);
}
Если я удалю проверку, вместо этого я получу ошибку 500 с телом:
500Internal Server Error Integrity constraint violation: 1048 Column 'title' cannot be null (SQL: insert into `news_items` (`title`, `body`, `category_id`, `url`, `updated_at`, `created_at`) values (?, ?, ?, ?, 2022-12-31 14:52:26, 2022-12-31 14:52:26))
Но дело в том, что моя полезная нагрузка содержит обязательные поля.
Я не знаю, в чем проблема, почему-то полезная нагрузка не поступает в базу данных.
500Внутренняя ошибка сервера. Нарушение ограничения целостности: 1048 Столбец 'title' не может быть нулевым <<<<=== если он у вас все еще есть, опубликуйте результат dd($request->all()); в исходном вопросе
Вот маршрут: Route::post('/news', 'App\Http\Controllers\NewsController@store')->name('news.store');
Да, у меня все еще есть ошибка. как мне это сделать dd($request->all())?






С кодом все в порядке. Основная причина кроется в Postman. Вам нужно установить заголовок Accept: application/json в Postman. (Подсказка заключалась в том, что обработчик приложения возвращал HTML вместо JSON в Postman)
POST 127.0.0.1:8000/api/news возвращает 405 Method Not Allowed <<<=== сосредоточиться на этом. Если он у вас еще есть, откройте свой api.php и найдите маршрут для /news, скопируйте/вставьте его сюда