【发布时间】:2016-04-11 07:17:29
【问题描述】:
我有这个简单的 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?我做错了什么?
编辑:
好的,在头撞墙两个小时后,我偶然发现了这个答案:
https://github.com/slimphp/Slim/issues/1535(在页面底部)
这解释了会发生什么,似乎 response 对象是不可变的并且
因此,如果您想在之后退回它,则必须退回或重新分配
同时。
【问题讨论】:
-
发送响应前是否设置了
Content-Typehttp响应头? -
..你可以在我的代码中看到
$response->withHeader('Content-Type', 'application/json'); -
不应该是
return是echo? -
不。只需
return。 slimframework.com/docs