headers.host 中未显示端口号
Port number not showing in headers.host
我正在从前端发出 HTTP 请求,我可以在开发工具中的请求 Headers 的主机字段中看到端口号(例如 xyz.com:1234)。但是使用 python 的请求模块,主机只显示 xyz.com。
如何获取端口号?
requests
库在使用它发出请求时不需要创建和添加一个Host
header,但是你可以添加一个Host
header 如果需要:只需提供 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 模块了解更多信息。
一种更加自动化的方法,依赖于标准库
上述手动方法描述了如何从一般意义上考虑这个问题,但它无法轻松扩展到可能存在的许多常见方案(ssh
、gopher
等) .).
在 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)
我正在从前端发出 HTTP 请求,我可以在开发工具中的请求 Headers 的主机字段中看到端口号(例如 xyz.com:1234)。但是使用 python 的请求模块,主机只显示 xyz.com。 如何获取端口号?
requests
库在使用它发出请求时不需要创建和添加一个Host
header,但是你可以添加一个Host
header 如果需要:只需提供 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 模块了解更多信息。
一种更加自动化的方法,依赖于标准库
上述手动方法描述了如何从一般意义上考虑这个问题,但它无法轻松扩展到可能存在的许多常见方案(ssh
、gopher
等) .).
在 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)