首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >headers.host中未显示端口号

headers.host中未显示端口号
EN

Stack Overflow用户
提问于 2020-05-28 05:15:21
回答 1查看 103关注 0票数 0

我正在从前端发出一个超文本传输协议请求,我可以在开发工具(例如xyz.com:1234)的请求头的主机字段中看到端口号。但是使用python的requests模块,主机只显示xyz.com。如何获取端口号?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-05-28 05:52:50

当您使用requests库发出请求时,它不需要创建和添加Host标头,但是如果需要,您可以添加Host标头:只需提供headers keyword argument--例如如果使用上面的示例,则为headers={'Host': 'xyz.com:1234'}

从URL解析端口号,这是一种手动方法

然而,您的问题似乎更多地与解析请求的端口号有关,对于这一点,示例应该会为您澄清问题:

代码语言:javascript
复制
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对象的解决方案,则可以从request.url属性中获取请求URL。然后,您需要认识到,在没有显式指定端口的情况下,您需要推断一个合理的默认值(因为没有显式的port)。上面的get_port定义给出了两种常见方案(HTTP和HTTPS)的示例。

有关Python标准库的urllib.parse模块的更多信息,请阅读。

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

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

在POSIX系统上,/etc/services文件维护常见服务方案到端口/协议的映射和可选描述,例如

代码语言:javascript
复制
http             80/udp     www www-http # World Wide Web HTTP
http             80/tcp     www www-http # World Wide Web HTTP

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

代码语言:javascript
复制
>>> socket.getservbyname('https')
443
>>> socket.getservbyname('http')
80

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

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62053004

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档