**Apache Airflow version**: 2.1.2

**Apache Airflow Provider versions** (please include all providers that are relevant to your bug):
apache-airflow-providers-ftp==2.0.0
apache-airflow-providers-imap==2.0.0
apache-airflow-providers-sqlite==2.0.0

**Environment**:

- **OS** (e.g. from /etc/os-release): Ubuntu
- **Python**: python 3.8
- **httpx**: httpx==0.6.8, httpx==0.18.2

**What happened**:

```
Traceback (most recent call last):
  File "./bug.py", line 6, in <module>
    response = airflow_client.trigger_dag(
  File "/home/user/my_project/venv38/lib/python3.8/site-packages/airflow/api/client/json_client.py", line 54, in trigger_dag
    data = self._request(
  File "/home/user/my_project/venv38/lib/python3.8/site-packages/airflow/api/client/json_client.py", line 38, in _request
    if not resp.ok:
AttributeError: 'Response' object has no attribute 'ok'
```


Json Client depends on httpx, which doesn't provide the attribute 'ok' and according to their spec (https://www.python-httpx.org/compatibility/) they are not going to do that. In the consequence handling the response crashes. 

**What you expected to happen**:

The expected outcome is to handle the response smoothly.

**How to reproduce it**:
```
#!/usr/bin/env python3

from airflow.api.client import json_client

airflow_client = json_client.Client("http://rnd.airflow.mydomain.com", None)
response = airflow_client.trigger_dag("my_dag", execution_date="2021-04-27T00:00:00")
```




**Anything else we need to know**:
The problem always occurs.
airflow/api/client/json_client.py
endpoint = f'/api/experimental/dags/{dag_id}/dag_runs'
        url = urljoin(self._api_base_url, endpoint)
        data = self._request(
            url,
            method='POST',
            json={
                "run_id": run_id,
                "conf": conf,
                "execution_date": execution_date,
            },
        )
        return data['message']
    def delete_dag(self, dag_id):
        endpoint = f'/api/experimental/dags/{dag_id}/delete_dag'
        url = urljoin(self._api_base_url, endpoint)
        data = self._request(url, method='DELETE')
        return data['message']
    def get_pool(self, name):
        endpoint = f'/api/experimental/pools/{name}'
        url = urljoin(self._api_base_url, endpoint)
        pool = self._request(url)
        return pool['pool'], pool['slots'], pool['description']
    def get_pools(self):