fix: исправить edge cases HttpClient
- ошибки парсинга успешных ответов проброшены в onError - добавлена защита от перезаписи явного Authorization - обновлены тесты, README и примеры кастомизации
This commit is contained in:
30
README.md
30
README.md
@@ -156,12 +156,15 @@ const http = new HttpClient({
|
||||
return params;
|
||||
}
|
||||
|
||||
const headers = new Headers(params.headers);
|
||||
|
||||
if (!headers.has('Authorization')) {
|
||||
headers.set('Authorization', `Bearer ${token}`);
|
||||
}
|
||||
|
||||
return {
|
||||
...params,
|
||||
headers: {
|
||||
...params.headers,
|
||||
Authorization: `Bearer ${token}`,
|
||||
},
|
||||
headers,
|
||||
};
|
||||
},
|
||||
onResponse: (response) => response,
|
||||
@@ -178,6 +181,8 @@ const http = new HttpClient({
|
||||
|
||||
`onRequest` вызывается перед `fetch`, `onResponse` после успешного ответа, `onError` для HTTP-ошибок, network errors и ошибок парсинга. Для защищенных endpoints generated operation передает `secure: true`, поэтому авторизацию можно добавлять только там, где она нужна.
|
||||
|
||||
`onError` должен либо бросить ошибку, либо вернуть fallback-значение, либо вернуть результат `context.retry()`. Если вернуть `undefined`, ошибка будет считаться обработанной, а вызывающий код получит `undefined` вместо исключения.
|
||||
|
||||
### Опции HttpClient
|
||||
|
||||
`HttpClient` принимает плоский конфиг. Стандартные `fetch`-опции можно задавать прямо в конструкторе вместе с кастомными hooks клиента.
|
||||
@@ -200,10 +205,10 @@ const http = new HttpClient({
|
||||
| `timeout` | `number` | Таймаут запроса в миллисекундах. Работает через `AbortSignal`. |
|
||||
| `customFetch` | `typeof fetch` | Замена стандартного `fetch`, например для тестов, SSR или custom transport. |
|
||||
| `paramsSerializer` | `(query) => string` | Кастомная сериализация query params в URL. |
|
||||
| `responseParser` | `(response, format) => unknown` | Кастомный парсинг response body. |
|
||||
| `responseParser` | `(response, format) => unknown` | Кастомный парсинг response body. Ошибки парсинга успешных ответов попадают в `onError`. |
|
||||
| `onRequest` | `(params, context) => params` | Request interceptor перед вызовом `fetch`. |
|
||||
| `onResponse` | `(response, context) => response` | Response interceptor после успешного HTTP ответа. |
|
||||
| `onError` | `(error, context) => result` | Error interceptor для HTTP ошибок, network errors, retry и refresh-token сценариев. |
|
||||
| `onError` | `(error, context) => result` | Error interceptor для HTTP ошибок, network errors, ошибок парсинга, retry и refresh-token сценариев. Должен вернуть fallback/retry или бросить ошибку. |
|
||||
|
||||
Также можно использовать другие стандартные поля `RequestInit`, доступные в вашей TypeScript/Runtime среде, если они не относятся к конкретному request body или cancellation lifecycle.
|
||||
|
||||
@@ -220,7 +225,7 @@ const http = new HttpClient({
|
||||
|
||||
### Рецепты Кастомизации
|
||||
|
||||
Авторизация через `onRequest`:
|
||||
Авторизация через `onRequest` без перезаписи явно переданного `Authorization`:
|
||||
|
||||
```typescript
|
||||
const http = new HttpClient({
|
||||
@@ -231,12 +236,15 @@ const http = new HttpClient({
|
||||
return params;
|
||||
}
|
||||
|
||||
const headers = new Headers(params.headers);
|
||||
|
||||
if (!headers.has('Authorization')) {
|
||||
headers.set('Authorization', `Bearer ${token}`);
|
||||
}
|
||||
|
||||
return {
|
||||
...params,
|
||||
headers: {
|
||||
...params.headers,
|
||||
Authorization: `Bearer ${token}`,
|
||||
},
|
||||
headers,
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user