http header 设置编码_【译】http.client

59216483e11f3fad82194e467ba6ee6c.png

本模块实现了HTTP和HTTPS协议的客户端功能。通常本模块不会被直接使用,而是被urllib.request调用,来处理HTTP和HTTPS相关的URL。

备注:HTTPS只有在支持SSL(带有ssl模块)的Python编译器里面才是可用的。

(一)

模块提供的类

class http.client.HTTPConnection(host, port=None, [timeout, ]source_address=None, blocksize=8192)

一个HTTPConnection实例表示和HTTP服务器的一次交互。实例化时,需要一个host和一个可选的port作为入参。在没有提供入参port的情况下,首先尝试判断host是不是符合host:port的格式:如果是,就从入参host中解析port;如果不是,此时会使用默认的80端口。如果可选的入参timeout有值,像建立连接之类的操作会在阻塞若干秒之后超时退出(如果没有显式的传递timeout,此时会使用系统默认的超时配置)。可选入参source_address可以是(host,port)形式的tuple,用来指定建立HTTP连接的时候使用的源地址。可选入参blocksize,用来指定发送消息体的缓冲区大小。

举个例子,下面的几个实例都是指向同一个服务器的同一个端口。

>>> h1 = http.client.HTTPConnection('www.python.org')>>> h2 = http.client.HTTPConnection('www.python.org:80')>>> h3 = http.client.HTTPConnection('www.python.org', 80)>>> h4 = http.client.HTTPConnection('www.python.org', 80, timeout=10)

class http.client.HTTPSConnection(host, port=None, key_file=None, cert_file=None, [timeout, ]source_address=None, *, context=None, check_hostname=None, blocksize=8192)

HTTPConnection的子类,使用SSL和安全服务器通信。缺省的port是443。如果指定入参context,它必须是能够描述不同SSL选项的ssl.SSLContext实例。

class http.client.HTTPResponse(sock, debuglevel=0, method=None, url=None)

该类会连接有响应的时候自动实例化,不需要用户直接实例化。

(二)

模块提供的函数

http.client.parse_headers(fp)

用来解析文件描述符中的请求头或者响应头信息。描述符指向的文件必须是可读的BufferedIOBase(而不是文本文件),而且必须满足RFC 2822规定的头部样式。

本函数返回一个 http.client.HTTPMessage 实例,里面包含头部信息,但是没有请求体或者响应体(和HTTPResponse.msg以及http.server.BaseHTTPRequestHandler.headers类似)。当函数返回之后,文件描述符还可以继续读取HTTP消息实体。

备注:parse_headers()并不能够解析HTTP消息里面的请求行或者响应行,它只能够解析name:value形式的头部信息。在调用之前,需要确保文件描述符的首行消息已经被读取完毕。

(三)

HTTPConnection Objects

HTTPConnection.request(methodurlbody=Noneheaders={}*encode_chunked=False)

调用本方法将会使用入参指定的method和url,发送一条HTTP请求到服务器。

如果指定入参body,body的数据会在发送完请求头之后发送。它可以是str类型、类bytes的对象、一个打开的文件对象,或者一个可迭代的bytes。如果body为字符串,它会被ISO-8859-1规范(HTTP默认规范)编码。如果body是类bytes对象,它会被直接发送。如果body是一个文件对象,要求该文件对象可读,如果文件对象是一个io.TextIOBase实例,调用read()返回的数据会通过ISO-8859-1规范编码之后再发送,其他情况下会文件数据被直接发送。如果body是一个可迭代对象,里面的所有数据都会被发送出去。

入参headers要求是一个映射对象,里面有想要发送给服务器的请求头信息。

在发送请求体的时候,如果headers里面没有Content-Length 也没有 Transfer-Encoding,它俩的其中之一会被自动添加。在要求有请求体的请求方法(PUT、POST、PATCH)中,如果请求体为空,Content-Length会被设为0。如果body是一个字符串或者类bytes对象,Content-Length会被设置为body的长度;其他情况下(body为文件对象或者可迭代对象),请求会被分块,自动设置实际的Transfer-Encoding,而不会使用Content-Length。

入参encode_chunked只有在headers里面包含Transfer-Encoding时才会被用到。如果encode_chunked为False,HTTPConnection对象会认为本次调用包含了全部的数据。如果encode_chunked为True,请求体会被分块。

备注:分块传输是HTTP/1.1添加的特性。如果服务器不支持HTTP/1.1,调用方要么指定Content-Length,要么需要将body指定为str类型或者类bytes对象。

HTTPConnection.getresponse()

本方法需要在发送完请求之后调用,来获取响应信息。其返回值为HTTPResponse实例。

备注:你需要在发送下一个请求之前,确保已经读取完毕所有的响应信息。

HTTPConnection.set_debuglevel(level)

本方法用来设置调试级别。默认的调试级别为0,即所有的调试输出都不会被打印。任何大于0的值,都会触发响应的调试级别,将调试信息打印到标准输出。调试级别会被随后创建的HTTPResponse实例继承。

HTTPConnection.set_tunnel(host, port=None, headers=None)

在使用HTTP连接隧道时,指定host和port。这样是为了能够使用代理连接。

host和port指定了连接的端点信息(即请求的服务器地址,而不是代理的地址)

举个例子,为了使用在本地8080端口运行的HTTPS代理服务,可以将代理地址传递给HTTPSConnection,然后调用set_tunnel()来指定真实的服务器地址。

>>> import http.client>>> conn = http.client.HTTPSConnection("localhost", 8080)>>> conn.set_tunnel("www.python.org")>>> conn.request("HEAD","/index.html")

HTTPConnection.connect()

用来建立和服务器的连接。默认情况下,如果客户端没有建立连接,该方法会在请求的时会被自动被调用。

HTTPConnection.close()

关闭同服务器的连接。

HTTPConnection.blocksize

发送类文件消息时的缓冲区大小。

除了可以调用上面提到的request()方法,你也可以使用下面的四个方法,一步步的发送你的请求。

HTTPConnection.putrequest(methodurlskip_host=Falseskip_accept_encoding=False)

同服务器建立连接后,本方法应该第一个被调用。它会发送一个包含method、url以及HTTP版本(HTTP/1.1)的请求行。如果想要禁用自动发送的Host和Accpet-Encoding请求头,可以为skip_host和skip_accept_encoding指定一个不是False的值。

HTTPConnection.putheader(header, argument[,...])

本方法用来向服务器发送请求体,要求请求体符合RFC 822规范。它会发送一行包含header、一个冒号、一个空格以及第一个argument的请求头信息。如果argument有多个入参,请求消息的下一行会包含一个制表符和一个argument。

HTTPConnection.endheaders(message_body=None, *, encode_chunked=False)

向服务器发送一个空行,标识请求头的结束。可选的入参message_body用来向请求消息中添加请求体。

如果encode_chunked为True,每个消息体会被按照RFC 7230规范( 3.3.1章节)分块。如何编码请求数据会根据message_body的类型来确定。如果message_body实现了python的buffer接口规范,编码后的消息会是一个单独的块。如果message_body是一个文件对象,每次调用read()读取的数据都是一个块。本方法会在message_body结束的时候自动在分块消息中添加结束信息。

备注:因为分块编码的特殊性,空块会被忽略。这是为了避免服务器因为畸形的编码提前结束对请求数据的接收。

HTTPConnection.send(data)

发送数据给服务器。注意要在endheaders()方法被调用之后,getresponse()方法被调用之前调用本方法。

(四)

HTTPResponse Objects

一个HTTPResponse实例带有服务器的响应信息。也可以用它来查看请求头和请求体的数据。响应对象是一个可迭代对象。

HTTPResponse.read([amt])

读取并返回响应体数据,也可以跳转至指定的amt字节处。

HTTPResponse.readinto(b)

读取len(b)字节的数据并将其写入b。返回读取的字节长度。

HTTPResponse.getheader(namedefault=None)

返回指定name的响应头内容,如果没有该响应体返回default值。如果响应头中有多个name头,其返回值以“,”连接。如果default不是单个字符串,而是可迭代对象,其返回值也会通过逗号连接。

HTTPResponse.getheaders()

返回一个列表,里面包含了(header,value)形式的tuple。

HTTPResponse.fileno()

返回套接字的描述符编号

HTTPResponse.msg

http.client.HTTPMessage的实例,里面包含了响应体。http.client.HTTPMessageemail.message.Message的子类。

HTTPResponse.version

服务器使用HTTP协议版本。10代表HTTP/1.0,11代表HTTP/1.1

HTTPResponse.status

服务器返回的状态码

HTTPResponse.reason

服务器返回的状态信息

HTTPResponse.debuglevel

一个调试钩子。如果调试级别高于0,读取和解析响应数据时的调试消息会被打印在标准输出。

HTTPResponse.closed

如果连接关闭返回True。

(五)

演示示例

下面是一个GET请求的演示:

>>> import http.client>>> conn = http.client.HTTPSConnection("www.python.org")>>> conn.request("GET", "/")>>> r1 = conn.getresponse()>>> print(r1.status, r1.reason)200 OK>>> data1 = r1.read()  # This will return entire content.>>> # The following example demonstrates reading data in chunks.>>> conn.request("GET", "/")>>> r1 = conn.getresponse()>>> while chunk := r1.read(200):...     print(repr(chunk))b'\n

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/561000.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

diskgenius linux 分区,DiskGenius怎么分区,DiskGenius分区教程

DiskGenius分区教程方法一:一、首先,打开DiskGenius软件并单击以选择要操作的硬盘驱动器。二、然后右键单击“快速分区”按钮并单击“确定”。方法2:三、选择要操作的硬盘,单击软件上方的硬盘按钮,单击下面列中的快速分…

sql server management studio性能分析_如何分析一条SQL的性能

来自公众号:谭小谭这篇文章将给大家介绍如何使用 explain 来分析一条 sql 。网上其实已经有非常多的文章都很详细的介绍了 explain 的使用,这篇文章将实例和原理结合起来,尽量让你有更好的理解,相信我,认真看完你应该会…

编译运行linux0.12,linux0.12 编译过程

感谢这篇文章的作者: http://www.cnblogs.com/strugglesometimes/p/4231359.html编译是个很蛋疼的事情,本想把linux0.12在bochs上跑起来然后就可以各模块的学习,没想各种问题。问题1:1 gas -c -o boot/head.o boot/head.s2 mak…

编译linux tq2440,QT4.8.2在TQ2440开发板上的移植(一)--编译和安装

主机版本:Ubuntu 11.04交叉编译器版本:4.3.3移植的主要工作就是编译在ARM板上运行的qt库,并且把这些库做到根目录中。需要的文件tslib-1.4.tar.gz qt-everywhere-opensource-src-4.8.2.tar.gz具体步骤如下:1、首先编译安装触摸屏驱…

图书管理系统_目前图书管理系统存在的问题

作者:新风学术网(一) 不能准确直观地指明图书所在的空间位置目前所使用的管理系统在索书的过程中是读者先在图书馆查询系统上查询到所要借的图书并记录下这本书的索书号和馆藏地, 再根据索书号到书的馆藏地所在位置查找书。有些读者对索书号是怎么排架的并不了解, 也…

(dp)数字三角形

题目方案1:递归方案二:递推 题目 数字三角形问题。有一个由非负整数组成的三角形,第一行只有一个数,除了最下行 之外每个数的左下方和右下方各有一个数 从第一行的数开始,每次可以往左下或右下走一格,直…

mfc tabcontrol 修改白色背景_初级会计报名准备工作如何使用美图秀秀PC版修改照片尺寸、格式、大小...

点击上方蓝字关注我们证件照是我们生活中常用的东西,大学考证需要证件照,制作简历也需要用到证件照,工作有时也需要用到,然而最让我们头疼的是每次报名证件照的要求都不一样,其中底色和尺寸是经常需要修改的&#xff0…

分步表单_表单设计-掌握表单设计方法(表单体验篇)

全篇阅读大概需要15min,对表单设计不熟悉的同学看完后肯定会有不少的收获~~~说到表单其实在生活中可以接触到各种各样的表单,比如:驾照申请表、体检表、银行开户需要填写的表等等,这些都是表单,主要目的就是让用户填写…

4)lsof linux命令,***Linux命令实时监测系统(top,htop,iotop,lsof,tcpdump,netstat,vmstat,iostat)...

摘要:本文总结了8个非常实用的Linux命令行性能监测工具,这些命令支持所有的Linux系统,不仅可以用于监控系统,还可以发现导致性能问题的原因所在。对每个系统/网络管理员来说,每天监测Linux系统性能是一项非常艰巨的任务…

算法竞赛入门经典 第七章 总结

目录: 7.1 简单枚举7.2 枚举排列7.3 子集生成 7.1 简单枚举 例题7-1 除法(Division, UVa 725) 输入正整数n,按从小到大的顺序输出所有形如abcde/fghij n的表达式,其中a~j恰好 为数字0&#xff5e…

线性表总结

线性表及其实现多项式的表示什么是线性表线性表的抽象数据类型描述线性表的顺序存储实现线性表的链式存储实现 线性表及其实现 多项式的表示 [例] 一元多项式及其运算 一元多项式 : 主要运算:多项式相加、相减、相乘等 【分析】如何表示多项式?…

mix2s android p功能,已升安卓P!网友:MIX2S才是亲儿子

原标题:已升安卓P!网友:MIX2S才是亲儿子一直以来,小米在手机系统更新上都有着非常明显的优势,MIUI经过了多年的更新迭代,如今已经达到了非常不错的易用性,而且流畅度方面的表现更是优秀。如今小…

堆栈总结

堆栈什么是堆栈堆栈的抽象数据类型描述栈的顺序存储实现 堆栈 什么是堆栈 计算机如何进行表达式求值? 算术表达式56/2-3*4。 正确理解: 56/2-3*4 53-3*4 8-3*4 8-12 -4 由两类对象构成的: 运算数,如2、3、4 运算符号…

harmonyos公测招募,nova为主 HarmonyOS 2.0开发者Beta公测再招募

原标题:nova为主 HarmonyOS 2.0开发者Beta公测再招募HarmonyOS 2.0开发者Beta公测招募将开启第二期,本次公测活动主要针对的机型是华为nova系列。活动报名时间为5月9日-5月17日。【PChome手机频道资讯报道】华为方面在4月份开启了HarmonyOS 2.0开发者Bet…

队列总结

什么是队列 队列(Queue):具有一定操作约束的线性表 插入和删除操作:只能在一端插入,而在另一端删除 数据插入:入队列(AddQ) 数据删除:出队列(DeleteQ) 先来先服务 先…

D P- 免费馅饼

题目 都说天上不会掉馅饼,但有一天gameboy正走在回家的小径上,忽然天上掉下大把大把的馅饼。说来gameboy的人品实在是太好了,这馅饼别处都不掉,就掉落在他身旁的10米范围内。馅饼如果掉在了地上当然就不能吃了,所以ga…

一加桌面3.0 android8,一加手机XRemix6.0安卓8.1.0Beta2.0定制本地化增强适配归属农历等...

制作者:moonlight-roms基于版本:remix最新安卓8.1.0代码适合机型:一加手机X双网版/全网通版/E1001/E1003等/onyx注意事项:1.开机后语言设置:Settings-system-languageandinput-添加一个中文需要并拖动到第一行设置为默…

震惊!Fibonacci Again

题目 There are another kind of Fibonacci numbers: F(0) 7, F(1) 11, F(n) F(n-1) F(n-2) (n>2). Input Input consists of a sequence of lines, each containing an integer n. (n < 1,000,000). Output Print the word “yes” if 3 divide evenly into …

华为鸿蒙手机和电视通话,鸿蒙智慧屏首秀:逾10万人预定,电视视频通话功能强大...

原标题&#xff1a;鸿蒙智慧屏首秀&#xff1a;逾10万人预定&#xff0c;电视视频通话功能强大上周五&#xff0c;大家期待已经的华为开发者大会正式召开&#xff0c;华为鸿蒙系统在这一天对外发布。历时数年&#xff0c;经过几千人的研发&#xff0c;终于正式落地。曾经&#…

两文本一图片android,Android富文本编辑器(二):图文混排以及图片上传处理

对于一个富文本编辑器来说&#xff0c;图文混排是最基本的功能。而从上一篇文章中我们知道图文混排需要使用ImageSpan。下面这段代码摘自我的RichEditText源码&#xff1a;/*** 添加图片* param filePath 图片文件路径*/public void addImage(String filePath) {SpannableStrin…