Laravel - Как показать JSON, если маршрут API неверен или не найден? - PullRequest
0 голосов
/ 13 ноября 2018

Я использую Laravel для создания API и почтальона для проверки моего API. Когда я помещаю правильный URL-адрес в почтальон, он работает нормально, но когда я помещаю неправильный URL-адрес, он показывает ошибку HTML и Laravel 404, я хочу вернуть сообщение в формате JSON, как бы я это сделал.

Ответы [ 2 ]

0 голосов
/ 13 ноября 2018

КАК я понимаю требование OP, хочет переопределить поведение рендеринга исключения Not Found в ответ JSON.

Laravel фактически генерирует exception типа NotFoundHttpException и render it. Чтобы предотвратить такое поведение, вы можете сделать это.

В 'app \ Exceptions \ Handler.php' вы видите функцию

 /**
 * Render an exception into an HTTP response.
 *
 * @param  \Illuminate\Http\Request  $request
 * @param  \Exception  $exception
 * @return \Illuminate\Http\Response
 */
public function render($request, Exception $exception)
{
    // comment this line and return JSON Response.
    //return parent::render($request, $exception);

    return json_encode(array("message" => $exception->getMessage())); // or you can 
} 

PS: Это не окончательное решение, а обходной путь, если вы хотите, чтобы ваш API возвращал JSON в случае ошибок.

0 голосов
/ 13 ноября 2018

Вы должны добавить заголовок Accept, установленный в application/json, к вашему запросу почтальона на вкладке заголовков следующим образом:

Postman screenshot

Этоскажет Laravel, что вы хотите получить ответ json вместо HTML.То же самое относится к любому запросу внутри вашего приложения.

Как вы можете видеть, это проверяется на объекте Illuminate\Http\Response, когда полезная нагрузка установлена, она проверяет, должен ли он быть преобразован в JSON:

/**
 * Set the content on the response.
 *
 * @param  mixed  $content
 * @return $this
 */
public function setContent($content)
{
    $this->original = $content;

    // If the content is "JSONable" we will set the appropriate header and convert
    // the content to JSON. This is useful when returning something like models
    // from routes that will be automatically transformed to their JSON form.
    if ($this->shouldBeJson($content)) {
        $this->header('Content-Type', 'application/json');

        $content = $this->morphToJson($content);
    }

    // If this content implements the "Renderable" interface then we will call the
    // render method on the object so we will avoid any "__toString" exceptions
    // that might be thrown and have their errors obscured by PHP's handling.
    elseif ($content instanceof Renderable) {
        $content = $content->render();
    }

    parent::setContent($content);

    return $this;
}

Вы можете найти код здесь .

Надеюсь, это поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...