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 请求”