Php 瘦JSON输出

Php 瘦JSON输出,php,json,frameworks,slim,Php,Json,Frameworks,Slim,我正在使用Slim框架和PHP为我的应用程序创建一个restfulapi。然而,我假设框架将有一些方法来创建更简单的JSON输出,而不仅仅是exit($jsonEncodedVariable) 我是缺少框架中的某些内容,还是需要使用json\u encode()退出($json)。。。每种方法 所有数据都从MySQL数据库中取出,然后根据调用REST请求的内容放入JSON数组 例如,如果请求了/api/posts/all,我将exit()一个包含所有post的JSON数组,每个post都为自己的

我正在使用Slim框架和PHP为我的应用程序创建一个restfulapi。然而,我假设框架将有一些方法来创建更简单的JSON输出,而不仅仅是
exit($jsonEncodedVariable)

我是缺少框架中的某些内容,还是需要使用
json\u encode()
<代码>退出($json)
。。。每种方法

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

例如,如果请求了
/api/posts/all
,我将
exit()
一个包含所有post的JSON数组,每个post都为自己的键指定一个值,
“value”:key

我的问题是,有没有一种简单的方法,使用slim框架,将JSON代码
exit()
'作为纯文本退出

function _die($array){
   echo json_encode($array);
   exit;
}


$result = mysql_query("SELECT * FROM table");
while($row = mysql_fetch_assoc($result)){
    $array[] = $row;
}

_die($array);

提示:

为什么不直接使用Slim的响应对象呢?(还有……为什么退出?)

让我先说我仍然认为自己是个傻瓜,所以如果我犯了错误,请纠正我,以便我能学习。但是,我在玩一个类似的问题,我想我可能会插嘴2美分,并存档更多关于这个问题的讨论。关于Slim on Stack的信息越多越好

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

我意识到这不是Slim的设计初衷。使用echo,而不是exit。注-文件:

无论何时从路由回调中回显()内容,都会在输出缓冲区中捕获>回显()'d内容,然后在HTTP响应>返回到客户端之前将其追加到响应正文中

那很方便,但我没法回音。我搞砸的是一个更大的问题。内容与行为的分离。如果您和我一样,您正在设置一个单页应用程序,其中的代码基本上位于index.php上。我需要加载初始html,所以我将其包含在该页面中。我需要做的是创造一个更干净的分离。我的路由设置正确,因此当人们获得“/”Slim_视图时(请参阅developrel。)会为我返回一个html和js的呈现模板。太棒了

现在我有了Slim的所有工具,我的代码更加干净、独立、可管理,并且更符合http协议。我想这就是框架的用途。:-)

注意:我并不是说所有这些都是你的问题,但我认为这个问题和你的设置似乎非常相似。这可能会帮助另一个走上同样道路的新人

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

有关Slim3,请参见下面的答案或


为什么不
$response->write(json_encode($dataAry))
而不是
echo json_encode($dataAry)

我认为Slim还提供了一个中间件对象,它可以自动执行此操作,因此该框架的用户不必对每个请求都编写json\u解码和编码,它被称为
Slim\u中间件\u ContentType
对象

$app->response()->('application/json');
$app->add(new Slim_Middleware_ContentType());
它为你解码。解码效果很好,但对最后一篇文章的编码效果很好

谢谢,
Dharani

我的修复程序添加了“退出”;在json打印输出的末尾,我的开发服务器并不在意,但我的实时服务器不会触发json结束事件。我不需要添加标题或使用json编码。

我感觉到了你的痛苦。我想创建一个可重用的函数,因此我创建了一个helpers文件,并包括以下内容:

function toJSON($app, $content) {
    $response = $app->response;
    $response['Content-Type'] = 'application/json';
    $response->body( json_encode($content) );
};
然后我就这样使用它:

$app->get('/v1/users/:id', function($id) use ($app)
{
    //instantiate SMM data model
    $model = new user_model($site);

    //get all docs, or one, depending on if query contains a page ID
    $doc = $model->get(array());

    //if the object contains main -- we don't need the outer data.
    toJSON($app, $doc);
});
$app->get('/test/', function() use ($app) {
    $data = array(1,2,3,4);
    $app->outputArray($data);
});
$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();
function APIRequests () {
    $app = \Slim\Slim::getInstance();
    $app->view(new \JsonApiView());
    $app->add(new \JsonApiMiddleware());
}

$app->group('/api', 'APIRequests', function () use ($app) {
    $app->get('/areas/:id', function ($id) use ($app) {
       $app->render(200, Area::find($id));
    });
});

编辑:我认为如果在流行mime类型的响应对象中已经内置了这样的函数,那就太好了

您可以使用输出函数扩展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();
然后像这样使用它:

$app->get('/v1/users/:id', function($id) use ($app)
{
    //instantiate SMM data model
    $model = new user_model($site);

    //get all docs, or one, depending on if query contains a page ID
    $doc = $model->get(array());

    //if the object contains main -- we don't need the outer data.
    toJSON($app, $doc);
});
$app->get('/test/', function() use ($app) {
    $data = array(1,2,3,4);
    $app->outputArray($data);
});
$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();
function APIRequests () {
    $app = \Slim\Slim::getInstance();
    $app->view(new \JsonApiView());
    $app->add(new \JsonApiMiddleware());
}

$app->group('/api', 'APIRequests', function () use ($app) {
    $app->get('/areas/:id', function ($id) use ($app) {
       $app->render(200, Area::find($id));
    });
});

因为每个人的答案都有函数和类,所以我将加入这个简化的答案。\Slim\Http\Response可以为您这样做:

$app->get('/v1/users/:id', function($id) use ($app)
{
    //instantiate SMM data model
    $model = new user_model($site);

    //get all docs, or one, depending on if query contains a page ID
    $doc = $model->get(array());

    //if the object contains main -- we don't need the outer data.
    toJSON($app, $doc);
});
$app->get('/test/', function() use ($app) {
    $data = array(1,2,3,4);
    $app->outputArray($data);
});
$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();
function APIRequests () {
    $app = \Slim\Slim::getInstance();
    $app->view(new \JsonApiView());
    $app->add(new \JsonApiMiddleware());
}

$app->group('/api', 'APIRequests', function () use ($app) {
    $app->get('/areas/:id', function ($id) use ($app) {
       $app->render(200, Area::find($id));
    });
});
由于您很可能只返回JSON数据,因此制作适当的中间件可能是一个好主意,请参阅。

使用Slim JSON API。您可以使用它处理JSON输出。

我使用Slim2编写的API来启用JSON响应。初始化代码如下所示:

$app->get('/v1/users/:id', function($id) use ($app)
{
    //instantiate SMM data model
    $model = new user_model($site);

    //get all docs, or one, depending on if query contains a page ID
    $doc = $model->get(array());

    //if the object contains main -- we don't need the outer data.
    toJSON($app, $doc);
});
$app->get('/test/', function() use ($app) {
    $data = array(1,2,3,4);
    $app->outputArray($data);
});
$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();
function APIRequests () {
    $app = \Slim\Slim::getInstance();
    $app->view(new \JsonApiView());
    $app->add(new \JsonApiMiddleware());
}

$app->group('/api', 'APIRequests', function () use ($app) {
    $app->get('/areas/:id', function ($id) use ($app) {
       $app->render(200, Area::find($id));
    });
});

我真的很喜欢使用中间件和路由分组的抽象级别,这样可以很容易地将不同的响应类型应用到应用程序的不同区域。

使用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
    );
});
更多信息

[更新]
使用JSON将第二个和第三个参数添加到
。第二个是HTTP状态码,第三个是Json编码选项(最适合特殊字符和其他字符,例如:正确打印“ã”)

[BEFORE]:内容类型text/html;字符集=UTF-8

不使用SOAPUI JSON:(

[AFTER]:内容类型application/json;字符集=utf-8

使用SOAPUI JSON;)


您可以在slim3中使用JSON($data、$status、$encodingOptions)作为Slim的响应对象自定义方法

有关详细信息

标题(“内容类型:application/json”);
echo json_编码($data)

我在slim版本2中就是这样做的

$app->response->headers->set("Content-Type", 'application/json');
return $app->response->write(json_encode([
    'status' => true,
    'message' => 'Your message'
]));

请编辑您的问题,并提供有关您问题的更多信息。很难从你现在的工作中得到你想要的。您需要更多信息吗?我认为这应该被选为答案,因为它将正确的内容类型标题设置为响应的一部分。我不同意,orangewrap的答案通过响应对象而不是标题函数设置内容类型。这两种方法都是有效的。为什么要退出?只因为你能,它一定不能离开我