_api.py 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438
  1. from __future__ import annotations
  2. import typing
  3. from contextlib import contextmanager
  4. from ._client import Client
  5. from ._config import DEFAULT_TIMEOUT_CONFIG
  6. from ._models import Response
  7. from ._types import (
  8. AuthTypes,
  9. CookieTypes,
  10. HeaderTypes,
  11. ProxyTypes,
  12. QueryParamTypes,
  13. RequestContent,
  14. RequestData,
  15. RequestFiles,
  16. TimeoutTypes,
  17. )
  18. from ._urls import URL
  19. if typing.TYPE_CHECKING:
  20. import ssl # pragma: no cover
  21. __all__ = [
  22. "delete",
  23. "get",
  24. "head",
  25. "options",
  26. "patch",
  27. "post",
  28. "put",
  29. "request",
  30. "stream",
  31. ]
  32. def request(
  33. method: str,
  34. url: URL | str,
  35. *,
  36. params: QueryParamTypes | None = None,
  37. content: RequestContent | None = None,
  38. data: RequestData | None = None,
  39. files: RequestFiles | None = None,
  40. json: typing.Any | None = None,
  41. headers: HeaderTypes | None = None,
  42. cookies: CookieTypes | None = None,
  43. auth: AuthTypes | None = None,
  44. proxy: ProxyTypes | None = None,
  45. timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
  46. follow_redirects: bool = False,
  47. verify: ssl.SSLContext | str | bool = True,
  48. trust_env: bool = True,
  49. ) -> Response:
  50. """
  51. Sends an HTTP request.
  52. **Parameters:**
  53. * **method** - HTTP method for the new `Request` object: `GET`, `OPTIONS`,
  54. `HEAD`, `POST`, `PUT`, `PATCH`, or `DELETE`.
  55. * **url** - URL for the new `Request` object.
  56. * **params** - *(optional)* Query parameters to include in the URL, as a
  57. string, dictionary, or sequence of two-tuples.
  58. * **content** - *(optional)* Binary content to include in the body of the
  59. request, as bytes or a byte iterator.
  60. * **data** - *(optional)* Form data to include in the body of the request,
  61. as a dictionary.
  62. * **files** - *(optional)* A dictionary of upload files to include in the
  63. body of the request.
  64. * **json** - *(optional)* A JSON serializable object to include in the body
  65. of the request.
  66. * **headers** - *(optional)* Dictionary of HTTP headers to include in the
  67. request.
  68. * **cookies** - *(optional)* Dictionary of Cookie items to include in the
  69. request.
  70. * **auth** - *(optional)* An authentication class to use when sending the
  71. request.
  72. * **proxy** - *(optional)* A proxy URL where all the traffic should be routed.
  73. * **timeout** - *(optional)* The timeout configuration to use when sending
  74. the request.
  75. * **follow_redirects** - *(optional)* Enables or disables HTTP redirects.
  76. * **verify** - *(optional)* Either `True` to use an SSL context with the
  77. default CA bundle, `False` to disable verification, or an instance of
  78. `ssl.SSLContext` to use a custom context.
  79. * **trust_env** - *(optional)* Enables or disables usage of environment
  80. variables for configuration.
  81. **Returns:** `Response`
  82. Usage:
  83. ```
  84. >>> import httpx
  85. >>> response = httpx.request('GET', 'https://httpbin.org/get')
  86. >>> response
  87. <Response [200 OK]>
  88. ```
  89. """
  90. with Client(
  91. cookies=cookies,
  92. proxy=proxy,
  93. verify=verify,
  94. timeout=timeout,
  95. trust_env=trust_env,
  96. ) as client:
  97. return client.request(
  98. method=method,
  99. url=url,
  100. content=content,
  101. data=data,
  102. files=files,
  103. json=json,
  104. params=params,
  105. headers=headers,
  106. auth=auth,
  107. follow_redirects=follow_redirects,
  108. )
  109. @contextmanager
  110. def stream(
  111. method: str,
  112. url: URL | str,
  113. *,
  114. params: QueryParamTypes | None = None,
  115. content: RequestContent | None = None,
  116. data: RequestData | None = None,
  117. files: RequestFiles | None = None,
  118. json: typing.Any | None = None,
  119. headers: HeaderTypes | None = None,
  120. cookies: CookieTypes | None = None,
  121. auth: AuthTypes | None = None,
  122. proxy: ProxyTypes | None = None,
  123. timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
  124. follow_redirects: bool = False,
  125. verify: ssl.SSLContext | str | bool = True,
  126. trust_env: bool = True,
  127. ) -> typing.Iterator[Response]:
  128. """
  129. Alternative to `httpx.request()` that streams the response body
  130. instead of loading it into memory at once.
  131. **Parameters**: See `httpx.request`.
  132. See also: [Streaming Responses][0]
  133. [0]: /quickstart#streaming-responses
  134. """
  135. with Client(
  136. cookies=cookies,
  137. proxy=proxy,
  138. verify=verify,
  139. timeout=timeout,
  140. trust_env=trust_env,
  141. ) as client:
  142. with client.stream(
  143. method=method,
  144. url=url,
  145. content=content,
  146. data=data,
  147. files=files,
  148. json=json,
  149. params=params,
  150. headers=headers,
  151. auth=auth,
  152. follow_redirects=follow_redirects,
  153. ) as response:
  154. yield response
  155. def get(
  156. url: URL | str,
  157. *,
  158. params: QueryParamTypes | None = None,
  159. headers: HeaderTypes | None = None,
  160. cookies: CookieTypes | None = None,
  161. auth: AuthTypes | None = None,
  162. proxy: ProxyTypes | None = None,
  163. follow_redirects: bool = False,
  164. verify: ssl.SSLContext | str | bool = True,
  165. timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
  166. trust_env: bool = True,
  167. ) -> Response:
  168. """
  169. Sends a `GET` request.
  170. **Parameters**: See `httpx.request`.
  171. Note that the `data`, `files`, `json` and `content` parameters are not available
  172. on this function, as `GET` requests should not include a request body.
  173. """
  174. return request(
  175. "GET",
  176. url,
  177. params=params,
  178. headers=headers,
  179. cookies=cookies,
  180. auth=auth,
  181. proxy=proxy,
  182. follow_redirects=follow_redirects,
  183. verify=verify,
  184. timeout=timeout,
  185. trust_env=trust_env,
  186. )
  187. def options(
  188. url: URL | str,
  189. *,
  190. params: QueryParamTypes | None = None,
  191. headers: HeaderTypes | None = None,
  192. cookies: CookieTypes | None = None,
  193. auth: AuthTypes | None = None,
  194. proxy: ProxyTypes | None = None,
  195. follow_redirects: bool = False,
  196. verify: ssl.SSLContext | str | bool = True,
  197. timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
  198. trust_env: bool = True,
  199. ) -> Response:
  200. """
  201. Sends an `OPTIONS` request.
  202. **Parameters**: See `httpx.request`.
  203. Note that the `data`, `files`, `json` and `content` parameters are not available
  204. on this function, as `OPTIONS` requests should not include a request body.
  205. """
  206. return request(
  207. "OPTIONS",
  208. url,
  209. params=params,
  210. headers=headers,
  211. cookies=cookies,
  212. auth=auth,
  213. proxy=proxy,
  214. follow_redirects=follow_redirects,
  215. verify=verify,
  216. timeout=timeout,
  217. trust_env=trust_env,
  218. )
  219. def head(
  220. url: URL | str,
  221. *,
  222. params: QueryParamTypes | None = None,
  223. headers: HeaderTypes | None = None,
  224. cookies: CookieTypes | None = None,
  225. auth: AuthTypes | None = None,
  226. proxy: ProxyTypes | None = None,
  227. follow_redirects: bool = False,
  228. verify: ssl.SSLContext | str | bool = True,
  229. timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
  230. trust_env: bool = True,
  231. ) -> Response:
  232. """
  233. Sends a `HEAD` request.
  234. **Parameters**: See `httpx.request`.
  235. Note that the `data`, `files`, `json` and `content` parameters are not available
  236. on this function, as `HEAD` requests should not include a request body.
  237. """
  238. return request(
  239. "HEAD",
  240. url,
  241. params=params,
  242. headers=headers,
  243. cookies=cookies,
  244. auth=auth,
  245. proxy=proxy,
  246. follow_redirects=follow_redirects,
  247. verify=verify,
  248. timeout=timeout,
  249. trust_env=trust_env,
  250. )
  251. def post(
  252. url: URL | str,
  253. *,
  254. content: RequestContent | None = None,
  255. data: RequestData | None = None,
  256. files: RequestFiles | None = None,
  257. json: typing.Any | None = None,
  258. params: QueryParamTypes | None = None,
  259. headers: HeaderTypes | None = None,
  260. cookies: CookieTypes | None = None,
  261. auth: AuthTypes | None = None,
  262. proxy: ProxyTypes | None = None,
  263. follow_redirects: bool = False,
  264. verify: ssl.SSLContext | str | bool = True,
  265. timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
  266. trust_env: bool = True,
  267. ) -> Response:
  268. """
  269. Sends a `POST` request.
  270. **Parameters**: See `httpx.request`.
  271. """
  272. return request(
  273. "POST",
  274. url,
  275. content=content,
  276. data=data,
  277. files=files,
  278. json=json,
  279. params=params,
  280. headers=headers,
  281. cookies=cookies,
  282. auth=auth,
  283. proxy=proxy,
  284. follow_redirects=follow_redirects,
  285. verify=verify,
  286. timeout=timeout,
  287. trust_env=trust_env,
  288. )
  289. def put(
  290. url: URL | str,
  291. *,
  292. content: RequestContent | None = None,
  293. data: RequestData | None = None,
  294. files: RequestFiles | None = None,
  295. json: typing.Any | None = None,
  296. params: QueryParamTypes | None = None,
  297. headers: HeaderTypes | None = None,
  298. cookies: CookieTypes | None = None,
  299. auth: AuthTypes | None = None,
  300. proxy: ProxyTypes | None = None,
  301. follow_redirects: bool = False,
  302. verify: ssl.SSLContext | str | bool = True,
  303. timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
  304. trust_env: bool = True,
  305. ) -> Response:
  306. """
  307. Sends a `PUT` request.
  308. **Parameters**: See `httpx.request`.
  309. """
  310. return request(
  311. "PUT",
  312. url,
  313. content=content,
  314. data=data,
  315. files=files,
  316. json=json,
  317. params=params,
  318. headers=headers,
  319. cookies=cookies,
  320. auth=auth,
  321. proxy=proxy,
  322. follow_redirects=follow_redirects,
  323. verify=verify,
  324. timeout=timeout,
  325. trust_env=trust_env,
  326. )
  327. def patch(
  328. url: URL | str,
  329. *,
  330. content: RequestContent | None = None,
  331. data: RequestData | None = None,
  332. files: RequestFiles | None = None,
  333. json: typing.Any | None = None,
  334. params: QueryParamTypes | None = None,
  335. headers: HeaderTypes | None = None,
  336. cookies: CookieTypes | None = None,
  337. auth: AuthTypes | None = None,
  338. proxy: ProxyTypes | None = None,
  339. follow_redirects: bool = False,
  340. verify: ssl.SSLContext | str | bool = True,
  341. timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
  342. trust_env: bool = True,
  343. ) -> Response:
  344. """
  345. Sends a `PATCH` request.
  346. **Parameters**: See `httpx.request`.
  347. """
  348. return request(
  349. "PATCH",
  350. url,
  351. content=content,
  352. data=data,
  353. files=files,
  354. json=json,
  355. params=params,
  356. headers=headers,
  357. cookies=cookies,
  358. auth=auth,
  359. proxy=proxy,
  360. follow_redirects=follow_redirects,
  361. verify=verify,
  362. timeout=timeout,
  363. trust_env=trust_env,
  364. )
  365. def delete(
  366. url: URL | str,
  367. *,
  368. params: QueryParamTypes | None = None,
  369. headers: HeaderTypes | None = None,
  370. cookies: CookieTypes | None = None,
  371. auth: AuthTypes | None = None,
  372. proxy: ProxyTypes | None = None,
  373. follow_redirects: bool = False,
  374. timeout: TimeoutTypes = DEFAULT_TIMEOUT_CONFIG,
  375. verify: ssl.SSLContext | str | bool = True,
  376. trust_env: bool = True,
  377. ) -> Response:
  378. """
  379. Sends a `DELETE` request.
  380. **Parameters**: See `httpx.request`.
  381. Note that the `data`, `files`, `json` and `content` parameters are not available
  382. on this function, as `DELETE` requests should not include a request body.
  383. """
  384. return request(
  385. "DELETE",
  386. url,
  387. params=params,
  388. headers=headers,
  389. cookies=cookies,
  390. auth=auth,
  391. proxy=proxy,
  392. follow_redirects=follow_redirects,
  393. verify=verify,
  394. timeout=timeout,
  395. trust_env=trust_env,
  396. )