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:三、选择要操作的硬盘,单击软件上方的硬盘按钮,单击下面列中的快速分…

new

动态内存分配 用new运算符实现动态内存分配 动态内存分配分配一个变量分配一个数组new运算符返回值类型释放动态分配出来的内存空间动态分配指针数组 分配一个变量 pnew t; t是任意类型名,p为类型为t*的指针。 动态分配出一片大小为sizeof(t)字节的内存空间&a…

linux系统ip占用,IP地址被占用的问题,折腾我好几天了 (已解决)

原因找到了,另外一台机器的网卡上面不知道怎么绑定了两个IP地址eth0 Link encap:Ethernet HWaddr 00:20:ED:1A:62:7Einet addr:192.168.0.104 Bcast:192.168.0.255 Mask:255.255.255.0inet6 addr: fe80::220:edff:fe1a:627e/64 Scope:LinkUP BROADCAST RUNN…

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

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

malloc动态分配数组以及指针数组大小

对于二维数组&#xff1a;一般来说&#xff0c;当给两个数分别表示行列&#xff0c;但两个数的范围过大&#xff0c;就需要动态分配。 int i,j,m,n;scanf("%d%d",&m,&n);int **a;a(int**)malloc(sizeof(int*)*m);for(i0;i<m;i)a[i](int *)malloc(sizeof(i…

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

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

不用数组,解决众数问题(前提 :众数出现的次数必须大于n/2)

内存限制4mb 用数组不通过&#xff0c;怎么办&#xff1f; 众数出现的次数必须大于n/2 第一行输入一个整数n &#xff08;1<n<1E6) 接下来一行n个整数 mi &#xff08;1<MI<1E9) 表示第i种糖果的个数&#xff0c;整数之间用空格隔开 输出mi中出现次数最多的那…

高考python必考题目_假如高考考python编程,这些题目你会几个呢?

Python(发音&#xff1a;英[?pa?θ?n]&#xff0c;美[?pa?θɑ:n])&#xff0c;是一种面向对象、直译式电脑编程语言&#xff0c;也是一种功能强大的通用型语言&#xff0c;已经具有近二十年的发展历史&#xff0c;成熟且稳定。它包含了一组完善而且容易理解的标准库&…

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

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

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

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

python怎么计算图像梯度_opencv python图像梯度实例详解

这篇文章主要介绍了opencv python图像梯度实例详解,文中通过示例代码介绍的非常详细&#xff0c;对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下一阶导数与Soble算子二阶导数与拉普拉斯算子图像边缘&#xff1a;Soble算子&#xff1a;二阶导数&#xff1a;拉…

vector简单应用

输出vector中元素&#xff0c;以及插入删除元素 #include<iostream> #include<vector> using namespace std; template<class T> void printvector(T s,T e)//输出vector元素 {for(; s!e; s)cout<<*s<<" ";cout<<endl; } int …

Linux ct获取本机ip,linux ip命令

ip 是个命令&#xff0c; ip 命令的功能很多&#xff01;基本上它整合了 ifconfig 与 route 这两个命令&#xff0c;不过ip 的功能更强大&#xff01;如果您有兴趣的话&#xff0c;请自行 vi /sbin/ifup 就知道整个 ifup 就是利用 ip这个命令来实现的。下面介绍一下使用方法[ro…

linux errno的作用域,关于比特科技c语言的学习博客(1)

写代码1创建工程2创建路径3创建源文件4写代码写c代码时.c文件是源文件.h是头文件写helloworld时return 0记得中间敲空格 main是主函数从main开始执行也是程序的入口有且仅有一个int是整型的意思main前的int表示main函数调用返回一个整型值void main已经过时#include 包含一个叫…

python o创建文件_Python 文件I/O

模块让你能够有逻辑地组织你的Python代码段。把相关的代码分配到一个 模块里能让你的代码更好用&#xff0c;更易懂。模块也是Python对象&#xff0c;具有随机的名字属性用来绑定或引用。简单地说&#xff0c;模块就是一个保存了Python代码的文件。模块能定义函数&#xff0c;类…

函数对象应用

计算几个数的n次方和 #include<iostream> #include<vector> #include<algorithm> #include<numeric> #include<functional> using namespace std; int sumsquares(int total, int value) {return totalvalue*value; }template<class T>//…

C语言中各字母对应的数值,C语言中字符串与各数值类型之间的转换方法

C语言的算法设计中&#xff0c;经常会需要用到字符串&#xff0c;而由于c语言中字符串并不是一个默认类型&#xff0c;其标准库stdlib设计了很多函数方便我们处理字符串与其他数值类型之间的转换。首先放上一段展示各函数使用的代码&#xff0c;大家也可以copy到自己的机器上运…

web服务面试python_Python面试重点(web篇)

写出常用的bootstrap的样式。导航栏,表单,轮播图,下拉菜单什么是响应式布局&#xff1f;响应式布局就是一个网站能够兼容多个终端,而不是为每个终端做一个特定的版本.优点:灵活性强,能解决多设备显示问题缺点:不兼容所有浏览器,一定程度改变布局结构请通过jQuery发送ajax请求。…

linux下的扑克游戏,linux下多线程扑克游戏框架.doc

linux下多线程扑克游戏框架linux下多线程扑克游戏框架/**rc.c*文件描述&#xff1a;*1)提供了linux下“升级”(北方常见的一种扑克玩法)游戏的框架。*2)库&#xff1a;glibc2.15&#xff1b;编译环境&#xff1a;gcc4.7.2;内核&#xff1a;3.8.4* 3) 编译&#xff1a;gcc -pthr…