【问题标题】:Why is my dynamic route returning 200 on only one ocassion?为什么我的动态路由仅在一次返回 200?
【发布时间】:2016-11-18 00:06:11
【问题描述】:

我有一个调用第三方 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);
}

编辑:如果我在handleResponse(...) 中使用dd($res) 而不是return $res,我会得到一个200 状态码,很奇怪。

【问题讨论】:

  • 那么是句柄响应错误还是getSponsor错误?当 getSponsor 尝试从 handleResponse 返回您的结果时,似乎可能会发生一些事情。
  • 好吧getSponsor() 最终返回handleResponse()。有趣的是,如果我转储状态代码,我总是在所有呼叫中得到 200。我的脑袋要坏了。
  • 如果在发送到 handleResponse 之前转储 $respData 会发生什么?您提到了一些 ID 有效,而另一些则无效。另外,从 $res 返回的唯一结果是 200 响应吗?刚才测试时,我得到了一个响应对象,其中包含我传递给 Response() 的数据。
  • @Daniel dd($respData) 给了我一个多维数组。就像我在我的 OP 编辑​​中提到的那样,如果我 dd() 响应而不是返回它,它会返回 200 成功,所有这些。

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


【解决方案1】:

作为参考,这个答案帮助了我:500 Internal Server Error for php file not for html

所以基本上,我添加了ini_set('display_errors', 1),因此响应将包括我没有看到的后端的任何错误(原来 apache 的错误日志有它),果然有一个不是直接的错误影响响应,所以我仍然会得到正确的响应数据。

从 Guzzle 的角度看不到存储 cookie 的文件,但 Laravel 应用程序本身可以看到它。出于显而易见的原因,您需要指定服务器上文件夹/文件的完整路径。我最终使用 Laravel 自己的存储文件夹来存储它们,所以我不得不从这里更改我的服务提供商(其中 cookies/jar.json 曾经在 Laravel 的 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
    );
});

【讨论】:

    猜你喜欢
    • 2019-10-23
    • 1970-01-01
    • 2021-10-23
    • 2016-12-08
    • 1970-01-01
    • 2018-03-26
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    相关资源
    最近更新 更多