首页 > 编程语言 >【python模块】Http.client

【python模块】Http.client

时间:2024-07-20 11:53:56浏览次数:13  
标签:status http python client import Http response conn

文章目录


Http.client介绍

http.client 是 Python 标准库中的一个模块,它提供了一个低级别的接口来发送 HTTP 请求和接收响应。这个模块主要针对 HTTP 协议的实现,并且可以用于创建更复杂的 HTTP 客户端。

基本用法

http.client 模块允许你发送各种 HTTP 请求,包括 GET, POST, PUT, DELETE 等。下面是每种请求类型的基本用法:

  • GET 请求

GET 请求用于从服务器检索信息。使用 http.client 发送 GET 请求的基本步骤如下:

import http.client

# 创建连接
conn = http.client.HTTPSConnection("www.example.com")

# 发送 GET 请求
conn.request("GET", "/resource")

# 获取响应
response = conn.getresponse()

# 检查状态码
if response.status == 200:
    # 成功
    data = response.read()
    print(data.decode("utf-8"))
else:
    print(f"Failed with status {response.status}")

# 关闭连接
conn.close()
  • POST 请求

POST 请求用于向服务器发送数据。这里是一个发送 POST 请求的例子:

import http.client
import json

# 创建连接
conn = http.client.HTTPSConnection("www.example.com")

# 构建请求体
payload = {
    "key1": "value1",
    "key2": "value2"
}
headers = {
    "Content-Type": "application/json"
}

# 发送 POST 请求
conn.request("POST", "/resource", body=json.dumps(payload), headers=headers)

# 获取响应
response = conn.getresponse()

# 检查状态码
if response.status == 200:
    # 成功
    data = response.read()
    print(data.decode("utf-8"))
else:
    print(f"Failed with status {response.status}")

# 关闭连接
conn.close()
  • PUT 请求

PUT 请求用于更新服务器上的资源。以下是使用 http.client 发送 PUT 请求的示例:

import http.client
import json

# 创建连接
conn = http.client.HTTPSConnection("www.example.com")

# 构建请求体
payload = {
    "key1": "new_value1",
    "key2": "new_value2"
}
headers = {
    "Content-Type": "application/json"
}

# 发送 PUT 请求
conn.request("PUT", "/resource", body=json.dumps(payload), headers=headers)

# 获取响应
response = conn.getresponse()

# 检查状态码
if response.status == 200:
    # 成功
    data = response.read()
    print(data.decode("utf-8"))
else:
    print(f"Failed with status {response.status}")

# 关闭连接
conn.close()
  • DELETE 请求

DELETE 请求用于删除服务器上的资源。以下是如何使用 http.client 发送 DELETE 请求:

import http.client

# 创建连接
conn = http.client.HTTPSConnection("www.example.com")

# 发送 DELETE 请求
conn.request("DELETE", "/resource")

# 获取响应
response = conn.getresponse()

# 检查状态码
if response.status == 200:
    # 成功
    data = response.read()
    print(data.decode("utf-8"))
else:
    print(f"Failed with status {response.status}")

# 关闭连接
conn.close()

在所有这些示例中,我们首先创建了一个 http.client.HTTPSConnectionhttp.client.HTTPConnection 对象来与服务器建立连接。然后,我们调用 request 方法来发送特定类型的 HTTP 请求。最后,我们通过 getresponse 方法获取服务器的响应,并检查状态码以判断请求是否成功。

高级用法

以下是一些使用 http.client 的高级用法:

  • 自定义 HTTP 方法

虽然 http.client 默认支持 GET, POST, PUT, DELETE 等方法,但你可以自定义任何合法的 HTTP 方法:

import http.client

conn = http.client.HTTPConnection("www.example.com")
conn.request("CUSTOM_METHOD", "/path", headers={})
response = conn.getresponse()
  • 处理 HTTP 错误
import http.client

try:
    conn = http.client.HTTPConnection("www.example.com")
    conn.request("GET", "/non-existent-page")
    response = conn.getresponse()
    response.raise_for_status()  # 如果响应状态不是 200,将抛出异常
except http.client.HTTPException as e:
    print(f"An error occurred: {e}")
finally:
    conn.close()
  • 处理重定向

http.client 默认不会自动处理重定向。如果你需要处理重定向,可以手动检查响应状态码并重新发送请求:

import http.client

conn = http.client.HTTPConnection("www.example.com")
conn.request("GET", "/redirected_page")

response = conn.getresponse()
while response.status // 100 == 3:  # HTTP 3xx is a redirect status code
    location = response.getheader("Location")
    conn.request("GET", location)
    response = conn.getresponse()

print(response.read())
  • 使用代理

要通过代理服务器发送请求,可以设置 tunnel 方法:

import http.client

conn = http.client.HTTPConnection("proxy.example.com:8080")
conn.set_tunnel("www.example.com")

conn.request("GET", "/")
response = conn.getresponse()
print(response.read())
  • 设置超时时间

http.client 允许设置连接和读取超时:

import http.client

conn = http.client.HTTPConnection("www.example.com", timeout=10)  # 设置连接超时为10秒
conn.request("GET", "/")
response = conn.getresponse()
response.read(1024)  # 可以设置读取超时,但需要使用socket的settimeout方法
  • 发送分块编码的数据

在发送大量数据时,可以使用分块编码(Chunked Transfer Encoding):

import http.client

conn = http.client.HTTPConnection("www.example.com")
conn.putrequest("POST", "/")
conn.putheader("Transfer-Encoding", "chunked")
conn.endheaders()

# 发送数据
data = b"This is chunk 1\nThis is chunk 2"
for chunk in data.split(b'\n'):
    conn.send(f"{len(chunk):x}\r\n".encode())  # 发送块大小
    conn.send(chunk + b"\r\n")  # 发送块数据
conn.send(b"0\r\n\r\n")  # 表示数据结束

response = conn.getresponse()
print(response.read())
  • 发送 multipart/form-data 数据

当上传文件时,通常会使用这种编码格式:

import http.client
import mimetypes
from io import BytesIO

def encode_multipart_formdata(fields, files):
    boundary = '----------ThIs_Is_tHe_bouNdaRY_$'
    crlf = '\r\n'
    l = []

    for (key, value) in fields.items():
        l.append('--' + boundary)
        l.append('Content-Disposition: form-data; name="%s"' % key)
        l.append('')
        l.append(value)

    for (filename, value) in files.items():
        l.append('--' + boundary)
        l.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (filename, filename))
        l.append('Content-Type: %s' % get_content_type(filename))
        l.append('')
        l.append(value.read())

    l.append('--' + boundary + '--')
    l.append('')
    body = crlf.join(l)
    content_type = 'multipart/form-data; boundary=%s' % boundary
    return content_type, body

def get_content_type(filename):
    return mimetypes.guess_type(filename)[0] or 'application/octet-stream'

fields = {'title': 'Test file'}
files = {'file': BytesIO(b'This is the content of the file')}

content_type, body = encode_multipart_formdata(fields, files)

conn = http.client.HTTPConnection("www.example.com")
conn.request("POST", "/upload", body, {'Content-Type': content_type})
response = conn.getresponse()
print(response.read())

天雨粟,夜鬼哭。

标签:status,http,python,client,import,Http,response,conn
From: https://blog.csdn.net/LongL_GuYu/article/details/140135097

相关文章

  • 掌握Python中的文件序列化:Json和Pickle模块解析
    Python文件操作与管理:Open函数、Json与Pickle、Os模块在Python中,文件是一个重要的数据处理对象。无论是读取数据、保存数据还是进行数据处理,文件操作都是Python编程中不可或缺的一部分。本文将详细介绍Python中文件操作的几种常用方法,包括open函数的使用、数据序列化与反......
  • PYTHON学习笔记(六、python数据结构--字典)
    (3)dict字典字典数据类型的含义是:根据一个信息查找另一个信息的方式构成了“键值对”,它表示索引用的键和对应的值构成对应的关系。1、字典的创建方式1)使用{ }直接创建字典使用{ }创建字典的语法结构如下:d={key1:value1,key2:value2......}例如:#使用{}创建字典d=......
  • Python 爬虫技术 第01节 引言
    引言网络爬虫的概念和重要性网络爬虫(WebCrawler),也称为网络蜘蛛(WebSpider)或机器人(Bot),是一种自动浏览互联网并收集信息的程序。它们按照一定的规则,从一个网页链接到另一个网页,遍历整个网络,抓取所需的数据或信息。网络爬虫是搜索引擎、数据分析、市场研究、新闻聚合、学术......
  • 彩色文本,Python print() 居然还能这样玩?
    大家好,在学习Python编程的过程中,我们习惯于使用print()函数来输出文本。然而,许多人不知道的是,print()函数不仅能输出普通的黑白文本,还能输出彩色文本。原理终端与ANSI转义序列在深入代码之前,我们需要了解一些基础知识。终端(Terminal)是我们与操作系统交互的重要工具,而......
  • 简单python游戏开发,使用Pyglet创建你的第一个游戏
    更多高质量Python、副业教程记得关注公众号【软件测试圈】你是否想过用Python编写一个小游戏或者一个图形化应用?Pyglet可能就是你所需要的工具。Pyglet是一个强大的Python库,它允许你创建跨平台的多媒体应用程序。什么是Pyglet?Pyglet是一个Python库,用于编写跨平台的多......
  • 十天学会Python——第9天:多任务编程与网络编程
    1进程与线程1.1多进程基础并发:一段时间内交替执行多个任务(任务数量大于CPU核心数)**并行**:一段时间内同时一起执行多个任务(任务数量小于或等于CPU核心数)进程:资源分配的最小单位,操作系统进行资源分配和调度运行的基本单位,一个正在运行的程序就是一个进程进程的创建步骤......
  • 尖刺花朵 彩 Python
    importturtleasts=133t.speed(0)qa=0h=['red','yellow','green','black','pink','orange','brown']foriinrange(99999999999999999999999):  t.fillcolor(h[s%7])  ifi%3==2:   ......
  • python-最小公倍数(PythonTip)
    [题目描述]编写一个程序,找出能被从1到给定数字n(包括n)的所有数字整除的最小正数(即最小公倍数)。定义函数smallest_multiple()的函数,参数为n。在函数内,返回能被从1到给定数字n(包括n)的所有数字整除而无余数的最小正数。示例输入:5示例输出:60比如,对于输入5,最小公倍数是60,因为......
  • 解决IDEA自带的Maven 3.9.x无法刷新HTTP Nexus私服的问题
    解决IDEA自带的Maven3.9.x无法刷新HTTPNexus私服的问题前言在日常开发中,我们经常会使用Maven来管理项目的依赖。而Nexus私服则是一个常用的Maven仓库管理工具,可以帮助我们更好地管理和分发项目的依赖。然而,有时候我们会遇到一些棘手的问题,比如在使用IDEA自带的Maven3.9.x时,无......
  • Python和pycharm的环境安装
    1.Python的安装方法一、Python的官网下载地址:https://www.python.org/downloads/   下载安装方法二、anaconda安装(开源的Python发行版本)下载版本列表:https://repo.anaconda.com/archive/重要说明:如果你下载最近版本安装的过程中出现:failedtoextractpackages弹窗提......