所以我正在使用Laravel 5.2开发一个API,我面临一个重要的问题。
我有一个UserController,可以管理我应用的用户。
这是我的routes.php文件:
Route::group(array('prefix' => 'api/v1'), function() {
Route::post('user', 'UserController@store');
});
我的UserController定义如下:
class UserController extends Controller {
public function index() {
return 'Hello, API';
}
public function create(){
}
public function store(Request $request) {
$user = new User;
$user->email = $request->email;
$user->password = $request->password;
$user->fbId = $request->fbId;
$user->ggId = $request->ggId;
$user->firstName = $request->firstName;
$user->lastName = $request->lastName;
$user->imageUrl = $request->imageUrl;
$user->country = $request->country;
$user->mobile = $request->mobile;
$user->gender = $request->gender;
$user->client = $request->client;
$user->save();
return Response::json(array(
'error' => false,
'userId' => $user->id),
200
);
}
public function update(Request $request, $id) {
}
}
这是php artisan route:list
+--------+--------+-------------+------+-------------------------------------------+------------+
| Domain | Method | URI | Name | Action | Middleware |
+--------+--------+-------------+------+-------------------------------------------+------------+
| | POST | api/v1/user | | App\Http\Controllers\UserController@store | web |
+--------+--------+-------------+------+-------------------------------------------+------------+
我使用Postman来测试我的POST请求。 每次我向/ api / v1 / user发出POST请求时,都会得到一个" 405 Method Not Allowed"错误。
我错过了什么吗?
我有什么办法可以解决这个问题吗?
答案 0 :(得分:13)
我有同样的问题,我已在POST路线中设置了例如“/ api / v1 / user”,
当我尝试使用POSTMAN(应用程序测试API)进行连接时,它返回405-Method Not Allowed,
然后我意识到我发送的网址是使用' http '并在我将其更改为' https '后(后面带有's')
然后我的API正常工作!
通常如果我们与不同的服务器进行交互,我们必须使用' https '但如果您的应用程序位于同一台服务器上,则可以使用' http ”
我的情况的真正原因是与任何不同服务器的任何交互都必须使用' https '(这是我服务器上的设置)
答案 1 :(得分:6)
您需要将路线分开,因为所有试图到达您的路线的用户都需要一个开放的会话(已登录)
试试这个
<!DOCTYPE html5>
<html>
<head>
</head>
<body>
<script>
var arr = new Array("pro","pro1","pro2");
for(var i =0 ;i<arr.length;i++)
{
document.getElementById("txt").innerHTML = arr[i];
//document.write(arr[i]);
}
</script>
<div id = "txt">
</div>
</body>
</html>
您的授权用户路线应位于第二组
您的405方法不允许Route::group(array('prefix' => 'api/v1'), function() {
Route::post('/','UserController@store');
Route::get('/', 'UserController@index');
Route::group(array('before' => 'auth.basic'), function() {
Route::post('{user}', 'UserController@update');
});
});
更改$user->id
答案 2 :(得分:2)
在创建web-hooks
路由时,我在Laravel 5.8上遇到了相同的问题。
这些路由使用网络中间件,因此,还包括了 VerifyCsrfToken路由中间件组。 (参考app/Http/Kernel.php
)
因为我的POST请求不包含 CSRF令牌,所以我们得到了这种奇怪的行为。
要解决此问题,我需要 add an exception到VerifyCsrfToken中间件以获取网络钩子路由。 (参考app/Http/Middleware/VerifyCsrfToken.php
)
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'web-hooks/*'
];
以上解决方案适用于使用Web中间件的情况。但是,如果要创建API路由,则最好改用api中间件,因为此中间件中未使用CSRF验证。 (参考app/Providers/RouteServiceProvider.php
)
Route::prefix('api')
->middleware('api')
->namespace($this->namespace)
->group(base_path('routes/api.php'));
答案 3 :(得分:0)
之前面对类似的东西,经过调试后发现它的Postman问题并没有任何与代码有关的内容!
所以打开你的终端并尝试使用curl发出相同的请求:
curl -X POST -H "Accept: application/json" -F "email=test@test.com" -F "password=secret" -F "firstName=Mahmoud" -F "lastName=Zalt" ....... "http://your-domain.com/api/v1/user"
如果这有效,则意味着您必须使用Postman本身更改一些设置。 真的不记得我做了什么!但它就像更改一些默认标题或删除授权类型一样简单......
答案 4 :(得分:0)
经过长时间的挖掘和挖掘,我无法找到解决问题的方法。
我必须从头开始创建一个新的Laravel项目,并添加我在旧项目中的所有内容。令我惊讶的是,一切都很完美,我仍然不明白为什么!
无论如何,感谢所有试图帮助的人:)干杯!
答案 5 :(得分:0)
如果它有助于任何人我有同样的问题;由于某种原因,事情的组合修复了它。
NotFoundHttpException in RouteCollection.php line 161
这是因为我没有发送我的&#34; api_token&#34;在我的帖子请求中。出于某种原因(我不知道这是否会产生影响)但链接我的中间件而不是把它放在Route:group中我做了;
Route::group(['prefix'=>'api/v1'], function () {
Route::post('/', 'IndexController@index')->middleware('auth:api');
});
答案 6 :(得分:0)
此错误也可能是由请求正文太大引起的。在我的情况下,我不小心发送了一个包含许多子对象的对象,这些子对象都有许多其他子对象。修剪我的请求数据解决了这个问题。
答案 7 :(得分:0)
更改为https将使其起作用。至少,这就是我所经历的。将POSTman与http一起使用始终具有这种效果。
答案 8 :(得分:0)
在两侧检查您的请求类型GET/POST/PUT/PATCH
即前端(Javascript/Typescript etc...
)和后端(Laravel Passport
)应该相同。
答案 9 :(得分:0)
就我而言,我没有在控制器名称中添加控制器词