基于Picasa、PHP、AJAX的图片REST架构的简单实现(3)
- 本篇日志由AlloVince在July 23 2008 08:11:44发表
- YD的程序员葛阁 | 永久链接
- 日志未经声明,均为原创,版权遵循 『 创作共用 Creative Commons 』协议
前情提要:基于Picasa、PHP、AJAX的图片REST架构的简单实现
之前我们从远端获得了图片信息,但是这些和REST还是不沾边的。访问同一个URL,要想获得不同的信息,以目前的软硬件条件,最好的实现方法还是对HTTP Headers进行处理。所以这次的话题是——
Step.2 服务器端接受不同的HTTP Headers返回不同的信息
既然是服务器端,我们仍然采用PHP实现。
PHP对于Header信息的处理是很丰富的,常见的Header都已经存放在预定义变量$_SERVER中了。如果你对什么是Header还没有概念,可以在Firefox中安装一个Live HTTP Headers自行体验一下。
现在问题是:如此之多的Header,到底选择哪个或者哪几个来进行分析?用户的客户端语言,浏览器,IP等等,都是可以进行发挥的。这里为了简单说明问题,选择REQUEST_METHOD,HTTP_REFERER以及HTTP_X_REQUESTED_WITH来进行演示。
简单说明这三个参数:
- REQUEST_METHOD是页面的请求方法,也是目前REST实现的核心。
- HTTP_REFERER包含了用户的访问来源,一般是用户前一个访问的URL
- HTTP_X_REQUESTED_WITH则代表这是一个Xmlhttprequest请求,可以简单的看成是Ajax请求。
以下就是个人的随意发挥了,我所约定的有效服务器反馈包括:
- 因为不涉及更新等操作,页面的请求方法只限于GET
- 如果HTTP_REFERER存在,即说明用户在网页中或者通过链接点击访问照片,服务器返回照片的缩略图。
- 如果HTTP_REFERER不存在,说明用户直接通过URL访问图片,服务器返回照片的全图。
- 如果HTTP_X_REQUESTED_WITH存在,则说明用户在通过Ajax访问图片,这时返回一个Json格式的照片信息
形象一点用实例说明的话:
点击链接会看到照片的缩略图,将这张照片的地址粘贴到浏览器地址栏直接访问的话,会看到照片的大图。而在Demo中,点击下面的按钮,则可以看到发送Ajax请求到同一个地址时的反馈。
最后还是附上服务器端的代码
require_once 'XML/Unserializer.php';
$Unserializer = &new XML_Unserializer();
$options = array('parseAttributes' => true);
$Unserializer->setOptions($options);
if($userid && $albumid && $photoid) {
$xml = "http://picasaweb.google.com/data/feed/api/user/".$_GET['userid']."/albumid/".$_GET['albumid']."/photoid/".$_GET['photoid'];
$status = $Unserializer->unserialize($xml,true);
//XML文件解析出错, 报错并退出
if (PEAR::isError($status)) {
die($status->getMessage());
exit;
}
//如果是一个AJAX访问,返回JSON描述
elseif($_SERVER['REQUEST_METHOD'] == 'GET' && $_SERVER['HTTP_X_REQUESTED_WITH']){
$pic = $Unserializer->getUnserializedData();
$part = explode('.',$pic['media:group']['media:content']['url']);
$json = json_encode(array(
'title' => $pic['media:group']['media:description']['_content'] ? $pic['media:group']['media:description']['_content'] : $pic['title']['_content'],
'date' => gmdate("F d Y H:i:s",strtotime($pic['updated'])),
'ext' => $part[count($part) -1],
'full' => $pic['media:group']['media:content']['url']
));
echo "($json)";
}
//HTTP_REFERER有无的区分
elseif($_SERVER['REQUEST_METHOD'] == 'GET' && $_SERVER['HTTP_REFERER']) {
$pic = $Unserializer->getUnserializedData();
header("Content-Type: image/jpeg");
curl_exec(curl_init($pic['icon']));
}
elseif($_SERVER['REQUEST_METHOD'] == 'GET' && !$_SERVER['HTTP_REFERER']) {
$pic = $Unserializer->getUnserializedData();
header("Content-Type: ".$pic['media:group']['media:content']['type']);
curl_exec(curl_init($pic['media:group']['media:content']['url']));
}
}
