PHP 中的 REST API 输出到 JSON 文件扩展名

Posted

技术标签:

【中文标题】PHP 中的 REST API 输出到 JSON 文件扩展名【英文标题】:REST API in PHP output to JSON file extension 【发布时间】:2011-01-11 07:09:51 【问题描述】:

所以我想用 php 编写一个用于 JSON 的 REST API,以便在 iPhone 上以及很多网站和设备上使用。我有下面的代码,当通过 GET 语句访问时,返回一个类似的文件:

1mdi2o3.part

如何返回类似:users.json

$db->setQuery( "SELECT * FROM users");
$db->query() or die($queryError);
$numRows = $db->getNumRows();
$row = $db->loadObjectList();

// PRINT JSON FILE
header("Content-type: application/json");

for($i = 0 ; $i < $numRows; $i++)
$json_output[$i] = $row[$i];


$MYjson_output = json_encode($json_output);

echo $MYjson_output;

【问题讨论】:

你能举一个活生生的例子吗?代码看起来没问题。 【参考方案1】:

欢迎来到 SO。您是否考虑过为此应用程序使用Zend framework?我有written about this topic before,如果您确实使用 Zend,我可能会提供额外的帮助。它肯定会帮助您了解基础知识。

HTH,

-aj

【讨论】:

抱歉,但是“使用 Zend”对于解决这样一个简单的问题似乎有点矫枉过正...... @Wim,OP 似乎正在开发他自己的 REST 服务器,而我只是指出了另一种重新发明***的方法。顺便说一句,请参阅我对 your 答案的评论。 你说得对,它对他很有用。但是如果它可以在 10 行内解决,我总是犹豫要先添加一些 10K 行框架;-)【参考方案2】:

问题出在这一行:

header("Content-type: application/json");

我知道这看起来是正确的做法(毕竟,application/json JSON 内容的官方 MIME 类型),但它会导致大多数浏览器向您显示文件下载对话框,当您只想查看文本时。您可以使用text/plain 编码来避免这种情况。请注意,您的 AJAX/iPhone/... 应用可能不关心内容类型,因此您的 API 在这两种情况下都可以工作。

另请参阅this blog post,它提供了更多上下文。

【讨论】:

@Wim,不会是 text/json 吗? 我只是在这里引用 OP。 application/json 虽然我认为是官方的。也许使用text/json,您可以欺骗浏览器将其显示为纯文本,但在这种情况下,text/plain 我猜是等价的。 根据***.com/questions/477816/the-right-json-content-typeapplication/json是最好的选择。 另外,我使用text/json,在 IE6-8、FF3 和 Chrome 上没有问题,但我不知道 iPhone 等 WebKit 的东西。 这正是我想要的,很简单。谢谢。【参考方案3】:

不完全是您的目标,但这里有 3-4 个可能有效的解决方案:

常见解决方案

重写

这可能是为您的 API 获取干净 URI 的最传统方式。如果您希望 user.json 的用户部分是动态的,您可以使用 mod_rewrite(再次假设 Apache)将您的 URL 重写为 php 处理程序脚本。如果您使用的是传统的 RESTful 风格的 URL 路由,您可能无论如何都希望使用它来实现干净的/ 分隔 URL。

# For grabbing all users
RewriteEngine on
RewriteRule ^users\.json rest.php [L]

# For grabbing one particular user
RewriteEngine on
RewriteRule ^([a-z0-9]+)\.json rest.php?user=$1 [L]

rest.php 是您的 PHP 处理程序脚本。

不带 mod-rewrite 的 URL 重写

如果你不想使用 mod_rewrite,你也可以这样做

example.com/rest.php/users.json
example.com/rest.php/user-id.json

甚至

example.com/rest.php/user-id
example.com/rest.php/user/user-id

rest.php 是您的 PHP 处理程序脚本。您可以使用 $_SERVER 全局和 $_SERVER['REQUEST_URI'] 从 URL(或 URI,如果我们正在谈论 RESTful 术语)中获取 user-id

其他解决方案

通过 Content-Disposition 更改下载名称:

我相信你想添加Content-Disposition 标头...

<?php
    header('Content-Disposition: attachment; filename="users.json"');
?>

这将强制将文件下载为 user.json。这通常不是 REST API 所期望的行为,但从你的问题的措辞来看,我想我会把它扔在那里。

AddHandler(或 AddType)

假设您正在运行 Apache 服务器,您也可以使用 AddHandler 指令将 .json 扩展文件视为 php。

AddHandler application/x-httpd-php .json

警告:其他普通的 .json 文件将被视为 PHP,因此您可能希望将其设置在 PHP 脚本所在目录中的 .htaccess 文件中。这对于这个 URI 可以正常工作,但如果您要公开许多 URI,则不理想

【讨论】:

以上是关于PHP 中的 REST API 输出到 JSON 文件扩展名的主要内容,如果未能解决你的问题,请参考以下文章

将大型 JSON 直接从 Java 中的 REST API 响应流保存为文本

通过 PHP SDK 的 PayPal REST API 返回“传入的 JSON 请求未映射到 API 请求”

使用 PHP cURL 通过 REST API 获取 JSON

php 将产品图像添加到WC REST API订单输出

使用 PHP PayPal REST API 退款?

使用 BigQuery REST 或 Java API 运行查询以获取 JSON 输出格式