使用jsonp获取Flickr相片信息

笔者使用jquery-1.6.2, 根据flickr提供的feed api封装了一个简易的调用flckr feed api的方法

代码如下:

flickr.js

(function(window,$,undefined){
	var flickr = {
		//支持的语言
		charset:{
			//德语
			'de-de':'de-de',
			//英语
			'en-us':'en-us',
			//西班牙语
			'es-us':'es-us',
			//法语
			'fr-fr':'fr-fr',
			//意大利语
			'it-it':'it-it',
			//韩语
			'ko-kr':'ko-kr',
			//西班牙语
			'pt-br':'pt-br',
			//繁体中文(香港)
			'zh-hk':'zh-hk'
		},
		//生成url
		makeUrl:function(param){
			var url = "http://api.flickr.com/services/feeds/";
			switch(param.type){
				//公开相片和视讯
				case "public":
					//指定feed的格式
					url+="photos_public.gne?format="+(param.format ? param.format : 'json');
					//指定的拥护id
					if(param.id) url+="&id="+param.id;
					//指定的多个用户的id,以逗号分隔
					if(param.ids) url+="&ids="+param.ids;
					//指定的多个标签id,以逗号分隔
					if(param.tags) {
						url+="&tags="+param.tags;
						//tagmode=all/any  严格匹配或者模糊匹配
						url+="&tagmode="+(param.tagmode ? param.tagmode : 'any');
					}
					//指定feed内容的语言,默认为en-us
					if(param.lang) url+="&lang="+param.lang;		
					break;
				//传回来自指定用户的自己人,朋友和家人的公开内容清单
				case "friends":
					//指定feed的格式
					url+="photos_friends.gne?format="+(param.format ? param.format : 'json');
					//为其取得朋友的相片和视讯的使用者的使用者id(required)
					if(param.user_id) url+="&user_id="+param.user_id;
					//显示每个自己人的多个项目(display_all=1),而不是一个,预设为每个人显示一个项目
					if(param.display_all) url+="&display_all="+param.display_all;
					//仅显示朋友和家人的内容(friends=1),自己人除外,预设为显示来自所有自己人的内容
					if(param.friends) url+="&friends="+param.friends;
					//指定feed内容的语言,默认为en-us
					if(param.lang) url+="&lang="+param.lang;
					break;
				//某个使用者的公开最爱
				case "faves":
					//指定feed的格式
					url+="photos_faves.gne?format="+(param.format ? param.format : 'json');
					//使用者id(required)
					if(param.id) url+="&id="+param.id;
					//指定feed内容的语言,默认为en-us
					if(param.lang) url+="&lang="+param.lang;
					break;		
				//群组讨论区feed 传回指定群组中的最新讨论清单
				case "groups_discuss":
					//指定feed的格式
					url+="groups_discuss.gne?format="+(param.format ? param.format : 'json');
					//群组id(required)
					if(param.id) url+="&id="+param.id;
					//指定feed内容的语言,默认为en-us
					if(param.lang) url+="&lang="+param.lang;
					break;
				//群组分享区feed	传回最近增加至指定群组分享区的内容清单
				case "groups_pool":
					//指定feed的格式
					url+="groups_pool.gne?format="+(param.format ? param.format : 'json');
					//群组id(required)
					if(param.id) url+="&id="+param.id;
					//指定feed内容的语言,默认为en-us
					if(param.lang) url+="&lang="+param.lang;
					break;	
				//讨论区讨论feed 传回来自讨论区的最新主题清单
				case "forums":
					//指定feed的格式
					url+="forums.gne?format="+(param.format ? param.format : 'json');
					//指定feed内容的语言,默认为en-us
					if(param.lang) url+="&lang="+param.lang;
					break;
				//传回有关属于指定使用者的所有相片和相片集的最新回应清单										
				case "activity":
					//指定feed的格式
					url+="activity.gne?format="+(param.format ? param.format : 'json');
					//使用者id(required)
					if(param.user_id) url+="&user_id="+param.user_id;
					//指定feed内容的语言,默认为en-us
					if(param.lang) url+="&lang="+param.lang;
					break;
				//传回指定用户自己已回应的最新回应清单									
				case "comments":
					//指定feed的格式
					url+="photos_comments.gne?format="+(param.format ? param.format : 'json');
					//使用者id(required)
					if(param.user_id) url+="&user_id="+param.user_id;
					//指定feed内容的语言,默认为en-us
					if(param.lang) url+="&lang="+param.lang;
					break;
				default:
					url = false;
					break;
			}
			if(url) url+="&jsoncallback="+param.callback;
			return url;
		},
		//获取指定flckr咨询
		getFlickr:function(param){
			var url = flickr.makeUrl(param);
			$.ajax({ 
				url: url,
                dataType: 'jsonp'
            });
		}
	}
	window.flickr = flickr;
})(window,jQuery);



index.html

<!DOCTYPE HTML>
<html lang="en">
<head>
	<meta charset="UTF-8">
    <title>iphone test</title>
    <script type="text/javascript" src="jquery-1.6.2.min.js"></script>
    <script type="text/javascript" src="flickr.js"></script>
    <script type="text/javascript">
    	function getMyPhotos(data){
    		$.each(data.items,function(i,item){
    			$("#imgs").append($("<img>").attr("src",item.media.m));
    		});
    	}
    	$(function(){
    		flickr.getFlickr({type:'public',callback:'getMyPhotos'});
    	});
    </script>
    <style>
        p{color:blue}
        #imgs{overflow:auto;}
    </style>
</head>
<body>
    <div id="imgs"></div>
</body>
</html>

哦耶,偷懒一计,不多些说嘛了,代码很简单。




是的,JSONP一般用于跨域获取JSON格式的数据,无法直接用于获取text格式的数据。如果需要获取text格式的数据,可以使用代理页面的方式实现跨域访问。 代理页面的方式是指在同一域名下创建一个代理页面,用于在客户端和服务器端之间传递数据。客户端将数据发送到代理页面,代理页面再将数据转发给服务器端,服务器处理数据后再将结果发送回代理页面,代理页面再将结果传递给客户端。 具体实现方式如下: 1. 创建代理页面proxy.html: ```html <!-- proxy.html --> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>代理页面</title> <script src="https://cdn.bootcdn.net/ajax/libs/axios/0.21.1/axios.min.js"></script> <script> function proxy() { var data = window.location.search.substring(1); axios.post('http://example.com/proxy', data, { headers: { 'Content-Type': 'text/plain;charset=UTF-8' } }).then(function(response) { window.parent.postMessage(response.data, '*'); }).catch(function(error) { console.log(error); }); } window.onload = proxy; </script> </head> <body> </body> </html> ``` 2. 在父页面中,将需要获取的text格式数据以字符串形式作为参数,发送到代理页面: ```js // 父页面 var text = '这是需要获取的文本'; var proxyUrl = 'http://example.com/proxy.html'; var iframe = document.createElement('iframe'); iframe.style.display = 'none'; iframe.src = proxyUrl + '?' + text; document.body.appendChild(iframe); window.addEventListener('message', function(event) { console.log(event.data); }); ``` 3. 在服务器端,接收代理页面发送的数据,并返回处理结果: ```js // 服务器端 const express = require('express'); const app = express(); const bodyParser = require('body-parser'); app.use(bodyParser.text()); app.post('/proxy', (req, res) => { const text = req.body; // 处理text格式的数据 const result = text.toUpperCase(); res.send(result); }); app.listen(80, () => { console.log('服务器已启动'); }); ``` 需要注意的是,代理页面需要在服务器端进行处理,并且需要考虑数据安全性的问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值