2016-07-14 5 views
1

У меня есть маршрут, который вызывает сторонний API и возвращает его ответ. Этот маршрут может принимать ID как параметр, подобный этому: /my/route/{id}.Почему мой динамический маршрут возвращает 200 только на один случай?

Когда я прошу /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); 
} 

EDIT: Если я dd($res) вместо return $res внутри handleResponse(...) я получить код статуса 200, странно.

+0

Так это ошибка в ответе на дескриптор или в getSponsor? Кажется, что что-то может произойти, когда getSponsor пытается вернуть ваш результат из handleResponse. – Daniel

+0

Ну 'getSponsor()' в конечном счете возвращает 'handleResponse()'. Самое смешное, что если я сброшу код статуса я всегда получаю 200 во всех вызовах. Я разбиваю себе голову. – jstudios

+0

Wh в случае, если вы выгружаете $ respData перед отправкой в ​​handleResponse? Вы упомянули некоторые работы с ID, и некоторые не делают. Также, это единственное, что возвращается от ответа $ res 200? Когда я тестировал его только сейчас, у меня появился объект ответа, который включал данные, которые я передал в Response(). – Daniel

ответ

0

Для справки, этот ответ помог мне: 500 Internal Server Error for php file not for html

Поэтому в основном я добавил ini_set('display_errors', 1) так что ответ будет включать в себя какие-либо ошибки на заднем конце, что я не видел (оказалось, журнал ошибок сервера Apache была его), и, конечно же, произошла ошибка, которая напрямую не влияла на ответ, поэтому я бы получил правильные ответы.

Файл, хранящийся в куки, не мог быть замечен с точки зрения Гузза, но сам приложение Laravel могло его увидеть. По понятным причинам вам нужно указать полный путь к папке/файлу на сервере. Я закончил с использованием собственной папки для хранения Laravel, чтобы сохранить их, так что я должен был изменить поставщик услуг из этого (где cookies/jar.json используется, чтобы быть в public папки Laravel в:

$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 
    ); 
});