python学习笔记22 面向服务的方法

解释相关专业术语:

  • 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&amp;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

在这里插入图片描述

发布了34 篇原创文章 · 获赞 5 · 访问量 6917

猜你喜欢

转载自blog.csdn.net/weixin_43593303/article/details/100822993