_api.py 13 KB

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