为什么我的动态路线仅在一次事件中返回200?

时间:2016-07-14 21:59:31

标签: php json laravel response http-status-codes

我有一个调用第三方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状态代码,很奇怪。

1 个答案:

答案 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
    );
});