当Postman工作时,对JWT API的Guzzle POST请求被取消。 这是代码:
public function __construct()
{
$this->client = new Client();
$this->connect();
}
public function connect()
{
$loginResult = $this->client->request('POST', config('api.base_uri') .'/auth/login', [
'form_params' => [
'email' => config('api.login'),
'password' => config('api.password'),
]
]);
dd(json_decode($loginResult->getBody()));
}
我在运行此代码时获得了401 Unauthorized。凭据正确传递。 同时在Postman中它完美地运作:
请告诉我我做错了什么。 谢谢!
更新 以下是控制器和功能,此请求正在API端点击:
class AuthController extends Controller
{
public function __construct()
{
$this->middleware('auth:api', ['except' => ['login']]);
}
public function login(Request $request)
{
$credentials = $request->only(['email', 'password']);
if (!$token = auth('api')->attempt($credentials)) {
return response()->json(['error' => 'Unauthorized '.$credentials['email']], 401);
}
return $this->respondWithToken($token);
}
...
用户确实存在,因为它在Postman中工作
更新2 我有简化代码来查找错误:
Route::get('/guzzle', function () {
$client = new Client([
'headers' => [
'Accept' => 'application/json'
]]);
$loginResult =
$client->request('POST', config('pics.base_uri') .'/auth/login', [
'form_params' => [
'email' => '****@****.com',
'password' => '*****',
]
]);
dd(json_decode($loginResult->getBody()));
});
它不起作用 - 得到同样的错误
答案 0 :(得分:1)
好的......经过几个小时和Kyslik的善意帮助,我能够找到这个问题的线索。实际上是什么帮助我调试并查找我得到的错误。最终我发现了以下帖子(https://github.com/guzzle/guzzle/issues/1413#issuecomment-222031665),其中陈述了一些奇怪的事情:
如果使用相同的PHP实例从Guzzle发送请求并回复该请求,那么Guzzle根本不会工作
我把所有东西都搬到了托管中,它就像一个魅力。希望将来会帮助某人。
感谢所有参与寻找解决方案的人,当然还要感谢Kyslik!
答案 1 :(得分:0)
尝试使用POST请求中的Guzzle选项中的json
选项,而不是form_params
。
public function connect()
{
$loginResult = $this->client->request('POST', config('api.base_uri') .'/auth/login', [
'json' => [
'email' => config('api.login'),
'password' => config('api.password'),
]
]);
dd(json_decode($loginResult->getBody()));
}
form_params
应与非json端点一起使用。
有关json
媒体资源的更多信息:http://docs.guzzlephp.org/en/stable/quickstart.html#uploading-data
编辑一个接受form-params
但返回JSON的端点的示例,这可能就是您所拥有的:
public function __construct()
{
$this->client = new Client()
$this->connect();
}
public function connect()
{
$loginResult = $this->client->request('POST', config('api.base_uri') .'/auth/login', [
'form_params' => [
'email' => config('api.login'),
'password' => config('api.password'),
]
]);
dd(json_decode($loginResult->getBody()));
}
答案 2 :(得分:0)
在两个站点上运行php artisan config:cache
可解决此问题。
Windows上Apache上的两个站点需要缓存的配置。这是一个已知但未记录的问题。在两个站点上运行php artisan config:cache。
Src:https://github.com/laravel/framework/issues/21533#issuecomment-334352170