gpt4 book ai didi

Python:获取 urllib3 请求 header

转载 作者:行者123 更新时间:2023-12-04 13:51:59 27 4
gpt4 key购买 nike

我们正在将跟踪信息注入(inject)到基于 urllib3 实现的 API 客户端库中所有 http 请求调用的请求 header 中

def _init_jaeger_tracer():
'''Jaeger tracer initialization'''
config = Config(
config={
'sampler': {
'type': 'const',
'param': 1,
},
},
service_name="session"
)
return config.new_tracer()

class APIObject(rest.APIObject):
'''Class for injecting traces into urllib3 request headers'''
def __init__(self, configuration):
print("RESTClientObject child class called####")
self._tracer = None
super().__init__(configuration)
self._tracer = _init_jaeger_tracer()

# pylint: disable=W0221
def request(self, method, url, *args, **kwargs):
lower_method = method.lower()
with self._tracer.start_active_span('requests.{}'.format(lower_method)) as scope:
span = scope.span
span.set_tag(tags.SPAN_KIND, tags.SPAN_KIND_RPC_CLIENT)
span.set_tag(tags.COMPONENT, 'request')
span.set_tag(tags.HTTP_METHOD, lower_method)
span.set_tag(tags.HTTP_URL, url)
headers = kwargs.setdefault('headers', {})
self._tracer.inject(span.context, Format.HTTP_HEADERS, headers)
return r
经过这样的实现,urllib3 请求头看起来像这样,
headers = {
'Content-Type': 'application/json',
'User-Agent': 'API-Generator/1.0.0/python',
# **
'uber-trace-id': '30cef3e816482516:1a4fed2c4863b2f6:0:1'
# **
}
现在我们必须从注入(inject)的请求头中获取 trace-id。
在python“请求”库中,我们有“response.request.headers”属性来返回请求头
在 urllib3 中,我找不到返回请求 header 以供进一步处理的方法
你们中的任何人都可以分享一些想法吗
现在从这个请求头中,我们需要获取 'uber-trace-id' 及其值以进一步构建 URL。

最佳答案

urllib3.response.HTTPResponse 的文档说它是:

Backwards-compatible with http.client.HTTPResponse [...]


那是 stdlib 类,它具有 getheader 方法描述为:

Return the value of the header name, or default if there is no header matching name. If there is more than one header with the name name, return all of the values joined by ', '. If default is any iterable other than a single string, its elements are similarly returned joined by commas.


因此,在您的情况下,它是这样的。
import urllib3

http = urllib3.PoolManager()
response = http.request('GET', 'https://python.org/')
response.getheader('uber-trace-id', 'UNKNOWN')
更新 urllib3没有 HTTP 请求对象表示。 HTTP 请求以 RequestMethods.request 的形式参数表示。 .因此,您需要自己将跟踪标识符存储在您的 request 中。由 jaeger_client 注入(inject)后覆盖.将它存储为响应对象的属性可能是一个好主意:
from jaeger_client.constants import TRACE_ID_HEADER

class APIObject(rest.APIObject):

def request(self, *args, **kwargs) -> urllib3.response.BaseHTTPResponse:
...
r._request_tracing_id = headers[TRACE_ID_HEADER]
return r

关于Python:获取 urllib3 请求 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68501158/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com