httpx/compatibility/index.html
2025-09-11 12:02:38 +01:00

1608 lines
49 KiB
HTML

<!doctype html>
<html lang="en" class="no-js">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1">
<meta name="description" content="A next-generation HTTP client for Python.">
<link rel="canonical" href="https://www.python-httpx.org/compatibility/">
<link rel="prev" href="../logging/">
<link rel="next" href="../troubleshooting/">
<link rel="icon" href="../assets/images/favicon.png">
<meta name="generator" content="mkdocs-1.6.1, mkdocs-material-9.5.47">
<title>Requests Compatibility - HTTPX</title>
<link rel="stylesheet" href="../assets/stylesheets/main.6f8fc17f.min.css">
<link rel="stylesheet" href="../assets/stylesheets/palette.06af60db.min.css">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,300i,400,400i,700,700i%7CRoboto+Mono:400,400i,700,700i&display=fallback">
<style>:root{--md-text-font:"Roboto";--md-code-font:"Roboto Mono"}</style>
<link rel="stylesheet" href="../css/custom.css">
<script>__md_scope=new URL("..",location),__md_hash=e=>[...e].reduce(((e,_)=>(e<<5)-e+_.charCodeAt(0)),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
</head>
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo">
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
<label class="md-overlay" for="__drawer"></label>
<div data-md-component="skip">
<a href="#requests-compatibility-guide" class="md-skip">
Skip to content
</a>
</div>
<div data-md-component="announce">
</div>
<header class="md-header md-header--shadow" data-md-component="header">
<nav class="md-header__inner md-grid" aria-label="Header">
<a href=".." title="HTTPX" class="md-header__button md-logo" aria-label="HTTPX" data-md-component="logo">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
<label class="md-header__button md-icon" for="__drawer">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3zm0 5h18v2H3zm0 5h18v2H3z"/></svg>
</label>
<div class="md-header__title" data-md-component="header-title">
<div class="md-header__ellipsis">
<div class="md-header__topic">
<span class="md-ellipsis">
HTTPX
</span>
</div>
<div class="md-header__topic" data-md-component="header-topic">
<span class="md-ellipsis">
Requests Compatibility
</span>
</div>
</div>
</div>
<form class="md-header__option" data-md-component="palette">
<input class="md-option" data-md-color-media="(prefers-color-scheme: light)" data-md-color-scheme="default" data-md-color-primary="indigo" data-md-color-accent="indigo" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2a7 7 0 0 0-7 7c0 2.38 1.19 4.47 3 5.74V17a1 1 0 0 0 1 1h6a1 1 0 0 0 1-1v-2.26c1.81-1.27 3-3.36 3-5.74a7 7 0 0 0-7-7M9 21a1 1 0 0 0 1 1h4a1 1 0 0 0 1-1v-1H9z"/></svg>
</label>
<input class="md-option" data-md-color-media="(prefers-color-scheme: dark)" data-md-color-scheme="slate" data-md-color-primary="blue" data-md-color-accent="indigo" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 2a7 7 0 0 1 7 7c0 2.38-1.19 4.47-3 5.74V17a1 1 0 0 1-1 1H9a1 1 0 0 1-1-1v-2.26C6.19 13.47 5 11.38 5 9a7 7 0 0 1 7-7M9 21v-1h6v1a1 1 0 0 1-1 1h-4a1 1 0 0 1-1-1m3-17a5 5 0 0 0-5 5c0 2.05 1.23 3.81 3 4.58V16h4v-2.42c1.77-.77 3-2.53 3-4.58a5 5 0 0 0-5-5"/></svg>
</label>
</form>
<script>var palette=__md_get("__palette");if(palette&&palette.color){if("(prefers-color-scheme)"===palette.color.media){var media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent")}for(var[key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
<label class="md-header__button md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
</label>
<div class="md-search" data-md-component="search" role="dialog">
<label class="md-search__overlay" for="__search"></label>
<div class="md-search__inner" role="search">
<form class="md-search__form" name="search">
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
<label class="md-search__icon md-icon" for="__search">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.52 6.52 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5"/></svg>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11z"/></svg>
</label>
<nav class="md-search__options" aria-label="Search">
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12z"/></svg>
</button>
</nav>
</form>
<div class="md-search__output">
<div class="md-search__scrollwrap" tabindex="0" data-md-scrollfix>
<div class="md-search-result" data-md-component="search-result">
<div class="md-search-result__meta">
Initializing search
</div>
<ol class="md-search-result__list" role="presentation"></ol>
</div>
</div>
</div>
</div>
</div>
<div class="md-header__source">
<a href="https://github.com/encode/httpx/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
</div>
<div class="md-source__repository">
encode/httpx
</div>
</a>
</div>
</nav>
</header>
<div class="md-container" data-md-component="container">
<main class="md-main" data-md-component="main">
<div class="md-main__inner md-grid">
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<!-- Determine class according to configuration -->
<!-- Main navigation -->
<nav
class="md-nav md-nav--primary"
aria-label="nav.title"
data-md-level="0"
>
<!-- Site title -->
<label class="md-nav__title" for="__drawer">
<a
href=".."
title="HTTPX"
class="md-nav__button md-logo"
aria-label="HTTPX"
data-md-component="logo"
>
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 8a3 3 0 0 0 3-3 3 3 0 0 0-3-3 3 3 0 0 0-3 3 3 3 0 0 0 3 3m0 3.54C9.64 9.35 6.5 8 3 8v11c3.5 0 6.64 1.35 9 3.54 2.36-2.19 5.5-3.54 9-3.54V8c-3.5 0-6.64 1.35-9 3.54"/></svg>
</a>
HTTPX
</label>
<!-- Repository information -->
<div class="md-nav__source">
<a href="https://github.com/encode/httpx/" title="Go to repository" class="md-source" data-md-component="source">
<div class="md-source__icon md-icon">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512"><!--! Font Awesome Free 6.7.1 by @fontawesome - https://fontawesome.com License - https://fontawesome.com/license/free (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) Copyright 2024 Fonticons, Inc.--><path d="M439.55 236.05 244 40.45a28.87 28.87 0 0 0-40.81 0l-40.66 40.63 51.52 51.52c27.06-9.14 52.68 16.77 43.39 43.68l49.66 49.66c34.23-11.8 61.18 31 35.47 56.69-26.49 26.49-70.21-2.87-56-37.34L240.22 199v121.85c25.3 12.54 22.26 41.85 9.08 55a34.34 34.34 0 0 1-48.55 0c-17.57-17.6-11.07-46.91 11.25-56v-123c-20.8-8.51-24.6-30.74-18.64-45L142.57 101 8.45 235.14a28.86 28.86 0 0 0 0 40.81l195.61 195.6a28.86 28.86 0 0 0 40.8 0l194.69-194.69a28.86 28.86 0 0 0 0-40.81"/></svg>
</div>
<div class="md-source__repository">
encode/httpx
</div>
</a>
</div>
<!-- Navigation list -->
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href=".." class="md-nav__link">
<span class="md-ellipsis">
Introduction
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../quickstart/" class="md-nav__link">
<span class="md-ellipsis">
QuickStart
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_3" >
<label class="md-nav__link" for="__nav_3" id="__nav_3_label" tabindex="0">
<span class="md-ellipsis">
Advanced
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_3_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_3">
<span class="md-nav__icon md-icon"></span>
Advanced
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../advanced/clients/" class="md-nav__link">
<span class="md-ellipsis">
Clients
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../advanced/authentication/" class="md-nav__link">
<span class="md-ellipsis">
Authentication
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../advanced/ssl/" class="md-nav__link">
<span class="md-ellipsis">
SSL
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../advanced/proxies/" class="md-nav__link">
<span class="md-ellipsis">
Proxies
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../advanced/timeouts/" class="md-nav__link">
<span class="md-ellipsis">
Timeouts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../advanced/resource-limits/" class="md-nav__link">
<span class="md-ellipsis">
Resource Limits
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../advanced/event-hooks/" class="md-nav__link">
<span class="md-ellipsis">
Event Hooks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../advanced/transports/" class="md-nav__link">
<span class="md-ellipsis">
Transports
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../advanced/text-encodings/" class="md-nav__link">
<span class="md-ellipsis">
Text Encodings
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../advanced/extensions/" class="md-nav__link">
<span class="md-ellipsis">
Extensions
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--active md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" checked>
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
<span class="md-ellipsis">
Guides
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="true">
<label class="md-nav__title" for="__nav_4">
<span class="md-nav__icon md-icon"></span>
Guides
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../async/" class="md-nav__link">
<span class="md-ellipsis">
Async Support
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../http2/" class="md-nav__link">
<span class="md-ellipsis">
HTTP/2 Support
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../logging/" class="md-nav__link">
<span class="md-ellipsis">
Logging
</span>
</a>
</li>
<li class="md-nav__item md-nav__item--active">
<input class="md-nav__toggle md-toggle" type="checkbox" id="__toc">
<label class="md-nav__link md-nav__link--active" for="__toc">
<span class="md-ellipsis">
Requests Compatibility
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<a href="./" class="md-nav__link md-nav__link--active">
<span class="md-ellipsis">
Requests Compatibility
</span>
</a>
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#redirects" class="md-nav__link">
<span class="md-ellipsis">
Redirects
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#client-instances" class="md-nav__link">
<span class="md-ellipsis">
Client instances
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#request-urls" class="md-nav__link">
<span class="md-ellipsis">
Request URLs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#determining-the-next-redirect-request" class="md-nav__link">
<span class="md-ellipsis">
Determining the next redirect request
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#request-content" class="md-nav__link">
<span class="md-ellipsis">
Request Content
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#upload-files" class="md-nav__link">
<span class="md-ellipsis">
Upload files
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#content-encoding" class="md-nav__link">
<span class="md-ellipsis">
Content encoding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cookies" class="md-nav__link">
<span class="md-ellipsis">
Cookies
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#status-codes" class="md-nav__link">
<span class="md-ellipsis">
Status Codes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#streaming-responses" class="md-nav__link">
<span class="md-ellipsis">
Streaming responses
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#timeouts" class="md-nav__link">
<span class="md-ellipsis">
Timeouts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#proxy-keys" class="md-nav__link">
<span class="md-ellipsis">
Proxy keys
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssl-configuration" class="md-nav__link">
<span class="md-ellipsis">
SSL configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#request-body-on-http-methods" class="md-nav__link">
<span class="md-ellipsis">
Request body on HTTP methods
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#checking-for-success-and-failure-responses" class="md-nav__link">
<span class="md-ellipsis">
Checking for success and failure responses
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#request-instantiation" class="md-nav__link">
<span class="md-ellipsis">
Request instantiation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mocking" class="md-nav__link">
<span class="md-ellipsis">
Mocking
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#caching" class="md-nav__link">
<span class="md-ellipsis">
Caching
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#networking-layer" class="md-nav__link">
<span class="md-ellipsis">
Networking layer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#query-parameters" class="md-nav__link">
<span class="md-ellipsis">
Query Parameters
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#event-hooks" class="md-nav__link">
<span class="md-ellipsis">
Event Hooks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#exceptions-and-errors" class="md-nav__link">
<span class="md-ellipsis">
Exceptions and Errors
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item">
<a href="../troubleshooting/" class="md-nav__link">
<span class="md-ellipsis">
Troubleshooting
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
<span class="md-ellipsis">
API Reference
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_5">
<span class="md-nav__icon md-icon"></span>
API Reference
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../api/" class="md-nav__link">
<span class="md-ellipsis">
Developer Interface
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../exceptions/" class="md-nav__link">
<span class="md-ellipsis">
Exceptions
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../environment_variables/" class="md-nav__link">
<span class="md-ellipsis">
Environment Variables
</span>
</a>
</li>
</ul>
</nav>
</li>
<li class="md-nav__item md-nav__item--nested">
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_6" >
<label class="md-nav__link" for="__nav_6" id="__nav_6_label" tabindex="0">
<span class="md-ellipsis">
Community
</span>
<span class="md-nav__icon md-icon"></span>
</label>
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_6_label" aria-expanded="false">
<label class="md-nav__title" for="__nav_6">
<span class="md-nav__icon md-icon"></span>
Community
</label>
<ul class="md-nav__list" data-md-scrollfix>
<li class="md-nav__item">
<a href="../third_party_packages/" class="md-nav__link">
<span class="md-ellipsis">
Third Party Packages
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../contributing/" class="md-nav__link">
<span class="md-ellipsis">
Contributing
</span>
</a>
</li>
<li class="md-nav__item">
<a href="../code_of_conduct/" class="md-nav__link">
<span class="md-ellipsis">
Code of Conduct
</span>
</a>
</li>
</ul>
</nav>
</li>
</ul>
<ul class="md-nav__list" data-md-scrollfix style="padding-top: 15px; padding-left: 10px">
<div>
<a href="https://speakeasy.com"><img src="/img/speakeasy.png" width=150px style=></img></a>
</div>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-sidebar md-sidebar--secondary" data-md-component="sidebar" data-md-type="toc" >
<div class="md-sidebar__scrollwrap">
<div class="md-sidebar__inner">
<nav class="md-nav md-nav--secondary" aria-label="Table of contents">
<label class="md-nav__title" for="__toc">
<span class="md-nav__icon md-icon"></span>
Table of contents
</label>
<ul class="md-nav__list" data-md-component="toc" data-md-scrollfix>
<li class="md-nav__item">
<a href="#redirects" class="md-nav__link">
<span class="md-ellipsis">
Redirects
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#client-instances" class="md-nav__link">
<span class="md-ellipsis">
Client instances
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#request-urls" class="md-nav__link">
<span class="md-ellipsis">
Request URLs
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#determining-the-next-redirect-request" class="md-nav__link">
<span class="md-ellipsis">
Determining the next redirect request
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#request-content" class="md-nav__link">
<span class="md-ellipsis">
Request Content
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#upload-files" class="md-nav__link">
<span class="md-ellipsis">
Upload files
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#content-encoding" class="md-nav__link">
<span class="md-ellipsis">
Content encoding
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#cookies" class="md-nav__link">
<span class="md-ellipsis">
Cookies
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#status-codes" class="md-nav__link">
<span class="md-ellipsis">
Status Codes
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#streaming-responses" class="md-nav__link">
<span class="md-ellipsis">
Streaming responses
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#timeouts" class="md-nav__link">
<span class="md-ellipsis">
Timeouts
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#proxy-keys" class="md-nav__link">
<span class="md-ellipsis">
Proxy keys
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#ssl-configuration" class="md-nav__link">
<span class="md-ellipsis">
SSL configuration
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#request-body-on-http-methods" class="md-nav__link">
<span class="md-ellipsis">
Request body on HTTP methods
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#checking-for-success-and-failure-responses" class="md-nav__link">
<span class="md-ellipsis">
Checking for success and failure responses
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#request-instantiation" class="md-nav__link">
<span class="md-ellipsis">
Request instantiation
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#mocking" class="md-nav__link">
<span class="md-ellipsis">
Mocking
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#caching" class="md-nav__link">
<span class="md-ellipsis">
Caching
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#networking-layer" class="md-nav__link">
<span class="md-ellipsis">
Networking layer
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#query-parameters" class="md-nav__link">
<span class="md-ellipsis">
Query Parameters
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#event-hooks" class="md-nav__link">
<span class="md-ellipsis">
Event Hooks
</span>
</a>
</li>
<li class="md-nav__item">
<a href="#exceptions-and-errors" class="md-nav__link">
<span class="md-ellipsis">
Exceptions and Errors
</span>
</a>
</li>
</ul>
</nav>
</div>
</div>
</div>
<div class="md-content" data-md-component="content">
<article class="md-content__inner md-typeset">
<h1 id="requests-compatibility-guide">Requests Compatibility Guide</h1>
<p>HTTPX aims to be broadly compatible with the <code>requests</code> API, although there are a
few design differences in places.</p>
<p>This documentation outlines places where the API differs...</p>
<h2 id="redirects">Redirects</h2>
<p>Unlike <code>requests</code>, HTTPX does <strong>not follow redirects by default</strong>.</p>
<p>We differ in behaviour here <a href="https://github.com/encode/httpx/discussions/1785">because auto-redirects can easily mask unnecessary network
calls being made</a>.</p>
<p>You can still enable behaviour to automatically follow redirects, but you need to
do so explicitly...</p>
<div class="highlight"><pre><span></span><code><span class="n">response</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">follow_redirects</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</code></pre></div>
<p>Or else instantiate a client, with redirect following enabled by default...</p>
<div class="highlight"><pre><span></span><code><span class="n">client</span> <span class="o">=</span> <span class="n">httpx</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span><span class="n">follow_redirects</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
</code></pre></div>
<h2 id="client-instances">Client instances</h2>
<p>The HTTPX equivalent of <code>requests.Session</code> is <code>httpx.Client</code>.</p>
<div class="highlight"><pre><span></span><code><span class="n">session</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">Session</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</code></pre></div>
<p>is generally equivalent to</p>
<div class="highlight"><pre><span></span><code><span class="n">client</span> <span class="o">=</span> <span class="n">httpx</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span><span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
</code></pre></div>
<h2 id="request-urls">Request URLs</h2>
<p>Accessing <code>response.url</code> will return a <code>URL</code> instance, rather than a string.</p>
<p>Use <code>str(response.url)</code> if you need a string instance.</p>
<h2 id="determining-the-next-redirect-request">Determining the next redirect request</h2>
<p>The <code>requests</code> library exposes an attribute <code>response.next</code>, which can be used to obtain the next redirect request.</p>
<div class="highlight"><pre><span></span><code><span class="n">session</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">Session</span><span class="p">()</span>
<span class="n">request</span> <span class="o">=</span> <span class="n">requests</span><span class="o">.</span><span class="n">Request</span><span class="p">(</span><span class="s2">&quot;GET&quot;</span><span class="p">,</span> <span class="o">...</span><span class="p">)</span><span class="o">.</span><span class="n">prepare</span><span class="p">()</span>
<span class="k">while</span> <span class="n">request</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">request</span><span class="p">,</span> <span class="n">allow_redirects</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">request</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">next</span>
</code></pre></div>
<p>In HTTPX, this attribute is instead named <code>response.next_request</code>. For example:</p>
<div class="highlight"><pre><span></span><code><span class="n">client</span> <span class="o">=</span> <span class="n">httpx</span><span class="o">.</span><span class="n">Client</span><span class="p">()</span>
<span class="n">request</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">build_request</span><span class="p">(</span><span class="s2">&quot;GET&quot;</span><span class="p">,</span> <span class="o">...</span><span class="p">)</span>
<span class="k">while</span> <span class="n">request</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">response</span> <span class="o">=</span> <span class="n">client</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="n">request</span><span class="p">)</span>
<span class="n">request</span> <span class="o">=</span> <span class="n">response</span><span class="o">.</span><span class="n">next_request</span>
</code></pre></div>
<h2 id="request-content">Request Content</h2>
<p>For uploading raw text or binary content we prefer to use a <code>content</code> parameter,
in order to better separate this usage from the case of uploading form data.</p>
<p>For example, using <code>content=...</code> to upload raw content:</p>
<div class="highlight"><pre><span></span><code><span class="c1"># Uploading text, bytes, or a bytes iterator.</span>
<span class="n">httpx</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="o">...</span><span class="p">,</span> <span class="n">content</span><span class="o">=</span><span class="sa">b</span><span class="s2">&quot;Hello, world&quot;</span><span class="p">)</span>
</code></pre></div>
<p>And using <code>data=...</code> to send form data:</p>
<div class="highlight"><pre><span></span><code><span class="c1"># Uploading form data.</span>
<span class="n">httpx</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="o">...</span><span class="p">,</span> <span class="n">data</span><span class="o">=</span><span class="p">{</span><span class="s2">&quot;message&quot;</span><span class="p">:</span> <span class="s2">&quot;Hello, world&quot;</span><span class="p">})</span>
</code></pre></div>
<p>Using the <code>data=&lt;text/byte content&gt;</code> will raise a deprecation warning,
and is expected to be fully removed with the HTTPX 1.0 release.</p>
<h2 id="upload-files">Upload files</h2>
<p>HTTPX strictly enforces that upload files must be opened in binary mode, in order
to avoid character encoding issues that can result from attempting to upload files
opened in text mode.</p>
<h2 id="content-encoding">Content encoding</h2>
<p>HTTPX uses <code>utf-8</code> for encoding <code>str</code> request bodies. For example, when using <code>content=&lt;str&gt;</code> the request body will be encoded to <code>utf-8</code> before being sent over the wire. This differs from Requests which uses <code>latin1</code>. If you need an explicit encoding, pass encoded bytes explicitly, e.g. <code>content=&lt;str&gt;.encode("latin1")</code>.
For response bodies, assuming the server didn't send an explicit encoding then HTTPX will do its best to figure out an appropriate encoding. HTTPX makes a guess at the encoding to use for decoding the response using <code>charset_normalizer</code>. Fallback to that or any content with less than 32 octets will be decoded using <code>utf-8</code> with the <code>error="replace"</code> decoder strategy.</p>
<h2 id="cookies">Cookies</h2>
<p>If using a client instance, then cookies should always be set on the client rather than on a per-request basis.</p>
<p>This usage is supported:</p>
<div class="highlight"><pre><span></span><code><span class="n">client</span> <span class="o">=</span> <span class="n">httpx</span><span class="o">.</span><span class="n">Client</span><span class="p">(</span><span class="n">cookies</span><span class="o">=...</span><span class="p">)</span>
<span class="n">client</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="o">...</span><span class="p">)</span>
</code></pre></div>
<p>This usage is <strong>not</strong> supported:</p>
<div class="highlight"><pre><span></span><code><span class="n">client</span> <span class="o">=</span> <span class="n">httpx</span><span class="o">.</span><span class="n">Client</span><span class="p">()</span>
<span class="n">client</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="o">...</span><span class="p">,</span> <span class="n">cookies</span><span class="o">=...</span><span class="p">)</span>
</code></pre></div>
<p>We prefer enforcing a stricter API here because it provides clearer expectations around cookie persistence, particularly when redirects occur.</p>
<h2 id="status-codes">Status Codes</h2>
<p>In our documentation we prefer the uppercased versions, such as <code>codes.NOT_FOUND</code>, but also provide lower-cased versions for API compatibility with <code>requests</code>.</p>
<p>Requests includes various synonyms for status codes that HTTPX does not support.</p>
<h2 id="streaming-responses">Streaming responses</h2>
<p>HTTPX provides a <code>.stream()</code> interface rather than using <code>stream=True</code>. This ensures that streaming responses are always properly closed outside of the stream block, and makes it visually clearer at which points streaming I/O APIs may be used with a response.</p>
<p>For example:</p>
<div class="highlight"><pre><span></span><code><span class="k">with</span> <span class="n">httpx</span><span class="o">.</span><span class="n">stream</span><span class="p">(</span><span class="s2">&quot;GET&quot;</span><span class="p">,</span> <span class="s2">&quot;https://www.example.com&quot;</span><span class="p">)</span> <span class="k">as</span> <span class="n">response</span><span class="p">:</span>
<span class="o">...</span>
</code></pre></div>
<p>Within a <code>stream()</code> block request data is made available with:</p>
<ul>
<li><code>.iter_bytes()</code> - Instead of <code>response.iter_content()</code></li>
<li><code>.iter_text()</code> - Instead of <code>response.iter_content(decode_unicode=True)</code></li>
<li><code>.iter_lines()</code> - Corresponding to <code>response.iter_lines()</code></li>
<li><code>.iter_raw()</code> - Use this instead of <code>response.raw</code></li>
<li><code>.read()</code> - Read the entire response body, making <code>response.text</code> and <code>response.content</code> available.</li>
</ul>
<h2 id="timeouts">Timeouts</h2>
<p>HTTPX defaults to including reasonable <a href="../quickstart/#timeouts">timeouts</a> for all network operations, while Requests has no timeouts by default.</p>
<p>To get the same behavior as Requests, set the <code>timeout</code> parameter to <code>None</code>:</p>
<div class="highlight"><pre><span></span><code><span class="n">httpx</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">&#39;https://www.example.com&#39;</span><span class="p">,</span> <span class="n">timeout</span><span class="o">=</span><span class="kc">None</span><span class="p">)</span>
</code></pre></div>
<h2 id="proxy-keys">Proxy keys</h2>
<p>HTTPX uses the mounts argument for HTTP proxying and transport routing.
It can do much more than proxies and allows you to configure more than just the proxy route.
For more detailed documentation, see <a href="../advanced/transports/#mounting-transports">Mounting Transports</a>.</p>
<p>When using <code>httpx.Client(mounts={...})</code> to map to a selection of different transports, we use full URL schemes, such as <code>mounts={"http://": ..., "https://": ...}</code>.</p>
<p>This is different to the <code>requests</code> usage of <code>proxies={"http": ..., "https": ...}</code>.</p>
<p>This change is for better consistency with more complex mappings, that might also include domain names, such as <code>mounts={"all://": ..., httpx.HTTPTransport(proxy="all://www.example.com": None})</code> which maps all requests onto a proxy, except for requests to "www.example.com" which have an explicit exclusion.</p>
<p>Also note that <code>requests.Session.request(...)</code> allows a <code>proxies=...</code> parameter, whereas <code>httpx.Client.request(...)</code> does not allow <code>mounts=...</code>.</p>
<h2 id="ssl-configuration">SSL configuration</h2>
<p>When using a <code>Client</code> instance, the ssl configurations should always be passed on client instantiation, rather than passed to the request method.</p>
<p>If you need more than one different SSL configuration, you should use different client instances for each SSL configuration.</p>
<h2 id="request-body-on-http-methods">Request body on HTTP methods</h2>
<p>The HTTP <code>GET</code>, <code>DELETE</code>, <code>HEAD</code>, and <code>OPTIONS</code> methods are specified as not supporting a request body. To stay in line with this, the <code>.get</code>, <code>.delete</code>, <code>.head</code> and <code>.options</code> functions do not support <code>content</code>, <code>files</code>, <code>data</code>, or <code>json</code> arguments.</p>
<p>If you really do need to send request data using these http methods you should use the generic <code>.request</code> function instead.</p>
<div class="highlight"><pre><span></span><code><span class="n">httpx</span><span class="o">.</span><span class="n">request</span><span class="p">(</span>
<span class="n">method</span><span class="o">=</span><span class="s2">&quot;DELETE&quot;</span><span class="p">,</span>
<span class="n">url</span><span class="o">=</span><span class="s2">&quot;https://www.example.com/&quot;</span><span class="p">,</span>
<span class="n">content</span><span class="o">=</span><span class="sa">b</span><span class="s1">&#39;A request body on a DELETE request.&#39;</span>
<span class="p">)</span>
</code></pre></div>
<h2 id="checking-for-success-and-failure-responses">Checking for success and failure responses</h2>
<p>We don't support <code>response.is_ok</code> since the naming is ambiguous there, and might incorrectly imply an equivalence to <code>response.status_code == codes.OK</code>. Instead we provide the <code>response.is_success</code> property, which can be used to check for a 2xx response.</p>
<h2 id="request-instantiation">Request instantiation</h2>
<p>There is no notion of <a href="https://requests.readthedocs.io/en/stable/user/advanced/#prepared-requests">prepared requests</a> in HTTPX. If you need to customize request instantiation, see <a href="../advanced/clients/#request-instances">Request instances</a>.</p>
<p>Besides, <code>httpx.Request()</code> does not support the <code>auth</code>, <code>timeout</code>, <code>follow_redirects</code>, <code>mounts</code>, <code>verify</code> and <code>cert</code> parameters. However these are available in <code>httpx.request</code>, <code>httpx.get</code>, <code>httpx.post</code> etc., as well as on <a href="../advanced/clients/#client-instances"><code>Client</code> instances</a>.</p>
<h2 id="mocking">Mocking</h2>
<p>If you need to mock HTTPX the same way that test utilities like <code>responses</code> and <code>requests-mock</code> does for <code>requests</code>, see <a href="https://github.com/lundberg/respx">RESPX</a>.</p>
<h2 id="caching">Caching</h2>
<p>If you use <code>cachecontrol</code> or <code>requests-cache</code> to add HTTP Caching support to the <code>requests</code> library, you can use <a href="https://hishel.com">Hishel</a> for HTTPX.</p>
<h2 id="networking-layer">Networking layer</h2>
<p><code>requests</code> defers most of its HTTP networking code to the excellent <a href="https://urllib3.readthedocs.io/en/latest/"><code>urllib3</code> library</a>.</p>
<p>On the other hand, HTTPX uses <a href="https://github.com/encode/httpcore">HTTPCore</a> as its core HTTP networking layer, which is a different project than <code>urllib3</code>.</p>
<h2 id="query-parameters">Query Parameters</h2>
<p><code>requests</code> omits <code>params</code> whose values are <code>None</code> (e.g. <code>requests.get(..., params={"foo": None})</code>). This is not supported by HTTPX.</p>
<p>For both query params (<code>params=</code>) and form data (<code>data=</code>), <code>requests</code> supports sending a list of tuples (e.g. <code>requests.get(..., params=[('key1', 'value1'), ('key1', 'value2')])</code>). This is not supported by HTTPX. Instead, use a dictionary with lists as values. E.g.: <code>httpx.get(..., params={'key1': ['value1', 'value2']})</code> or with form data: <code>httpx.post(..., data={'key1': ['value1', 'value2']})</code>.</p>
<h2 id="event-hooks">Event Hooks</h2>
<p><code>requests</code> allows event hooks to mutate <code>Request</code> and <code>Response</code> objects. See <a href="https://requests.readthedocs.io/en/master/user/advanced/#event-hooks">examples</a> given in the documentation for <code>requests</code>.</p>
<p>In HTTPX, event hooks may access properties of requests and responses, but event hook callbacks cannot mutate the original request/response.</p>
<p>If you are looking for more control, consider checking out <a href="../advanced/transports/#custom-transports">Custom Transports</a>.</p>
<h2 id="exceptions-and-errors">Exceptions and Errors</h2>
<p><code>requests</code> exception hierarchy is slightly different to the <code>httpx</code> exception hierarchy. <code>requests</code> exposes a top level <code>RequestException</code>, where as <code>httpx</code> exposes a top level <code>HTTPError</code>. see the exceptions exposes in requests <a href="https://requests.readthedocs.io/en/latest/_modules/requests/exceptions/">here</a>. See the <code>httpx</code> error hierarchy <a href="https://www.python-httpx.org/exceptions/">here</a>.</p>
</article>
</div>
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
</div>
</main>
<footer class="md-footer">
<div class="md-footer-meta md-typeset">
<div class="md-footer-meta__inner md-grid">
<div class="md-copyright">
Made with
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
Material for MkDocs
</a>
</div>
</div>
</div>
</footer>
</div>
<div class="md-dialog" data-md-component="dialog">
<div class="md-dialog__inner md-typeset"></div>
</div>
<script id="__config" type="application/json">{"base": "..", "features": [], "search": "../assets/javascripts/workers/search.6ce7567c.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
<script src="../assets/javascripts/bundle.83f73b43.min.js"></script>
</body>
</html>