headers.host 中未显示端口号

Port number not showing in headers.host

我正在从前端发出 HTTP 请求,我可以在开发工具中的请求 Headers 的主机字段中看到端口号(例如 xyz.com:1234)。但是使用 python 的请求模块,主机只显示 xyz.com。 如何获取端口号?

requests库在使用它发出请求时不需要创建和添加一个Hostheader,但是你可以添加一个Hostheader 如果需要:只需提供 headers keyword argument--例如headers={'Host': 'xyz.com:1234'} 如果使用上面的示例。

从URL解析端口号,手动方法

但是,您的问题似乎与解析请求的端口号有关,为此,一个示例应该可以为您解决问题:

from urllib.parse import urlparse
import requests

def get_port(url: str) -> int:
    schema_ports = {'http': 80, 'https': 443}
    parsed_url = urlparse(url)
    if parsed_url.port:
        return parsed_url.port
    return schema_ports.get(parsed_url.scheme, None)

ports = (
    get_port(requests.get('http://localhost:8001').request.url),
    get_port(requests.get('http://google.com').request.url),
    get_port(requests.get('https://google.com').request.url)
)

print(ports) # (8001, 80, 443)

在此示例中,requests 库有三个 HTTP GET 请求。虽然在这个人为的示例中您已经看到了请求 URL,但如果您正在处理来自通用 requests.models.Response object 的解决方案,您可以从 request.url 属性。然后您需要意识到在没有明确指定端口的情况下,您将需要推断一个合理的默认值(因为没有明确的 port)。上面的 get_port 定义给出了两个常见方案(HTTP 和 HTTPS)的示例。

阅读 Python 标准库的 urllib.parse 模块了解更多信息。

一种更加自动化的方法,依赖于标准库

上述手动方法描述了如何从一般意义上考虑这个问题,但它无法轻松扩展到可能存在的许多常见方案(sshgopher 等) .).

在 POSIX 系统上,/etc/services 文件维护公共服务方案到 ports/protocols 的映射和可选描述,例如

http             80/udp     www www-http # World Wide Web HTTP
http             80/tcp     www www-http # World Wide Web HTTP

Python 的 socket 库中的 getservbyname function 有一种方法可以利用这种类型的映射:

>>> socket.getservbyname('https')
443
>>> socket.getservbyname('http')
80

有了这个,我们可以改进我的第一个例子,以避免手动指定常见方案的映射:

import socket
from urllib.parse import urlparse
import requests

def get_port(url: str) -> int:
    parsed_url = urlparse(url)
    if parsed_url.port:
        return parsed_url.port
    try:
        return socket.getservbyname(parsed_url.scheme)
    except OSError:
        return None

ports = (
    get_port(requests.get('http://localhost:8001').request.url),
    get_port(requests.get('http://google.com').request.url),
    get_port(requests.get('https://google.com').request.url)
)

print(ports) # (8001, 80, 443)