7

所以基本上我有我的主干应用程序对我的苗条 php 应用程序进行 ajax GET 调用。它期望 JSON dataType 作为回报。

$.ajax({
        url: './myroute',
        type: 'GET',
        dataType: "json",
        data: { username: username, password: password },
        success: function(data) {},
        error: function(data) {}
});

在我的苗条文件中,我有:

$app->get('/myroute', function() use ($app) {

    // all the good stuff here (getting the data from the db and all that)

    $dataArray = array('id' => $id, 'somethingElse' => $somethingElse);

    $response = $app->response();
    $response['Content-Type'] = 'application/json';
    $response->body(json_encode($dataArray));

});

    // Tried with these in the above GET request as well:
    // $app->contentType('application/json');
    // echo json_encode($dataArray);

虽然我的请求正确通过 (200),并且我正确获取了 JSON 数据,但错误是因为它还返回了完整的 index.php 页面数据(我的 javascript dataType: "json" 不允许,这会触发错误)

我认为将内容类型设置为“application/json”可以解决这个问题,但它仍然会返回完整的页面内容以及 json 数据。

编辑以供参考

我曾经设置它,以便 Slim 将我的 html 呈现为:

$app->get('/', function () use ($app) {
    // would just have my main page files in home.php instead of index.php
    $app-render('home.php');
});

这样,没有从 index.php 返回的 html 页面数据。但是 pushState 的方式是,我必须让我的 javascript 脚本在 index.php 上运行,否则我的页面将无法正确加载,因为当它们被请求时,脚本不在那里代表路由应该去的地方。

任何帮助表示赞赏!

谢谢!

4

4 回答 4

10

不熟悉 slim 框架。看起来很有趣。听起来代码在显示 json 后继续运行。也许exit;在用你的 json 响应后尝试 php 应用程序?

$app->get('/myroute', function() use ($app) {
    // all the good stuff here (getting the data from the db and all that)

    $dataArray = array('id' => $id, 'somethingElse' => $somethingElse);

    $response = $app->response();
    $response['Content-Type'] = 'application/json';
    $response->body(json_encode($dataArray));
    exit();
});
$app->run();

希望这可以帮助

于 2013-01-04T03:35:14.713 回答
6

尝试更改body()write().

我认为这会起作用:$response->write(json_encode($dataArray));

于 2013-01-04T08:45:13.293 回答
1

关于返回 JSON 的 Slim 文档提到了您正在寻找的内容。

再次从文档中,每个路由回调接受三个参数:

Reques
第一个参数是一个 Psr\Http\Message\ServerRequestInterface 对象,它代表当前的 HTTP 请求。
响应
第二个参数是一个 Psr\Http\Message\ResponseInterface 对象,它代表当前的 HTTP 响应。
参数
第三个参数是一个关联数组,其中包含当前路由的命名占位符的值。

从同一页面引用:

如果使用 Closure 实例作为路由回调,则闭包的状态将绑定到 Container 实例。这意味着您将可以通过 $this 关键字访问闭包内的 DI 容器实例。

uese ($app)所以在定义路由回调时不需要。

也如文档中所述

最终,每个 Slim 应用程序路由必须返回一个 PSR 7 响应对象

总而言之,这应该符合您的期望:

$app->get('/myroute', function($request, $response, $args) {

// all the good stuff here (getting the data from the db and all that)

$dataArray = array('id' => $id, 'somethingElse' => $somethingElse);

return $response->withJson($dataArray);

});
于 2017-06-29T17:41:18.683 回答
0

exit();我来说不再工作了,不知道为什么。这是我解决它的方法:

$response = $app->response();
$response['Content-Type'] = 'application/json';
$response->body(json_encode($body));
return $response;
于 2015-09-07T14:15:32.990 回答