超薄JSON输出

max*_*ax_ 30 php json frameworks slim

我正在使用带有PHP的Slim框架为我的应用程序创建RESTful API.但是,我认为框架可以通过某种方式创建更简单的JSON输出而不仅仅是exit($jsonEncodedVariable);.

我在框架中遗漏了什么,或者我是否需要使用json_encode()...... exit($json)...用于每种方法?

所有数据都从我的MySQL数据库中取出,然后根据调用的REST请求放入JSON数组中.

例如,如果/api/posts/all被请求,我将为exit()所有帖子的JSON数组,每个帖子都为其自己的键值"value" : key.

我的问题是,是否有一种简单的方法,使用slim框架,用于exit()输入JSON代码而不是以纯文本形式退出?

jmk*_*142 58

为什么不使用Slim的响应对象?(也......为什么退出?)

$dataAry = // Some data array

$response = $app->response();
$response['Content-Type'] = 'application/json';
$response['X-Powered-By'] = 'Potato Energy';
$response->status(200);
// etc.

$response->body(json_encode($dataAry));
// Or echo json_encode($dataAry)
Run Code Online (Sandbox Code Playgroud)

让我先说我仍然认为自己是菜鸟,所以如果我犯了错误,请纠正我,这样我就可以学习.但是,我正在玩一个类似的问题/问题,我想我可能会以2美分的价格收看,并对此事进行更多的讨论.有关Slim on Stack的信息越多越好.

我基本上玩弄同样的东西,我注意到你正在使用退出 ; 起初,我也在使用exit,因为echo包含了一堆HTML,并且正在查看返回给我的AJAX调用的内容.当我使用exit时,它干净地删除了HTML,但是Slim响应对象没有改变我定义的响应头(参见上面的代码.)

我意识到这不是Slim的设计工作方式.使用echo,而不是退出.注 - Slim Doc:

每当您回显路由回调中的内容时,都会在输出缓冲区中捕获echo()'d内容>,然后在将HTTP响应>>返回到客户端之前将其附加到Response主体.

这很方便,但我无法回应.我搞砸的是一个更大的问题.将内容与行为分离.如果您像我一样,那么您正在设置一个单页应用程序,其中此代码基本上位于index.php上.我需要加载初始html,因此我将其包含在该页面上.我需要做的是创造一个更清洁的分离.我的路由设置正确,所以当人们获取'/'时,Slim_Views(参见Develop Rel.)会为我返回一个html和js的渲染模板.辉煌!

现在我可以使用Slim的所有工具,我的代码更清晰,更独立,更易于管理,并且更符合http协议.我想这就是框架的用途.:-)

注意:我并不是说这一切都是你的结果,但我认为问题和你的设置看起来非常相似.它可能会帮助另一个沿着同样的道路走下去的新人.

更新:正如@alttag所提到的,这个答案已经过时了(Slim 2)

对于Slim3,请参阅下面的答案或在文档中查看此页面

  • 我实际上正如你所说的那样使用了解决方案,而且效果非常好.一些提示:如果你需要在lambda函数中使用$ app变量,应该将它添加到范围lihe this:function()use($ app){}; 或者您可以使用\ Slim\Slim :: getInstance()来获取实例! (2认同)
  • 或者,`$ app-> response-> headers-> set('Content-Type','application/json');` (2认同)
  • 这是更好的答案. (2认同)

hak*_*kre 32

header("Content-Type: application/json");
echo json_encode($result);
exit;
Run Code Online (Sandbox Code Playgroud)

提示:使用Slim PHP Framework开发REST API

  • IMO实际上应该被选为答案,因为它将正确的内容类型标题设置为响应的一部分. (6认同)

jef*_*god 25

使用Slim 3,我使用这种格式:

<?php

$app = new \Slim\App();

$app->get('/{id}', function ($request, $response, $args) {
    $id = $request->getAttribute('id');

    return $response->withJSON(
        ['id' => $id],
        200,
        JSON_UNESCAPED_UNICODE
    );
});
Run Code Online (Sandbox Code Playgroud)

根据请求"/ 123",结果JSON:

{
  id: "123"
}
Run Code Online (Sandbox Code Playgroud)

更多信息请阅读此处.

[更新]添加第二个和第三个参数withJSON.第二个是HTTP状态代码,第三个是Json编码选项(最适用于特殊字符和其他字符,例如:print"ã"正确)


小智 11

您可以使用输出函数扩展slim,其输出取决于调用REST请求:

class mySlim extends Slim\Slim {
    function outputArray($data) {
        switch($this->request->headers->get('Accept')) {
            case 'application/json':
            default:
                $this->response->headers->set('Content-Type', 'application/json');
                echo json_encode($data);        
        }       
    } 
}

$app = new mySlim();
Run Code Online (Sandbox Code Playgroud)

并像这样使用它:

$app->get('/test/', function() use ($app) {
    $data = array(1,2,3,4);
    $app->outputArray($data);
});
Run Code Online (Sandbox Code Playgroud)


And*_*röm 8

由于每个人都通过函数和类复杂了他们的答案,我会抛出这个简化的答案.\ Slim\Http\Response可以这样做:

$app = new \Slim\Slim();

$app->get('/something', function () use ($app) {
    $response = $app->response();
    $response['Content-Type'] = 'application/json';
    $response->status(200);
    $response->body(json_encode(['data' => []]));
});

$app->run();
Run Code Online (Sandbox Code Playgroud)

由于您最有可能只返回JSON数据,因此制作适当的中间件可能是个好主意,请参阅http://www.sitepoint.com/best-practices-rest-api-scratch-introduction/.


小智 5

我认为 Slim 还提供了一个中间件对象,它会自动执行此操作,因此该框架的用户不必在每个请求上编写 json_decode 和编码,它称为对象 Slim_Middleware_ContentType

$app->response()->('application/json');
$app->add(new Slim_Middleware_ContentType());
Run Code Online (Sandbox Code Playgroud)

它为你解码。解码效果很好。但是对于编码,最后一篇文章很棒。

谢谢陀罗尼