[英]Slim - How to send response with “Content-Type: application/json” header?
I have this simple REST api, done in Slim, 我有这个简单的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();
however, I can't get browser to send me application/json
content type, it always sends text/html
? 但是,我无法让浏览器向我发送
application/json
内容类型,它总是发送text/html
? What I am doing wrong? 我做错了什么?
EDIT: 编辑:
Ok, after two hours of hitting the head against the wall, I stumbled upon this answer: 好吧,经过两个小时的撞击墙头后,我偶然发现了这个答案:
https://github.com/slimphp/Slim/issues/1535 (at the bottom of a page) which explains what happens, appears that response
object is immutable and as such it must be returned or reassigned if you want to return it after while. https://github.com/slimphp/Slim/issues/1535 (在页面底部)解释会发生什么,似乎
response
对象是不可变的,因此如果你想在之后返回它必须返回或重新分配而。
So, instead of this: 所以,而不是这个:
if($student) {
$response->withHeader('Content-Type', 'application/json');
$response->write(json_encode($student));
return $response;
} else { throw new PDOException('No records found');}
Do like this: 这样做:
if($student) {
return $response->withStatus(200)
->withHeader('Content-Type', 'application/json')
->write(json_encode($student));
} else { throw new PDOException('No records found');}
And all is well and good. 一切都很好。
For V3, withJson()
is available. 对于V3,
withJson()
可用。
So you can do something like: 所以你可以这样做:
return $response->withStatus(200)
->withJson(array($request->getAttribute("route")
->getArgument("someParameter")));
Note: Make sure you return the $response
because if you forget, the response will still come out but it will not be application/json
. 注意:确保返回
$response
因为如果您忘记了,响应仍然会出现,但它不会是application/json
。
For V3, the simplest method as per the Slim docs is: 对于V3,根据Slim文档最简单的方法是:
$data = array('name' => 'Rob', 'age' => 40);
return $response->withJson($data, 201);
This automatically sets the Content-Type to application/json;charset=utf-8
and lets you set a HTTP status code too (defaults to 200 if omitted). 这会自动将Content-Type设置为
application/json;charset=utf-8
并允许您设置HTTP状态代码(如果省略,则默认为200)。
You can also use: 您还可以使用:
$response = $response->withHeader('Content-Type', 'application/json');
$response->write(json_encode($student));
return $response;
because withHeader
return new response object. 因为
withHeader
返回新的响应对象。 That way you have more then one write and code between. 这样你就可以有多个写入和代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.