解释相关专业术语:
- Service Oriented Approach:面向服务的方法
- APIs(Application Programming interface):应用程序接口,应用编程接口
关于面向服务的方法
- 大多数非平凡的web应用程序使用的服务
- 他们使用来自其他应用程序的服务,例如信用卡费用,酒店预订系统
- 服务发布应用必须遵从的规则来使用服务,这种rule就被称为APIs
知识点1:从5分钟视频中提取的关于面向服务的方法的概念
首先,一开始在两个系统之间相互传输数据格式相同的数据是没有问题的,但是随着系统的扩张,出现了更多的子系统,不同的子系统可能会有不同的数据格式,因此数据不能够在相互之间进行传输,只能现在自己家进行预处理,这是十分耗时费力的。
因此考虑在系统层上加一个服务层,这样的话初始数据通过服务层序列化为统一的数据格式,再传向别的系统时再非序列化。
其优点是:以服务为中心的信息互联技术,能与现行软件系统一起使用,不需要移除最后那个巨大的程序,替换的程序使用现有连接,可以直接放到服务层里,而不影响其他用户,新加入的应用也可以用同样的方法增加整个系统的结构,每个系统的数据,会以服务的形式提供给所有其他的应用。当这个以服务为中心的模式进化成一个系统结构,它就让组织之间跨国界地共享服务数据成为可能。
知识点2:实例1——Google的API
对于网址的解析:在这个网址当中,“?”后面给出了一系列的参数,其中+代表的是空格,%2C代表的是逗号,这就是在GOOGLE搜索框中键入“Ann Arbor, MI”能够得到的网址,我们通过和API进行交互来实现搜索功能
将网址键入浏览器中,会得到一段Json:
{
"status": "OK",
"results": [
{
"geometry": {
"location_type": "APPROXIMATE",
"location": {
"lat": 42.2808256,
"lng": -83.7430378
}
},
"address_components": [
{
"long_name": "Ann Arbor",
"types": [
"locality",
"political"
],
"short_name": "Ann Arbor"
}
],
"formatted_address": "Ann Arbor, MI, USA",
"types": [
"locality",
"political"
]
}
]
}
用一段python程序进行解析:
import urllib.request, urllib.parse, urllib.error
import json
serviceurl = 'http://maps.googleapis.com/maps/api/geocode/json?'
while True:
address = input('Enter location: ')
if len(address) < 1: break #保持连续的交互(如果什么也不输入的话)
url = serviceurl + urllib.parse.urlencode({'address': address}) #这一句的作用是将实际输入的地址转码成网址格式的(例如将逗号转化为%2C)
print('Retrieving', url)
uh = urllib.request.urlopen(url)
data = uh.read().decode() #这里uh是utf-8类型,所以要进行decode()
print('Retrieved', len(data), 'characters')
try:
js = json.loads(data)
except:
js = None
#check somethings check 需要满足的几个条件,确保json是正常运行的,不输出坏数据
if not js or 'status' not in js or js['status'] != 'OK': #这里是对应不成功的三种情况,第一种情况是对应的上面的except,此时js为None,not None就是True
print('==== Failure To Retrieve ====')
print(data)
continue
print(json.dump(js , indent = 4)) #解释两点,dump的作用于load相反,indent = 4是指缩进4个格的方式输出
lat = js["results"][0]["geometry"]["location"]["lat"] #注意这里加[0]的原因,看json代码,results后面是一个列表,是两级的
lng = js["results"][0]["geometry"]["location"]["lng"]
print('lat', lat, 'lng', lng)
location = js['results'][0]['formatted_address']
print(location)
关于 lat = js[“results”][0][“geometry”][“location”][“lat”] 中加[0]的原因,外面是一个results的大列表,[0]让我们得到其中的第一个大字典,这个大字典是没有名字的,所以用[0]来指代。
补充:关于json.dump()/dumps()/load()/loads()
原文链接:https://blog.csdn.net/lingyunxianhe/article/details/95761915
json 模块提供了一种很简单的方式来编码和解码JSON数据。 其中两个主要的函数是 json.dumps() 和 json.loads()。
1.json.dumps将一个Python数据结构转换为JSON:
import json
data = {
'name' : 'myname',
'age' : 100,
}
json_str = json.dumps(data)
2.json.loads将一个JSON编码的字符串转换回一个Python数据结构:
data = json.loads(json_str)
3.json.dump() 和 json.load() 来编码和解码JSON数据,用于处理文件。
with open('test.json', 'w') as f:
json.dump(data, f)
with open('test.json', 'r') as f:
data = json.load(f)
json.dumps()是使用一种转化表格序列化一个对象到JSON格式的字符串
json.loads() 和json.dumps()对应,加载json字符串
知识点3:保护API请求(securing API requests)
关于API安全与速率限制,出于以下几个原因:
- 运行这些API的计算资源不是免费的
- 这些API提供的数据通常都是十分有价值的
- 数据提供者可能会限制每天的请求数量,要求一个API秘钥,甚至收取使用费
- 可能会随着发展而相应地改变规则
google的API和twitter的API的不同之处,谷歌允许同一台计算机一天可以进行2500次的request,twitter必须要登录认证后才能进行相关操作。
以推特的API为例:
import urllib.request, urllib.parse, urllib.error
import twurl
import json
TWITTER_URL = 'https://api.twitter.com/1.1/friends/list.json'
while True:
print('')
acct = input('Enter Twitter Account:')
if (len(acct) < 1): break
url = twurl.augment(TWITTER_URL,
{'screen_name': acct, 'count': '5'})
print('Retrieving', url) #包括登录信息的url
connection = urllib.request.urlopen(url)
data = connection.read().decode()
headers = dict(connection.getheaders())
print('Remaining', headers['x-rate-limit-remaining'])
js = json.loads(data)
print(json.dumps(js, indent=4))
for u in js['users']:
print(u['screen_name'])
s = u['status']['text']
print(' ', s[:50])
程序中有几个需要注意的地方:
1、headers = dict(connection.getheaders()),因为urllib读取的内容是没有header的,这一句是connection中的一个函数,可以读取header,前面的dict()是让其以字典的方式返回。
2、data = connection.read().decode(),这句返回的并不是json而是转化为python数据格式的json内容
3、print(‘Remaining’, headers[‘x-rate-limit-remaining’])这一句告知的内容是,API会在你做几次requests在其shut down程序之前
4、import twurl用于解决API的授权问题
5、 print(json.dumps(js, indent=4)) 让json用工整的格式打印出来
该段程序输出结果为:
Enter Twitter Account:drchuck
Retrieving https://api.twitter.com/1.1/friends ...
Remaining 14
{
"users": [
{
"status": {
"text": "@jazzychad I just bought one .__.",
"created_at": "Fri Sep 20 08:36:34 +0000 2013",
},
"location": "San Francisco, California",
"screen_name": "leahculver",
"name": "Leah Culver",
},
{
"status": {
"text": "RT @WSJ: Big employers like Google ...",
"created_at": "Sat Sep 28 19:36:37 +0000 2013",
},
"location": "Victoria Canada",
"screen_name": "_valeriei",
"name": "Valerie Irvine",
],
}
Leahculver
@jazzychad I just bought one .__._
Valeriei
RT @WSJ: Big employers like Google, AT&T are h
Ericbollens
RT @lukew: sneak peek: my LONG take on the good &a
halherzog
Learning Objects is 10. We had a cake with the LO,
想要twitter API工作,就需要一系列的参数,上图所示为参数获得的过程,这是登录后的网址信息,绿色的内容即为相应要获取的hidden.py中的参数
Sample Code Learning
(1)twtest.py
import urllib.request, urllib.parse, urllib.error
from twurl import augment
import ssl
# https://apps.twitter.com/
# Create App and get the four strings, put them in hidden.py
print('* Calling Twitter...')
url = augment('https://api.twitter.com/1.1/statuses/user_timeline.json',
{'screen_name': 'drchuck', 'count': '2'})
print(url)
# Ignore SSL certificate errors
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
connection = urllib.request.urlopen(url, context=ctx)
data = connection.read()
print(data)
print ('======================================')
headers = dict(connection.getheaders())
print(headers)
- 为什么要ignore SSLcertificate errors,因为我们使用UTTPS协议,在默认情况下由于种种原因python没有足够的证书放进去。一般意义上的https,就是服务器有一个证书。少许对客户端有要求的情况下,会要求客户端也必须有一个证书。因此当客户端没有证书时,需要服务器忽略证书验证。
- 代码connection = urllib.request.urlopen(url, context=ctx),括号中的第二个参数就是为了停止对SSL证书的安全检查
- 代码headers = dict(connection.getheaders())的作用是重新拿回header文件,因为urllib是会去掉头文件的。
- 这一段代码的作用是获取data和header并且进行测试打印输出
- 在第一次执行代码的时候程序会blow up,因为我们没有进行authorization,程序也会提示相应的401错误,这是一个好的信号,说明你还没有更新在hidden.py中的登录参数
- 更新后可以运行成功,直接输出的结果不是一个pretty的输出,这是因为仅仅print(data),如果做一个data.decode()会得到一个pretty的json输出
- 程序输出后可以关注一下header中的rate limit,可以看出执行一次减少一次
(2)twurl.py
import urllib.request, urllib.parse, urllib.error
import oauth
import hidden
# https://apps.twitter.com/
# Create App and get the four strings, put them in hidden.py
def augment(url, parameters):
secrets = hidden.oauth()
consumer = oauth.OAuthConsumer(secrets['consumer_key'],
secrets['consumer_secret'])
token = oauth.OAuthToken(secrets['token_key'], secrets['token_secret'])
oauth_request = oauth.OAuthRequest.from_consumer_and_token(consumer,
token=token, http_method='GET', http_url=url,
parameters=parameters)
oauth_request.sign_request(oauth.OAuthSignatureMethod_HMAC_SHA1(),
consumer, token)
return oauth_request.to_url()
def test_me():
print('* Calling Twitter...')
url = augment('https://api.twitter.com/1.1/statuses/user_timeline.json',
{'screen_name': 'drchuck', 'count': '2'})
print(url)
connection = urllib.request.urlopen(url)
data = connection.read()
print(data)
headers = dict(connection.getheaders())
print(headers)
(3)hidden.py
# Keep this file separate
# https://apps.twitter.com/
# Create new App and get the four strings
def oauth():
return {"consumer_key": "h7Lu...Ng",
"consumer_secret": "dNKenAC3New...mmn7Q",
"token_key": "10185562-eibxCp9n2...P4GEQQOSGI",
"token_secret": "H0ycCFemmC4wyf1...qoIpBo"}
参考链接:
(1)这里需要搞清楚三段程序之间的逻辑关系, 关于和twitter交互的详细流程如引用文章所示:
https://www.cnblogs.com/JohnnyYin/p/3426045.html
(2)一下是twitter API中文文档
https://www.williamlong.info/archives/2152.html
(3)Twitter API的使用
https://www.cnblogs.com/c-x-a/p/8634761.html
摘录如下:
1.用手机号注册推特账号
https://twitter.com/
2.进入网站
https://apps.twitter.com/
创建第一个app,填入基本信息
name写完会检测是否已经存在像我下面这个就存在了 所以第二张图改完之后的名字。
重点Website *的填写 ,需要填写的url是需要带有http或https的,具体的网站随意填写。
创建之后我们就看了,刚才创建好的api信息了,点击Keys and Access Tokens选项
需要获取
Consumer Key (API Key)
Consumer Secret (API Secret)
然后页面最下面获取accesstoken和key 点击create my access token