我有一个调用第三方API并返回其响应的路由。此路由可以将ID作为参数,如下所示:/my/route/{id}
。
当我请求/my/route/1
时,我获得了200次成功,但当我执行/my/route/2
,/my/route/3
,/my/route/4
等时,我收到500错误。
有趣的是,我总是得到正确的反应体。因此200和500响应都返回了我需要的数据。
我的问题是在这里触发getSponsor(..)
:
<?php
namespace App\Http\Controllers\Matrix;
use App\Http\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
class SponsorReadingController extends Controller
{
/**
* SponsorReadingController constructor.
*/
public function __construct()
{
$this->cookieJar = app('MatrixCookieJar');
$this->client = app('GuzzleClientForMatrix');
}
public function getSponsor($sponsorId, Request $request)
{
// TODO: Refactor this monstrous function
if (!AuthController::isAlreadyLoggedIn($request)) {
$loginRes = AuthController::loginToMatrixApi($this->cookieJar);
if ($loginRes->getStatusCode() === 200) {
$sessionId = AuthController::getSessionIdFromResponse($loginRes);
} else {
return $loginRes;
}
} else {
$sessionId = null;
AuthController::setAuthCookie(
$this->cookieJar, $request->cookie('matrix_api_session')
);
}
$respData = [
'error' => null,
'message' => null,
'data' => json_decode(
$this->client->get(
'/admin/sponsor/detail',
[
'query' => ['sponsorId' => $sponsorId],
'cookies' => $this->cookieJar,
'allow_redirects' => false
]
)->getBody())->response
];
return $this->handleResponse($respData, $sessionId);
}
/**
* Handle the response with the provided data and
* cookie value.
*
* @param array $respData
* @param string $cookieVal
* @return Response
*/
public function handleResponse($respData, $cookieVal)
{
if (!empty($cookieVal)) {
return response()->json($respData)->withCookie(
cookie('matrix_api_session', $cookieVal, 29, '/matrix/api')
);
}
return response()->json($respData);
}
编辑:如果我在dd($res)
内return $res
代替handleResponse(...)
,我会收到200状态代码,很奇怪。
答案 0 :(得分:0)
作为参考,这个答案帮助了我:500 Internal Server Error for php file not for html
所以基本上,我添加了ini_set('display_errors', 1)
所以响应会包含我没有看到的后端的任何错误(事实证明apache的错误日志已经有了),而且确实如此有一个错误没有直接影响响应,所以我仍然会得到正确的响应数据。
文件是存储的Cookie无法从Guzzle的角度看到,但Laravel应用程序本身可以看到它。出于显而易见的原因,您需要指定服务器上文件夹/文件的完整路径。我最终使用Laravel自己的存储文件夹来存储它们,所以我不得不更改我的服务提供商(其中cookies/jar.json
曾经在Laravel的public
文件夹中:< / p>
$this->app->bind('MatrixCookieJar', function ($app) {
return new FileCookieJar(
'cookies/jar.json', true
);
});
对此:
$this->app->singleton('MatrixCookieJar', function ($app) {
return new FileCookieJar(
storage_path('cookies').'/'.'jar.json', true
);
});