Laravel Lumen Stellen Sie die JSON-Antwort sicher

Lesezeit: 3 Minuten

Benutzeravatar von John Fonseka
John Fonseka

Ich bin neu bei Laravel und Lumen. Ich möchte sicherstellen, dass ich immer nur ein JSON-Objekt als Ausgabe erhalte. Wie kann ich das in Lumen machen?

Ich kann eine JSON-Antwort mit erhalten response()->json($response);. Aber wenn ein Fehler auftritt, gibt mir die API text/html Fehler. Aber ich will nur application/json Antworten.

Danke im Voraus.

Benutzeravatar von Wader
Wathose

Sie müssen Ihren Ausnahmehandler anpassen (app/Exceptions/Handler.php), um die gewünschte Antwort zurückzugeben.

Dies ist ein sehr einfaches Beispiel dafür, was getan werden kann.

public function render($request, Exception $e)
{
    $rendered = parent::render($request, $e);

    return response()->json([
        'error' => [
            'code' => $rendered->getStatusCode(),
            'message' => $e->getMessage(),
        ]
    ], $rendered->getStatusCode());
}

  • Danke für die Antwort. Ich habe jedoch eine kleine Frage, kann ich das tun? return response()->json(['code' => $rendered->getStatusCode(), 'message' => $e->getMessage()], $rendered->getStatusCode()); Ich habe nach der Liste der Ausnahmen gesucht und konnte noch keine Liste finden.

    – John Fonseka

    18. Mai 2016 um 10:50 Uhr


  • Das sieht für mich gut aus. Hier ist die Signatur für die response()->json() Funktion. github.com/laravel/lumen-framework/blob/5.2/src/Http/…

    – Wathose

    18. Mai 2016 um 11:02 Uhr

  • Beachten Sie, dass dieses Beispiel immer a zurückgibt 200 HTTP-Code. Das willst du wahrscheinlich nicht. Bei Verwendung findOrFail() zum Beispiel die code Element zeigt korrekt a 404aber das Gesamtergebnis wird immer noch a sein 200, was es offensichtlich nicht ist. Passen Sie, um dies zu beheben $rendered->getStatusCode() hinein json() als zweiten Parameter.

    – Jason

    29. April 2019 um 10:52 Uhr

Eine genauere Lösung basierend auf der Antwort von @Wader kann sein:

use Illuminate\Http\JsonResponse;

public function render($request, Exception $e)
{
    $parentRender = parent::render($request, $e);

    // if parent returns a JsonResponse 
    // for example in case of a ValidationException 
    if ($parentRender instanceof JsonResponse)
    {
        return $parentRender;
    }

    return new JsonResponse([
        'message' => $e instanceof HttpException
            ? $e->getMessage()
            : 'Server Error',
    ], $parentRender->status());
}

  • Gute vollständige Antwort einschließlich der erforderlichen Klasse. Upvote von mir

    – Derek Pollard

    29. März 2018 um 6:01 Uhr

  • einen ähnlichen Vorschlag für Lumen 8? Vielen Dank

    – Kamlesh

    29. Juli 2021 um 12:47 Uhr

Benutzeravatar von César Escudero
César Escudero

Anstatt den Ausnahmehandler zu berühren, schlage ich vor, dass Sie eine Middleware hinzufügen, die die Accept Kopfzeile zu application/json.

Beispielsweise können Sie eine Middleware namens erstellen RequestsAcceptJson und definiere es so:

<?php

namespace App\Http\Middleware;

use Closure;

class RequestsAcceptJson
{
    /**
     * Handle an incoming request.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \Closure  $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
        $acceptHeader = strtolower($request->headers->get('accept'));

        // If the accept header is not set to application/json
        // We attach it and continue the request
        if ($acceptHeader !== 'application/json') {
            $request->headers->set('Accept', 'application/json');
        }

        return $next($request);
    }
}

Dann müssen Sie es nur noch als globale Middleware registrieren, die bei jeder Anfrage an Ihre API ausgeführt wird. In Lumen können Sie dies tun, indem Sie die Klasse im Middleware-Aufruf in Ihrem hinzufügen bootstrap/app.php

$app->middleware([
    App\Http\Middleware\RequestsAcceptJson::class
]);

Bei Laravel ist es so ziemlich der gleiche Prozess. Jetzt gibt die Fehlerbehandlungsroutine immer ein json anstelle von reinem Text/HTML zurück.

Ich weiß, das ist eine ziemlich alte Frage, aber ich bin gerade darüber gestolpert. Standardmäßig gibt Lumen eine JSON-Antwort zurück, wenn der Anforderer dies „wünscht“.

vendor/laravel/lumen-framework/src/Exceptions/Handler.php:110

return $request->expectsJson()
    ? $this->prepareJsonResponse($request, $e)
    : $this->prepareResponse($request, $e);

Dies geht auf
vendor/illuminate/http/Concerns/InteractsWithContentTypes.php:52

$acceptable = $this->getAcceptableContentTypes();
return isset($acceptable[0]) && Str::contains($acceptable[0], ['/json', '+json']);

Das heißt, wenn Sie einen „Accept“-Header für „application/json“ angeben, gibt Lumen automatisch eine JSON-Antwort zurück. z.B curl -H "Accept: application/json" https://example.com/my-erroring-endpint

Wenn Sie dies verwenden, müssen Sie keine benutzerdefinierte Fehlerbehandlungsroutine schreiben.

1433990cookie-checkLaravel Lumen Stellen Sie die JSON-Antwort sicher

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy