httpcore,一个好用的 Python 库!

内存泄漏者
• 阅读 165

大家好,我是涛哥,本文内容来自 涛哥聊Python ,转载请标原创。

今天为大家分享一个好用的 Python 库 - httpcore

Github地址:https://github.com/encode/httpcore


httpcore库是一个提供异步HTTP客户端和服务器功能的底层库,它是许多高级HTTP客户端库的基础,如httpx。httpcore旨在提供一个快速、稳定且易于使用的HTTP组件。

安装

通过pip可以轻松安装httpcore:

pip install httpcore

特性

  • 异步支持:原生支持异步操作,提高I/O效率。
  • HTTP/1.1和HTTP/2支持:同时支持HTTP/1.1和HTTP/2协议。
  • 连接池管理:自动管理连接池,复用连接以提高性能。
  • 低级请求/响应接口:提供底层的请求/响应接口,给予使用者更多的控制权。

基本功能

httpcore库提供了执行HTTP请求和接收响应的基础功能,这包括创建连接、发送请求以及处理响应等。

发送请求

使用httpcore可以发送HTTP请求,并获取响应。它支持同步和异步两种操作方式。

发送一个简单的GET请求并获取响应:

import httpcore

# 创建一个同步HTTP连接
with httpcore.SyncConnectionPool() as http:
    # 定义请求方法、URL和头部
    method = b'GET'
    url = (b'http', b'example.com', None, b'/')
    headers = [(b'host', b'example.com')]

    # 发送请求并接收响应
    response = http.request(method, url, headers=headers)

    # 解包响应数据
    http_version, status_code, reason_phrase, headers, stream = response
    
    # 读取响应体
    body = b''.join([chunk for chunk in stream])
    
    print(f'Status code: {status_code}')
    print(f'Body: {body.decode("utf-8")}')

处理响应

httpcore处理响应的方式是通过返回一个响应对象,该对象包含响应的所有相关信息,包括状态码、头部以及响应体。

使用httpcore异步发送请求并处理响应:

import httpcore
import asyncio

async def main():
    # 创建一个异步HTTP连接
    async with httpcore.AsyncConnectionPool() as http:
        method = b'GET'
        url = (b'http', b'example.com', None, b'/')
        headers = [(b'host', b'example.com')]

        # 异步发送请求并接收响应
        response = await http.request(method, url, headers=headers)

        http_version, status_code, reason_phrase, headers, stream = response
        
        # 异步读取响应体
        body = b''.join([chunk async for chunk in stream])
        
        print(f'Status code: {status_code}')
        print(f'Body: {body.decode("utf-8")}')

# 运行异步事件循环
asyncio.run(main())

高级功能

httpcore提供的高级功能使得HTTP请求处理更加灵活和强大,包括流式传输、连接池管理、HTTP/2支持等。

流式传输

httpcore支持流式传输,允许逐块处理请求和响应体,适用于处理大文件或实时数据流。

使用httpcore进行流式上传,可以逐块发送大文件,避免内存溢出:

import httpcore

def read_file_in_chunks(file_path, chunk_size=1024*1024):
    with open(file_path, 'rb') as file:
        while True:
            chunk = file.read(chunk_size)
            if not chunk:
                break
            yield chunk

# 假设有一个大文件需要上传
file_path = 'large_file.dat'

with httpcore.SyncConnectionPool() as http:
    method = b'POST'
    url = (b'http', b'example.com', None, b'/upload')
    headers = [(b'host', b'example.com')]
    content = read_file_in_chunks(file_path)

    # 使用流式上传
    http_version, status_code, reason_phrase, headers, stream = http.request(
        method, url, headers=headers, content=content
    )
    
    print(f'Status code: {status_code}')

连接池管理

httpcore自动管理连接池,支持连接复用,提高了HTTP请求的效率。

httpcore默认使用连接池,无需手动配置,以下是一个基本的使用示例:

import httpcore

with httpcore.SyncConnectionPool() as http:
    response = http.request(b'GET', (b'http', b'example.com', None, b'/'))
    # 连接池会自动管理这个请求的连接

HTTP/2支持

httpcore支持HTTP/2协议,可以提高传输效率,减少延迟。

启用HTTP/2进行请求:

import httpcore

# 创建支持HTTP/2的连接
with httpcore.SyncConnectionPool(http2=True) as http:
    response = http.request(b'GET', (b'http', b'example.com', None, b'/'))
    # 这个请求将尝试使用HTTP/2

实际应用场景

httpcore作为一个低级HTTP库,它的应用场景广泛而多样,特别适合需要精细控制HTTP请求和响应的高级用途。

构建RESTful API客户端

开发者可以利用httpcore构建专用的RESTful API客户端,以实现与远程服务的高效交互。

构建一个简单的API客户端来获取数据:

import httpcore

def get_api_data(endpoint):
    with httpcore.SyncConnectionPool() as http:
        response = http.request(b'GET', (b'http', b'api.example.com', None, endpoint))
        status_code, headers, stream = response[1:]
        if status_code == 200:
            body = b''.join(stream)
            return body.decode('utf-8')
        else:
            return f'Error: {status_code}'

# 获取API数据
data = get_api_data(b'/data')
print(data)

这个函数使用httpcore直接与RESTful API通信,获取并返回所需的数据。

实时数据流处理

对于需要处理实时数据流的应用,比如股票行情、实时监控等,httpcore的流式传输功能非常适用。

处理实时数据流:

import httpcore

with httpcore.SyncConnectionPool() as http:
    method = b'GET'
    url = (b'http', b'stream.example.com', None, b'/live')
    http_version, status_code, reason_phrase, headers, stream = http.request(
        method, url
    )
    
    if status_code == 200:
        for chunk in stream:
            process_data(chunk)

这个示例中,httpcore被用于连接到一个实时数据流接口,逐块处理接收到的数据。

微服务架构中的通信

在微服务架构中,各个服务之间经常需要进行HTTP通信,httpcore可以作为构建微服务通信基础的库。

微服务之间使用HTTP进行通信:

import httpcore

def send_service_request(service_url, payload):
    with httpcore.SyncConnectionPool() as http:
        method = b'POST'
        url = (b'http', service_url, None, b'/endpoint')
        headers = [(b'Content-Type', b'application/json')]
        body = json.dumps(payload).encode('utf-8')
        
        response = http.request(method, url, headers=headers, content=body)
        return response

# 向其他微服务发送请求
response = send_service_request(b'microservice.example.com', {'key': 'value'})

在这个场景中,httpcore用于在微服务之间发送HTTP请求和处理响应,实现服务间的通信。

总结

httpcore库为Python提供了强大的底层HTTP通信能力,支持同步和异步操作,适用于构建高性能的HTTP客户端和服务器。它原生支持HTTP/1.1和HTTP/2协议,能够有效管理连接池并复用连接,以优化网络资源使用和提高请求处理速度。httpcore的设计注重性能和灵活性,使其成为开发现代HTTP应用的坚实基础。无论是实现复杂的网络通信、构建RESTful API客户端,还是开发微服务架构中的通信组件,httpcore都能提供稳定和高效的解决方案。通过其低级请求/响应接口,开发者可以精确控制HTTP交互细节,满足各种定制化的网络编程需求。

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Karen110 Karen110
4年前
Python4要来了?快来看看Python之父怎么说
大家好,我是菜鸟哥,今天跟大家一起聊一下Python4的话题!从2020年的1月1号开始,Python官方正式的停止了对于Python2的维护。Python也正式的进入了Python3的时代。而随着时间的发展,关于Python4的发布也逐渐的成为了大家讨论的热点问题。前段时间菜鸟哥逛某国外论坛的时候,看到了针对于Python4的问题。Python之父
Stella981 Stella981
3年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Stella981 Stella981
3年前
Python3:sqlalchemy对mysql数据库操作,非sql语句
Python3:sqlalchemy对mysql数据库操作,非sql语句python3authorlizmdatetime2018020110:00:00coding:utf8'''
Stella981 Stella981
3年前
Python之time模块的时间戳、时间字符串格式化与转换
Python处理时间和时间戳的内置模块就有time,和datetime两个,本文先说time模块。关于时间戳的几个概念时间戳,根据1970年1月1日00:00:00开始按秒计算的偏移量。时间元组(struct_time),包含9个元素。 time.struct_time(tm_y
Easter79 Easter79
3年前
SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器!复制代码(https://oscimg.oschina.net/oscnet/675f5689159acfa2c39c91f4df40a00ce0f.gif)/cookie对象;rememberMeCookie()方法是设置Cookie的生成模
Python进阶者 Python进阶者
2年前
盘点一个Python处理Excel两列单元格中有类似字符串就返回1,没有就返回0的操作
大家好,我是Python进阶者。一、前言前几天在才哥的Python交流群遇到了一个粉丝提问,提问截图如下:!(https://uploadimages.jianshu.io/upload_images/2623978995c5a
Python进阶者 Python进阶者
2年前
盘点一个Pandas中df转列表处理基础知识
大家好,我是皮皮。一、前言前几天在Python黄金群【东哥】问了一个Pandas基础的问题,这里拿出来给大家分享下。大佬们,我有这样的一个df:dfpd.DataFrame("城市":可以看到【逸】、【此类生物】、【巭孬嫑勥烎】、【Python进阶者】都有
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
Python进阶者 Python进阶者
1年前
python里有哪个好用的地址分析库嘛?
大家好,我是Python进阶者。一、前言前几天在Python铂金交流群【大写一个Y】问了一个Python数据处理的问题,问题如下:大佬们python里有哪个好用的地址分析库嘛?我现在用的是jionlp,会有一些错误,比如广东的“开平市长沙区”,会因为:长沙
内存泄漏者
内存泄漏者
Lv1
故国山川,故园心眼,还似王粲登楼。
文章
5
粉丝
0
获赞
0