我正在通过我购买的一本书学习 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
。所有其他参数(url
、params
、**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_user
和update_user
和delete_user
时,我可以调用.get
、.post
、.delete
等方法。但是,如果调用这些 API 需要传入许多和/或复杂的kwargs
(headers
、auth
、timeout
等),那么这将导致大量重复的代码。
相反,您可以在一种方法中完成所有操作,然后使用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、进行验证等。