web-dev-qa-db-ja.com

スリム-「Content-Type:application / json」ヘッダーで応答を送信する方法

このシンプルなREST api、Slimで行われ、

<?php

require '../vendor/autoload.php';

function getDB()
{
    $dsn = 'sqlite:/home/branchito/personal-projects/slim3-REST/database.sqlite3';

    $options = array(
        PDO::ATTR_PERSISTENT => true,
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
    );
    try {

        $dbh = new PDO($dsn);

        foreach ($options as $k => $v)
            $dbh->setAttribute($k, $v);

        return $dbh;
    }
    catch (PDOException $e) {
        $error = $e->getMessage();
    }
}

$app = new \Slim\App();

$app->get('/', function($request, $response) {
    $response->write('Bienvenidos a Slim 3 API');
    return $response;
});

$app->get('/getScore/{id:\d+}', function($request, $response, $args) {

    try {
        $db = getDB();
        $stmt = $db->prepare("SELECT * FROM students
            WHERE student_id = :id
            ");

        $stmt->bindParam(':id', $args['id'], PDO::PARAM_INT);
        $stmt->execute();

        $student = $stmt->fetch(PDO::FETCH_OBJ);

        if($student) {
            $response->withHeader('Content-Type', 'application/json');
            $response->write(json_encode($student));

        } else { throw new PDOException('No records found');}

    } catch (PDOException $e) {

        $response->withStatus(404);
        $err =  '{"error": {"text": "'.$e->getMessage().'"}}';
        $response->write($err);
    }
    return $response;
});

$app->run();

ただし、ブラウザに送信してもらうことはできませんapplication/jsonコンテンツタイプ、常に送信text/html?私が間違っているのは何ですか?

編集:

OK、頭を壁にぶつけて2時間たった後、私はこの答えにつまずいた。

https://github.com/slimphp/Slim/issues/1535 (ページの一番下)何が起こるかを説明し、responseオブジェクトは不変であるように見える後で返却する場合は、返却または再割り当てする必要があります。

26
branquito

したがって、これの代わりに:

if($student) {
            $response->withHeader('Content-Type', 'application/json');
            $response->write(json_encode($student));
            return $response;

        } else { throw new PDOException('No records found');}

次のようにします:

if($student) {
    return $response->withStatus(200)
        ->withHeader('Content-Type', 'application/json')
        ->write(json_encode($student));

} else { throw new PDOException('No records found');}

そしてすべてが順調です。

30
branquito

V3では、 withJson() が利用可能です。

次のようなことができます:

return $response->withStatus(200)
                ->withJson(array($request->getAttribute("route")
                ->getArgument("someParameter")));

注:必ず$response忘れた場合、応答はまだ出ますが、application/json

13
conrad10781

V3の場合、 Slim docs による最も簡単な方法は次のとおりです。

$data = array('name' => 'Rob', 'age' => 40);
return $response->withJson($data, 201);

これにより、Content-Typeがapplication/json;charset=utf-8に自動的に設定され、HTTPステータスコードも設定できるようになります(省略した場合のデフォルトは200です)。

2
benyafai

以下も使用できます。

$response = $response->withHeader('Content-Type', 'application/json');
$response->write(json_encode($student));
return $response;

withHeaderは新しい応答オブジェクトを返すためです。そうすれば、複数のコードを書いてコードを書くことができます。

0
jcubic