(十三)把网络地址拆成可处理的字段
1. URL 的组成与查询参数
等待操作现在换成真实请求。先拆开 http://127.0.0.1:8765/api/books/1?tag=基础#intro:协议是 http,主机是本机回环地址,端口是 8765,路径选中接口,查询参数交给接口,fragment 是客户端使用的片段。
# 项目文件:demos/url_parts.py
# urlencode 编码查询值,parse_qs 把重复键还原成值列表,fragment 不作为请求目标发送。
from urllib.parse import parse_qs, urlencode, urlsplit
query = urlencode({"keyword": "Python 入门", "tag": ["基础", "语法"]}, doseq=True)
url = "http://127.0.0.1:8765/api/books/1?" + query + "#intro"
parts = urlsplit(url)
print(parts.scheme, parts.hostname, parts.port, parts.path)
print(parse_qs(parts.query))
print("客户端片段", parts.fragment)输出协议、主机、端口、路径,以及 {'keyword': ['Python 入门'], 'tag': ['基础', '语法']}。doseq=True 把列表展开成重复的 tag 参数;空格与中文交给编码函数处理,不把含 &、? 的用户文本直接拼成 URL。URL 解析与编码
2. 从主机名到响应数据
访问普通网站时,客户端先解析主机地址,建立连接;HTTPS 在连接中使用 TLS 保护传输,再交换 HTTP 消息。本地例子直接使用 127.0.0.1,便于把注意力放在请求和响应上。
URL 的路径不是必然对应服务器磁盘上的文件。/api/books/1 可以由程序查询数据库后生成 JSON;#intro 则留给客户端,不进入本例服务器看到的请求路径。