You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: slides/03-httpx/httpx.md
+33-15Lines changed: 33 additions & 15 deletions
Original file line number
Diff line number
Diff line change
@@ -25,18 +25,39 @@ Cours 3 : utiliser `httpx`
25
25
26
26
<!-- #endregion -->
27
27
28
-
**Note** La bibliothèque [request](https://requests.readthedocs.io), un peu moins moderne est aussi très utilisée, ça peut valoir le coup d'y jeter un œil.
28
+
**Note** La bibliothèque [requests](https://requests.readthedocs.io), un peu moins moderne est aussi
29
+
très utilisée, ça peut valoir le coup d'y jeter un œil.
29
30
30
-
<!-- #region -->
31
-
**Note** Si vos requêtes sur httpbin font des timeouts, vous pouvez essayer avec
32
-
`https://httpbingo.org` à la place. En désespoir de cause, lancez netcat avec `nc -kdl 8000` et
33
-
faites vos requêtes `http://localhost:8000`, vos requêtes feront des timeout (netcat ne répond pas),
34
-
mais au moins vous les verrez dans le terminal. Une autre solution est de lancer httpbin en local avec Docker :
**Note** Si vos requêtes sur httpbin (qui n'est plus maintenu au 2024-11-26) font des timeouts, vous
33
+
pouvez essayer avec `https://httpbingo.org` à la place. Sinon vous pouvez utiliser httpbin en local
34
+
(attention, ça ne marchera donc pas sur Binder). Installez-le (dans un venv bien sûr) si besoin (il
35
+
est maintenant dans le `requirements.txt` du cours).
36
+
37
+
```bash
38
+
python -m pip install gunicorn httpbin
39
+
```
40
+
41
+
ou avec [uv](https://docs.astral.sh/uv/)
42
+
43
+
```bash
44
+
uv pip install gunicorn httpbin
45
+
```
46
+
47
+
Il se lance ensuite avec
35
48
36
49
```bash
37
-
docker pull kennethreitz/httpbin
38
-
docker run -p 80:80 kennethreitz/httpbin
50
+
gunicorn httpbin:app
39
51
```
52
+
53
+
Si vous le laisser tourner dans un terminal, vous pouvez ensuite envoyer vos requêtes à
54
+
`http://localhost:8000`. Arrêtez-le avec <kbd>ctrl</kbd>+<kbd>C</kbd>. Voir
55
+
<https://github.com/psf/httpbin> pour plus d'info (par exemple comment faire ça avec Docker).
56
+
57
+
En désespoir de cause, lancez netcat avec `nc -kdl 8000` et faites vos requêtes
58
+
`http://localhost:8000`, vos requêtes feront des timeout (netcat ne répond pas), mais au moins vous
59
+
les verrez dans le terminal.
60
+
40
61
<!-- #endregion -->
41
62
42
63
## HTTP en Python
@@ -73,15 +94,16 @@ httpx doit être installé. Si vous avez installé le `requirements.txt` du cour
73
94
%pip install -U httpx[http2]
74
95
```
75
96
76
-
L'extra `[http2]` sert à installer les fonctions liées à HTTP/2, qu'on ne verra en principe pas dans ce cours mais qui peuvent être utilse. Si vous voulez aussi l'interface en ligne de commande (un genre de cURL), vous pouvez installer avec `[cli]`, ou `[http2, cli]` pour avoir les deux.
97
+
L'extra `[http2]` sert à installer les fonctions liées à HTTP/2, qu'on ne verra en principe pas dans
98
+
ce cours mais qui peuvent être utilse. Si vous voulez aussi l'interface en ligne de commande (un
99
+
genre de cURL), vous pouvez installer avec `[cli]`, ou `[http2, cli]` pour avoir les deux.
77
100
78
101
```python
79
102
import httpx
80
103
```
81
104
82
105
## Une première requête
83
106
84
-
85
107
Exécutez la cellule de code suivante
86
108
87
109
```python
@@ -150,7 +172,6 @@ print(response.text)
150
172
151
173
Dans le cas de la page d'accueil du site du master, il est assez conséquent, puisqu'il s'agit de tout le code HTML de la page.
152
174
153
-
154
175
`httpx` fait de son mieux pour déterminer automatiquement l'encodage du texte, mais s'il se trompe, le contenu sous forme binaire non décodée est toujours disponible dans l'attribut `content`.
155
176
156
177
```python
@@ -209,13 +230,10 @@ print(response.text)
209
230
210
231
Ah.
211
232
212
-
213
233
Quel est le problème ici ?
214
234
215
-
216
235
En fait, `httpx` ne sait passer que des paramètres binaires, et il encode implicitement les chaînes de caractères en `latin-1`, [comme c'est la norme](https://www.w3.org/Protocols/rfc2616/rfc2616-sec3.html#sec3.4.1).
217
236
218
-
219
237
Pour utiliser un autre encodage, il faut le faire à la main.
220
238
221
239
```python
@@ -291,7 +309,7 @@ chose) :
291
309
application/json`
292
310
10. Une requête GET à <https://www.google.com> avec le *header*`Accept-Encoding: gzip`.
293
311
11. Faites une requête à <https://httpbin.org/image> avec le *header*`Accept: image/png`.
294
-
Sauvegarder le résultat dans un fichier PNG et ouvrez-le dans une visualiseuse d'images.
312
+
Sauvegarder le résultat dans un fichier PNG et ouvrez-le dans une visualiseuse d'images.
295
313
12. Faites une requête PUT à <https://httpbin.org/anything>
296
314
13. Récupérez <https://httpbin.org/image/jpeg>, sauvegardez le résultat dans un fichier et ouvrez le
0 commit comments