]> git.ipfire.org Git - thirdparty/httpx.git/commitdiff
Add json interfaces
authorTom Christie <tom@tomchristie.com>
Fri, 17 May 2019 13:43:22 +0000 (14:43 +0100)
committerTom Christie <tom@tomchristie.com>
Fri, 17 May 2019 13:43:22 +0000 (14:43 +0100)
README.md
httpcore/client.py
httpcore/models.py
tests/client/test_async_client.py
tests/client/test_client.py

index a7315656d04b775cb3848e41fc813450f9faf7dc..d5333ba77f25b05dbcc5e002537361aeff19a3fd 100644 (file)
--- a/README.md
+++ b/README.md
@@ -102,10 +102,10 @@ inspiration around the lower level networking details.
 * `def .get(url, [params], [headers], [cookies], [auth], [stream], [allow_redirects], [ssl], [timeout])`
 * `def .options(url, [params], [headers], [cookies], [auth], [stream], [allow_redirects], [ssl], [timeout])`
 * `def .head(url, [params], [headers], [cookies], [auth], [stream], [allow_redirects], [ssl], [timeout])`
-* `def .post(url, [data], [params], [headers], [cookies], [auth], [stream], [allow_redirects], [ssl], [timeout])`
-* `def .put(url, [data], [params], [headers], [cookies], [auth], [stream], [allow_redirects], [ssl], [timeout])`
-* `def .patch(url, [data], [params], [headers], [cookies], [auth], [stream], [allow_redirects], [ssl], [timeout])`
-* `def .delete(url, [data], [params], [headers], [cookies], [auth], [stream], [allow_redirects], [ssl], [timeout])`
+* `def .post(url, [data], [json], [params], [headers], [cookies], [auth], [stream], [allow_redirects], [ssl], [timeout])`
+* `def .put(url, [data], [json], [params], [headers], [cookies], [auth], [stream], [allow_redirects], [ssl], [timeout])`
+* `def .patch(url, [data], [json], [params], [headers], [cookies], [auth], [stream], [allow_redirects], [ssl], [timeout])`
+* `def .delete(url, [data], [json], [params], [headers], [cookies], [auth], [stream], [allow_redirects], [ssl], [timeout])`
 * `def .prepare_request(request)`
 * `def .send(request, [stream], [allow_redirects], [ssl], [timeout])`
 * `def .close()`
@@ -145,7 +145,7 @@ what gets sent over the wire.*
 >>> response = client.send(request)
 ```
 
-* `def __init__(method, url, [params], [data], [headers], [cookies])`
+* `def __init__(method, url, [params], [data], [json], [headers], [cookies])`
 * `.method` - **str**
 * `.url` - **URL**
 * `.content` - **byte** or **byte async iterator**
index e2a272e00d1b22ff2c8c058dc68a244fd7a98ad1..cc31e844046c0dd67b9a77721cbd67d29dfd57a0 100644 (file)
@@ -137,6 +137,7 @@ class AsyncClient:
         url: URLTypes,
         *,
         data: RequestData = b"",
+        json: typing.Any = None,
         params: QueryParamTypes = None,
         headers: HeaderTypes = None,
         cookies: CookieTypes = None,
@@ -150,6 +151,7 @@ class AsyncClient:
             "POST",
             url,
             data=data,
+            json=json,
             params=params,
             headers=headers,
             cookies=cookies,
@@ -165,6 +167,7 @@ class AsyncClient:
         url: URLTypes,
         *,
         data: RequestData = b"",
+        json: typing.Any = None,
         params: QueryParamTypes = None,
         headers: HeaderTypes = None,
         cookies: CookieTypes = None,
@@ -178,6 +181,7 @@ class AsyncClient:
             "PUT",
             url,
             data=data,
+            json=json,
             params=params,
             headers=headers,
             cookies=cookies,
@@ -193,6 +197,7 @@ class AsyncClient:
         url: URLTypes,
         *,
         data: RequestData = b"",
+        json: typing.Any = None,
         params: QueryParamTypes = None,
         headers: HeaderTypes = None,
         cookies: CookieTypes = None,
@@ -206,6 +211,7 @@ class AsyncClient:
             "PATCH",
             url,
             data=data,
+            json=json,
             params=params,
             headers=headers,
             cookies=cookies,
@@ -221,6 +227,7 @@ class AsyncClient:
         url: URLTypes,
         *,
         data: RequestData = b"",
+        json: typing.Any = None,
         params: QueryParamTypes = None,
         headers: HeaderTypes = None,
         cookies: CookieTypes = None,
@@ -234,6 +241,7 @@ class AsyncClient:
             "DELETE",
             url,
             data=data,
+            json=json,
             params=params,
             headers=headers,
             cookies=cookies,
@@ -250,6 +258,7 @@ class AsyncClient:
         url: URLTypes,
         *,
         data: RequestData = b"",
+        json: typing.Any = None,
         params: QueryParamTypes = None,
         headers: HeaderTypes = None,
         cookies: CookieTypes = None,
@@ -263,6 +272,7 @@ class AsyncClient:
             method,
             url,
             data=data,
+            json=json,
             params=params,
             headers=headers,
             cookies=self.merge_cookies(cookies),
@@ -492,6 +502,7 @@ class Client:
         url: URLTypes,
         *,
         data: RequestData = b"",
+        json: typing.Any = None,
         params: QueryParamTypes = None,
         headers: HeaderTypes = None,
         cookies: CookieTypes = None,
@@ -505,6 +516,7 @@ class Client:
             method,
             url,
             data=data,
+            json=json,
             params=params,
             headers=headers,
             cookies=self._client.merge_cookies(cookies),
@@ -600,6 +612,7 @@ class Client:
         url: URLTypes,
         *,
         data: RequestData = b"",
+        json: typing.Any = None,
         params: QueryParamTypes = None,
         headers: HeaderTypes = None,
         cookies: CookieTypes = None,
@@ -613,6 +626,7 @@ class Client:
             "POST",
             url,
             data=data,
+            json=json,
             headers=headers,
             cookies=cookies,
             stream=stream,
@@ -627,6 +641,7 @@ class Client:
         url: URLTypes,
         *,
         data: RequestData = b"",
+        json: typing.Any = None,
         params: QueryParamTypes = None,
         headers: HeaderTypes = None,
         cookies: CookieTypes = None,
@@ -640,6 +655,7 @@ class Client:
             "PUT",
             url,
             data=data,
+            json=json,
             headers=headers,
             cookies=cookies,
             stream=stream,
@@ -654,6 +670,7 @@ class Client:
         url: URLTypes,
         *,
         data: RequestData = b"",
+        json: typing.Any = None,
         params: QueryParamTypes = None,
         headers: HeaderTypes = None,
         cookies: CookieTypes = None,
@@ -667,6 +684,7 @@ class Client:
             "PATCH",
             url,
             data=data,
+            json=json,
             headers=headers,
             cookies=cookies,
             stream=stream,
@@ -681,6 +699,7 @@ class Client:
         url: URLTypes,
         *,
         data: RequestData = b"",
+        json: typing.Any = None,
         params: QueryParamTypes = None,
         headers: HeaderTypes = None,
         cookies: CookieTypes = None,
@@ -694,6 +713,7 @@ class Client:
             "DELETE",
             url,
             data=data,
+            json=json,
             headers=headers,
             cookies=cookies,
             stream=stream,
index c36c7a84233d465e9c758054b7dafea7626a7651..69ad6b15729af0d415de2bd38d1039c91b1306dc 100644 (file)
@@ -1,7 +1,7 @@
 import asyncio
 import cgi
 import email.message
-import json
+import json as jsonlib
 import typing
 import urllib.request
 from collections.abc import MutableMapping
@@ -481,6 +481,7 @@ class Request:
         url: typing.Union[str, URL],
         *,
         data: RequestData = b"",
+        json: typing.Any = None,
         params: QueryParamTypes = None,
         headers: HeaderTypes = None,
         cookies: CookieTypes = None,
@@ -492,6 +493,10 @@ class Request:
             self._cookies = Cookies(cookies)
             self._cookies.set_cookie_header(self)
 
+        if json is not None:
+            data = jsonlib.dumps(json).encode("utf-8")
+            self.headers["Content-Type"] = "application/json"
+
         if isinstance(data, bytes):
             self.is_streaming = False
             self.content = data
@@ -775,7 +780,7 @@ class Response:
             raise HttpError(message)
 
     def json(self) -> typing.Any:
-        return json.loads(self.content.decode("utf-8"))
+        return jsonlib.loads(self.content.decode("utf-8"))
 
     @property
     def cookies(self) -> "Cookies":
index a1156545949486efd9532f777541646598a5473a..01f458532f0d7c39d949ea9a6e98096131725fcc 100644 (file)
@@ -23,6 +23,14 @@ async def test_post(server):
     assert response.status_code == 200
 
 
+@pytest.mark.asyncio
+async def test_post_json(server):
+    url = "http://127.0.0.1:8000/"
+    async with httpcore.AsyncClient() as client:
+        response = await client.post(url, json={"text": "Hello, world!"})
+    assert response.status_code == 200
+
+
 @pytest.mark.asyncio
 async def test_stream_response(server):
     async with httpcore.AsyncClient() as client:
index 820efec1752c20c2f770d34f1958310ab6eeb4ff..f3663f691685c0af44f39c8cc70f1c26034d45c9 100644 (file)
@@ -48,6 +48,14 @@ def test_post(server):
     assert response.reason_phrase == "OK"
 
 
+@threadpool
+def test_post_json(server):
+    with httpcore.Client() as http:
+        response = http.post("http://127.0.0.1:8000/", json={"text": "Hello, world!"})
+    assert response.status_code == 200
+    assert response.reason_phrase == "OK"
+
+
 @threadpool
 def test_stream_response(server):
     with httpcore.Client() as http: