项目实战二知识点解析及扩展-网络服务接口

项目实战二知识点解析-网络服务接口

学习编程不是学会的知识点多就好,是需要深入掌握每个知识点。新手最容易犯的错误是走马观花的把网上的案例照做一遍,然后就任务自己学会了编程,等真正实操时又是一脸懵逼。	 所以我在学习中非常重视知识点的深入分析和掌握,针对项目实战二中的知识点我也做了梳理和扩展,在博客中记录。
项目实战二中涉及了多个知识点,以后会逐步记录和发布。

网络服务接口

学习编程不可能所有的模块和功能都是自己完成,工作中与人协作或引用其他已成型的服务,用到最多的就是网络接口服务。网络服务的调用本质和我们自己的函数调用时一样的,都是传入指定数据,传出或实现我们期望的数据或结果。区别就是函数是我们自己编写的,位于本地。调用时能看得见摸得着,而网络服务对我们则是透明的。	其实网络服务就是一个逻辑的函数,它就有自己的功能实现,有传入参数要求,有返回数据。
例如本次实战的有道翻译接口,‘http://fanyi.youdao.com/translate’可以理解为远程的函数路径。data[‘doctype’] = ‘json’,data[‘i’] = str就是要求的传入参数,html_josn就是函数的返回结果,而我们取其中的[‘translateResult’][0][0][‘tgt’]作为翻译结果进行展示。

URL

URL全名Uniform Resource Locator,统一资源定位符。 通常来说,一个URL通常由以下几个部分构成:协议、域名、端口、路径和URL地址参数。
例如: ‘http://fanyi.youdao.com/translate’中

http是协议

所谓协议是通信双方对于数据的格式、含义、规程等所做的约定。常见的通信协议还有:

  http
  https(http+ssl)
  ssh
  ftp
  smtp
  pop3
  • fanyi.youdao.com是域名和端口部分

fanyi.youdao.com是域名,其中端口是80,因为采用是默认的通信协议的,则客户端在请求时,是可以不用填写端口,在服务器端会自动补全。常见协议与其默认端口的对应关系如下:
http–80
ssl–443or8443
ssh-22
ftp-21
smtp-25
pop3-110

  • /translate是路径。

路径表示要访问的资源在服务器的容器中所存储的位置,最终由服务器中的解析程序指向一个执行函数。
例如:http://fanyi.youdao.com/translate/index.asp?boardID=5&ID=24618&page=1#name从域名后的最后一个“/”开始到“?”为止,是文件名部分,如果没有“?”,则是从域名后的最后一个“/”开始到“#”为止,是文件部分,如果没有“?”和“#”,那么从域名后的最后一个“/”开始到结束,都是文件名部分。本例中的文件名是“index.asp”。
从“#”开始到最后,都是锚部分。本例中的锚部分是“name”。锚部分也不是一个URL必须的部分(可以理解为定位)

  • URL地址参数

URL地址参数不是必需项,在不需要传递附加数据时可以为空。一般get请求的参数会把请求的数据会附在URL中,以?分割URL和传输数据,多个参数用&连接;数据是英文字母/数字,原样发送,如果是空格,转换为+,如果是中文/其他字符,则需要进行编码,得出如: %E4%BD%A0%E5%A5%BD,其中%XX中的XX为该符号以16进制表示的ASCII。
例如/index.asp?boardID=5&ID=24618&page=1#name中,从“?”开始到“#”为止之间的部分为参数部分,又称搜索部分、查询部分。本例中的参数部分为“boardID=5&ID=24618&page=1”。参数可以允许有多个参数,参数与参数之间用“&”作为分隔符。

数据传输

不同协议有着不同的数据传输约定,本次实战采用的HTTP协议,下面详细介绍http协议。

- http协议

HTTP是一个基于TCP/IP通信协议来传递数据,同时也是一个属于应用层的面向对象的协议,协议分为两个部分:http request(请求部分),http response(响应部分)。
1、简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
2、灵活:HTTP允许传输任意类型的数据对象。
3.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
4.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。
5、支持B/S及C/S模式。

- http request(请求部分)

 http请求是由四个部分构成:request line、request header、empty-line、request body。

**request line:**请求行,通常来说就是请求数据包的第一行内容,包含以下信息:request method、request path、protocol/version
request method:请求方法,常见的http的请求方法有get、post、put、patch、options、delete、trace、header等。请求方法是由接口(开发)决定的。不指定方法的情况下,采用的就是get。
request path: 即URL的path和URL地址参数部分。
protocol/version:协议和版本,要求请求和响应所使用的协议保持一致。
**request headers:**请求头,是指从第二行开始,到第一个空行结束的部分。 请求头一般表示客户端和服务器进行通信时所需要的一些控制和交互信息。请求头是键值对应的,格式为: key:value
http协议规定了很多标准的请求头,代表特殊的通信含义和作用。
User-Agent:用来告知服务器,客户端的一些配置信息(硬件、系统层面),绝大多数情况下,服务器都是通过该信息头来识别用户来源。通常cookie的自动管理是和这个信息头有关的。
Content-Type:该信息头是用来告知服务器,所发送的请求主体(body)的数据组织格式。常见的有:
application/json 数据就是就json 格式
application/xml 数据就是就xml格式
multipart/form-data; boundary=xxx 混合表单格式,通常是用来实现上传或者包含上传操作的业务。可以实现多种数据格式混合传递的效果。
一般来说,不指定Content-Type的情况下,默认就是application/x-www-form-urlencoded。
Cookie:也是请求头的一部分。
empty-line: 传输格式规定,主要作用分割请求头和请求体。
**request body:**请求主体,是指请求包的第一个空行之后的所有内容。请求主体的内容,数据组织格式等都和业务有关。

GET和DELETE将要处理的资源信息直接放在了URL中。通过"?<键值对>&<键值对>“的形式追加。HTTP RFC规范中并没有规定GET请求的URL长度,只是说明如果server无法处理太长的URI,可以通过返回414状态码。但是大多数浏览器会讲其限制在2k-8k之间。

>>> url_params = {'key':'value'}       #    字典传递参数,如果值为None的键不会被添加到url中
>>> r = requests.get('your url',params = url_params)
>>> print(r.url)
  your url?key=value

POST和PUT的请求参数存储在报文的请求体中。每一个参数都以”–boundary值“+“属性信息”+”空行“+"参数值"的数据结构存储。请求数据的最后以”–boundary值–“的格式结尾。

  • 代码解析
targetURL = ‘http://fanyi.youdao.com/translate’
data = {}
data[‘doctype’] = ‘json’
data[‘i’] = str
data_encode = parse.urlencode(data).encode()
resp = request.urlopen(targetURL, data=data_encode)
我们的项目实战使用了python内置库urllib模块,urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)1语法中了第一个参数可以传递URL之外,data 参数是可选的,如果要添加 data ,它要是字节流编码格式的内容,即 bytes 类型,通过 bytes() 函数可以进行转化,另外如果你传递了这个 data 参数,它的请求方式就不再是 GET 方式请求,而是 POST 方法。

理解了URL和HTTP请求后,我们应该把案例消化成自己的,一般就从案例的调整和扩展入手。首先我们知道上传数据有get和post方法, 案例用的post方法实现的,那如果用get方法应该怎么实现呢?
由前面的URL构成,我们知道URL 的?后面是参数部分,参数间用&分隔。那么我们构建的带参数的URL应该是这样的-http://fanyi.youdao.com/translate?doctype=json&i=str,其中str变量在最终URL请求中会被替换为选中的字符串,我们用‘work’代替进行测试。

url='http://fanyi.youdao.com/translate'+'?'+'doctype=json&i=word'
translate=urllib.request.urlopen(url).read().decode('utf-8')
print(translate)
{"type":"EN2ZH_CN","errorCode":0,"elapsedTime":1,"translateResult":[[{"src":"word","tgt":"词"}]]}

- 响应HTTP请求

服务器接收处理完请求后返回一个HTTP响应消息给客户端。HTTP响应消息的格式包括:状态行、响应头、空行、消息体。每部分内容占一行。
状态行:有HTTP协议版本号,状态码和状态说明三部分构成。和请求报文相比,响应报文多了一个“响应状态码”,它以“清晰明确”的语言告诉客户端本次请求的处理结果。
响应头:用于说明数据的一些信息,比如数据类型、内容长度等键值对。
空行:
**消息体:**服务端返回给客户端的HTML文本内容。或者其他格式的数据,比如:视频流、图片或者音频数据。
最后浏览器利用自己内部的工作机制,把消息体重获得的静态资源和html代码进行渲染,再呈现给我们。
在这里插入图片描述

扩展

学习案例,重点是通过分析和消化案例的知识点后,利用知识点实现一个类似的新需求。针对本案例我们把翻译服务改成百度。
通用翻译API HTTP地址:
http://api.fanyi.baidu.com/api/trans/vip/translate
通用翻译API HTTPS地址:
https://fanyi-api.baidu.com/api/trans/vip/translate
输入参数要求:
在这里插入图片描述
签名生成方法
签名是为了保证调用安全,使用MD5算法生成的一段字符串,生成的签名长度为 32位,签名中的英文字符均为小写格式

生成方法:
Step1. 将请求参数中的 APPID(appid), 翻译query(q, 注意为UTF-8编码), 随机数(salt), 以及平台分配的密钥(可在管理控制台查看) 按照 appid+q+salt+密钥 的顺序拼接得到字符串1。
Step2. 对字符串1做md5,得到32位小写的sign。
注:

  1. 待翻译文本(q)需为UTF-8编码
  2. 在生成签名拼接 appid+q+salt+密钥 字符串时,q不需要做URL encode,在生成签名之后,发送HTTP请求之前才需要对要发送的待翻译文本字段q做URL encode在这里插入图片描述

接入举例 例如:将英文单词apple翻译成中文:

请求参数:
q=apple
from=en
to=zh
appid=2015063000000001(请替换为您的appid)
salt=1435660288(随机码)
平台分配的密钥: 12345678

生成签名sign:
Step1. 拼接字符串1:
拼接appid=2015063000000001+q=apple+salt=1435660288+密钥=12345678得到字符串1:“2015063000000001apple143566028812345678”
Step2. 计算签名:(对字符串1做md5加密)
sign=md5(2015063000000001apple143566028812345678),得到sign=f89f9594663708c1605f3d736d01d2d4

拼接完整请求:
http://api.fanyi.baidu.com/api/trans/vip/translate?q=apple&from=en&to=zh&appid=2015063000000001&salt=1435660288&sign=f89f9594663708c1605f3d736d01d2d4
注:也可使用POST方式,如POST方式传送,Content-Type请指定为:application/x-www-form-urlencoded

得到以上信息,结合我们的案例可以看出来除了多了一些参数和返回的字段名称不一致外,整体结构也案例一样。
1、首先注册一个百度账号,按输入参数要求构建完整的URL请求 。
2、发送get或post请求,得到HTTP请求响应。
3、解析HTTP响应中的返回数据,得到翻译结果

本人已测试通过,具体的代码就不贴了。这个作为课后练习,大家可以动手实操实操。有几点做下说明:
1、在构建url请求时没有按百度给出的DEMO中字符串拼接的方式,按我们上文的urlencode方式构建。
2、在post构建参数时,多次出错,参考返回的错误码解决的。
3、urllib支持上下文管理,建议使用with关键字

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值