У меня есть маршрут, который вызывает сторонний API и возвращает ответ. Этот маршрут может принимать идентификатор в качестве параметра следующим образом: /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, странно.
Для справки, этот ответ помог мне: 500 Внутренняя ошибка сервера для файла php не для HTML
В общем, я добавил ini_set('display_errors', 1)
поэтому ответ будет включать в себя любые ошибки на серверной стороне, которые я не видел (оказалось, что в журнале ошибок apache есть такая информация), и, конечно же, была ошибка, которая не влияла непосредственно на ответ, поэтому я все равно получу правильный ответ данные.
Файл, в котором хранились файлы cookie, не был виден с точки зрения Guzzle, но само приложение Laravel могло видеть его. По понятным причинам вам необходимо указать полный путь к папке / файлу на сервере. В итоге я использовал собственную папку хранения Laravel для их хранения, поэтому мне пришлось сменить поставщика услуг с этого (где cookies/jar.json
Раньше был в Ларавеле public
папка:
$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
);
});
Других решений пока нет …