首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Slim如何用“Content: application/json”标题发送响应?

Slim如何用“Content: application/json”标题发送响应?
EN

Stack Overflow用户
提问于 2016-01-07 01:40:12
回答 4查看 31.8K关注 0票数 27

我有一个简单的REST api,用Slim做的,

代码语言:javascript
复制
<?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对象是不可变的,因此,如果您想在时间之后返回它,就必须返回或重新分配它。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-01-07 02:08:22

所以,代替这个:

代码语言:javascript
复制
if($student) {
            $response->withHeader('Content-Type', 'application/json');
            $response->write(json_encode($student));
            return $response;

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

就像这样:

代码语言:javascript
复制
if($student) {
    return $response->withStatus(200)
        ->withHeader('Content-Type', 'application/json')
        ->write(json_encode($student));

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

一切都很好。

票数 32
EN

Stack Overflow用户

发布于 2016-06-17 15:37:44

对于V3,withJson()是可用的。

所以你可以做这样的事情:

代码语言:javascript
复制
return $response->withStatus(200)
                ->withJson(array($request->getAttribute("route")
                ->getArgument("someParameter")));

注意:确保返回$response,因为如果您忘记了,响应仍然会出现,但不会是application/json

票数 13
EN

Stack Overflow用户

发布于 2018-12-01 21:48:52

对于V3,根据苗条博士最简单的方法是:

代码语言:javascript
复制
$data = array('name' => 'Rob', 'age' => 40);
return $response->withJson($data, 201);

这将自动将Content设置为application/json;charset=utf-8,并允许您也设置HTTP代码(如果省略,默认为200 )。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34646008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档