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

如何从httpx.get()的响应中获取URL解析的服务器IP?

用httpx请求后获取服务器解析IP

当你执行resp = httpx.get(url)拿到响应后,想获取该URL解析到的服务器IP,可以按以下方式操作:

同步请求的常规方法

直接从响应的extensions属性中获取底层socket连接,再提取远程IP:

import httpx

url = "https://example.com"
resp = httpx.get(url)

# 取出socket连接对象
socket = resp.extensions.get("socket")
if socket:
    # getpeername()返回(IP地址, 端口号)的元组
    server_ip, _ = socket.getpeername()
    print(f"服务器IP:{server_ip}")
else:
    print("无法获取socket连接,可能是使用了HTTP/2协议或连接池复用场景")

应对HTTP/2或连接池复用的情况

如果请求使用HTTP/2协议,或者连接被连接池复用,上面的方法可能失效。这时可以自定义Transport来提前解析并记录IP:

import httpx
from httpx import Transport

class IPRecordTransport(Transport):
    def __init__(self, transport: Transport):
        self.transport = transport
        self.server_ip = None

    def handle_request(self, request):
        # 先解析域名获取IP
        with httpx.HTTPConnectionPool(request.url) as pool:
            resolved_list = pool.resolve(request.url)
            self.server_ip = resolved_list[0].host
        # 继续处理请求
        return self.transport.handle_request(request)

# 使用自定义Transport创建客户端
transport = IPRecordTransport(httpx.HTTPTransport())
with httpx.Client(transport=transport) as client:
    client.get(url)
    print(f"服务器IP:{transport.server_ip}")

异步请求的处理方式

异步场景下逻辑类似,从响应的extensions中获取socket,再通过get_extra_info提取IP:

import httpx
import asyncio

async def fetch_server_ip():
    url = "https://example.com"
    async with httpx.AsyncClient() as client:
        resp = await client.get(url)
        socket = resp.extensions.get("socket")
        if socket:
            server_ip, _ = socket.get_extra_info("peername")
            print(f"服务器IP:{server_ip}")

asyncio.run(fetch_server_ip())

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 01:15:34