You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python的GI结合libSoup GLib库向https://httpbin.org/get发送GET请求?

使用libSoup + GObject-introspection (GI) 在Python中发送HTTP GET请求

嘿,我来帮你搞定用libSoup和GObject-introspection(GI)在Python里发起HTTP GET请求的事儿!这俩搭配起来其实挺顺手的,尤其是结合GLib的事件循环,不管是异步还是同步请求都能轻松处理。下面我一步步给你拆解,最后还给你一个直接能跑的示例,目标就是你提到的https://httpbin.org/get。

1. 先搞定依赖安装

首先得确保你的系统上装了必要的组件:

  • Python的GI绑定:这是调用GLib、libSoup等C库的关键,Debian/Ubuntu系可以用sudo apt-get install python3-gi安装;Fedora则是sudo dnf install python3-gobject。
  • libSoup库:HTTP客户端的核心,推荐装3.x版本(更现代),Debian/Ubuntu用sudo apt-get install libsoup3.0-dev,Fedora用sudo dnf install libsoup3-devel。

不用额外装Python版的libSoup包,GI会自动绑定系统里的libSoup API,直接导入用就行。

2. 核心步骤拆解

不管是异步还是同步请求,核心流程都差不多:

  • 创建一个Soup.Session对象:这相当于你的HTTP客户端会话,负责管理连接、Cookie、请求复用这些事儿。
  • 构建GET请求:用Soup.Message.new_get()方法,传入目标URL就能生成一个请求消息。
  • 发送请求并处理响应:分异步(适合非阻塞场景,比如GUI程序)和同步(适合简单脚本)两种方式。

3. 异步请求示例(推荐)

异步请求不会阻塞主线程,是libSoup的常用方式,需要结合GLib的主循环来处理事件:

from gi.repository import Soup, GLib

def on_response_received(session, result, user_data):
    # 回调函数:请求完成后处理响应
    try:
        # 获取请求结果
        message = session.send_finish(result)
        
        # 检查响应状态码是否正常
        if message.get_status() == Soup.Status.OK:
            # 读取并解码响应内容
            response_body = message.get_response_body().get_data().decode('utf-8')
            print("✅ 请求成功!响应内容:")
            print(response_body)
        else:
            print(f"❌ 请求失败,状态码:{message.get_status()}")
    except Exception as e:
        print(f"⚠️ 发生错误:{str(e)}")
    finally:
        # 请求完成后退出GLib主循环,避免程序一直运行
        GLib.MainLoop().quit()

def main():
    # 创建Soup会话
    session = Soup.Session.new()
    
    # 构建GET请求消息
    target_url = "https://httpbin.org/get"
    request_msg = Soup.Message.new_get(target_url)
    
    # 异步发送请求,指定回调函数
    session.send_async(request_msg, None, on_response_received, None)
    
    # 启动GLib主循环,等待请求完成
    main_loop = GLib.MainLoop()
    main_loop.run()

if __name__ == "__main__":
    main()

代码说明:

  • send_async:异步发送请求,不会阻塞主线程,请求完成后会调用我们指定的on_response_received回调函数。
  • send_finish:在回调里用这个方法获取请求的最终结果。
  • GLib主循环:负责监听网络事件,直到请求完成后退出,保证程序不会提前结束。

4. 同步请求示例(适合简单脚本)

如果只是写个简单脚本,不需要非阻塞,同步请求会更简洁,不用管主循环:

from gi.repository import Soup

def main():
    # 创建Soup会话
    session = Soup.Session.new()
    
    # 构建GET请求
    target_url = "https://httpbin.org/get"
    request_msg = Soup.Message.new_get(target_url)
    
    # 同步发送请求,阻塞直到响应返回
    status_code = session.send_sync(request_msg, None)
    
    # 处理响应
    if status_code == Soup.Status.OK:
        response_body = request_msg.get_response_body().get_data().decode('utf-8')
        print("✅ 请求成功!响应内容:")
        print(response_body)
    else:
        print(f"❌ 请求失败,状态码:{status_code}")

if __name__ == "__main__":
    main()

注意:

同步请求会阻塞主线程,所以如果是GUI程序或者需要同时处理多个任务,还是优先用异步方式。

5. 一些额外提示

  • HTTPS支持:libSoup默认支持HTTPS,只要系统里装了TLS库(比如OpenSSL),直接请求HTTPS URL就行,不需要额外配置。
  • 版本兼容:上面的代码是针对libSoup 3.x的,如果你的系统是旧版本的libSoup 2.4,API会略有不同(比如会话对象是Soup.SessionAsync/Soup.SessionSync),但GI绑定会自动适配,建议尽量升级到3.x版本。
  • 错误处理:示例里加了基础的异常捕获,实际使用中可以根据需求扩展,比如处理超时、网络断开等情况。

这样应该就能顺利发起GET请求了,要是还有其他需求比如添加请求头、处理Cookie、发送POST请求之类的,随时问哈!

内容的提问来源于stack exchange,提问作者Azsgy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:53:56