近日在做摄像头接口的调试,需要用到Digest认证,经过试验,代码如下:
一、同步版(pip install requests)
python
import requests
from requests.auth import HTTPDigestAuth
host = 'https://192.168.0.2'
path = '/api/xxx'
path2 = '/another/api'
AUTH = ('username', 'password')
r = requests.get(host+path, verify=False, auth=HTTPDigestAuth(*AUTH))
print(r.status_code)
print(r.text)
payload = {'a': 1}
r2 = requests.put(host+path2, verify=False, auth=HTTPDigestAuth(*AUTH), json=payload)
print(r2.status_code)
print(r2.json())
二、异步协程版(pip install httpx)
python
import asyncio
from httpx import AsyncClient, DigestAuth
host = 'https://192.168.0.2'
path = '/api/xxx'
path2 = '/another/api'
AUTH = ('username', 'password')
async def main():
async with AsyncClient(base_url=host, verify=False, auth=DigestAuth(*AUTH)):
r = await client.get(path)
payload = {'a': 1}
r2 = await client.put(path2, json=payload)
print(r.status_code)
print(r.text)
print(r2.status_code)
print(r2.json())
if __name__ == '__main__':
asyncio.run(main())
封装成工具类之后的代码如下
python
import os
import requests
from httpx import AsyncClient, DigestAuth
AUTH = (os.environ["API_USER"], os.environ["API_PASS"])
class HttpClient:
PATH_GET = "/get-sth"
PATH_PUT = "/put"
@staticmethod
def sync_request(method: str, host: str, path: str, **kw) -> requests.Response:
url = host.rstrip("/") + path
return requests.request(
method, url, verify=False, auth=requests.auth.HTTPDigestAuth(*AUTH), **kw
)
@classmethod
def sync_get(cls, host: str, params=None, path: str | None = None) -> dict:
if path is None:
path = cls.PATH_GET
r = cls.sync_request("GET", host, path, params=params)
r.raise_for_status()
return r.json()
@classmethod
def sync_put(cls, payload: dict, host: str, path: str | None = None) -> dict:
if path is None:
path = cls.PATH_PUT
r = cls.sync_request("PUT", host, path, json=payload)
r.raise_for_status()
return r.json()
@staticmethod
def async_client(host: str) -> AsyncClient:
return AsyncClient(base_url=host, verify=False, auth=DigestAuth(*AUTH))
@classmethod
async def get(cls, host: str, params=None, path: str | None = None) -> dict:
async with cls.async_client(host) as client:
r = await client.get(path or cls.PATH_GET, params=params)
return r.json()
@classmethod
async def put(cls, payload: dict, host: str, path: str | None = None) -> dict:
async with cls.async_client(host) as client:
r = await client.put(path or cls.PATH_PUT, json=payload)
return r.json()