使用python请求的正确方法是什么,'requests.request("GET",...)'或'请求.get'?



我正在通过我购买的一本书学习 Pythonrequests。从这本书和我研究的网站来看,它指出这是执行GET请求的正确方法。

requests.get(url, params={key: value}, args)

在PyCharm中,它也显示了同样的事情。

但是,当我使用 Postman 测试和查看示例代码时,它显示:

requests.request("GET", params={key: value}, args

我不确定我是否应该使用request.get或 requests.request("GET",' 以及为什么要选择一个而不是另一个。

它们都是正确的,并且工作原理相同。

消除这种困惑的最好方法是查看requests源代码。

以下是request.get的代码(截至 2.25.1):

def get(url, params=None, **kwargs):
r"""Sends a GET request.
:param url: URL for the new :class:`Request` object.
:param params: (optional) Dictionary, list of tuples or bytes to send
in the query string for the :class:`Request`.
:param **kwargs: Optional arguments that ``request`` takes.
:return: :class:`Response <Response>` object
:rtype: requests.Response
"""
kwargs.setdefault('allow_redirects', True)
return request('get', url, params=params, **kwargs)

。这表明requests.get只是使用第一个参数的硬编码'get'调用requests.request。所有其他参数(urlparams**kwargs)都只是传递。

基本上,它只是一个方便的方法或速记或快捷方式,因此您不必手动记住要为method参数传递哪个字符串。这更容易,尤其是在使用 IDE 时,因为 IDE 的智能感知可以帮助您选择.get.post.delete等,但不能选择原始字符串"GET""POST""DELETE"等。

requests文档也可以提供一些清晰度。

  • requests.request(method, url, **kwargs)

    它说">构造并发送请求。".所以这个适用于任何类型的请求,你需要传入 2 个必需的参数:method和 URL。文档中列出了所有可能kwargs,包括示例中的params

  • requests.get(url, params=None, **kwargs)

    它说">发送一个GET请求。".所以这个更具体,因为它仅适用于GET 请求。它只有 1 个必需的参数,即 URL。无需通过"GET".然后kwargs是">request采取的可选论点。",只是指向主要的requests.request方法。

我会说这是一个意见和编码风格的问题,使用哪一个。首选requests.request的一个用例是包装不同的 API 调用并为它们提供 Python 接口。

例如,我有以下 API:

  • GET/api/v1/user/[user-id]
  • 补丁/api/v1/user/[user-id]
  • 删除/api/v1/user/[user-id]

在实现get_userupdate_userdelete_user时,我可以调用.get.post.delete等方法。但是,如果调用这些 API 需要传入许多和/或复杂的kwargs(headersauthtimeout等),那么这将导致大量重复的代码。

相反,您可以在一种方法中完成所有操作,然后使用requests.request

def get_user(user_id):
return call_api("GET", user_id)
def update_user(user_id, user):
return call_api("PATCH", user_id, user=user)
def delete_user(user_id):
return call_api("DELETE", user_id)
def call_api(method, user_id, user=None):
# Lots of preparation code to make a request
headers = {
"header1": "value1",
"header2": "value2",
# There can be lots of headers...
"headerN": "valueN",
}
timeout = (1, 30)
payload = user.json() if user else {}
url = f"/api/v1/user/{user_id}"
return requests.request(
method,
url,
headers=headers,
timeout=timeout,
json=payload,
)

可能还有其他方法可以重构上面的代码以减少重复。这只是一个例子,如果你直接调用.get.patch.delete,那么你最终可能会每次重复列出所有这些标头、设置 URL、进行验证等。

相关内容

  • 没有找到相关文章