From 5ecf7c5b65b53aa94bf94267352824909ecc799e Mon Sep 17 00:00:00 2001 From: miqlangelo Date: Tue, 6 May 2025 16:16:28 +0200 Subject: [PATCH] rest --- src/rest-api/axios.ts | 116 +++++++++++++++++++++++++++++++ src/rest-api/errors.ts | 15 ++++ src/rest-api/senden-empfangen.ts | 87 +++++++++++++++++++++++ 3 files changed, 218 insertions(+) create mode 100644 src/rest-api/axios.ts create mode 100644 src/rest-api/errors.ts create mode 100644 src/rest-api/senden-empfangen.ts diff --git a/src/rest-api/axios.ts b/src/rest-api/axios.ts new file mode 100644 index 0000000..abf13a6 --- /dev/null +++ b/src/rest-api/axios.ts @@ -0,0 +1,116 @@ +import axios from 'npm:axios'; +import { ApiError, NetworkError } from './errors.ts'; + +interface Post { + id: number; + title: string; + body: string; + userId: number; +} + +interface User { + id: number; + username: string; + email: string; +} + +const apiClient = axios.create({ + baseURL: 'https://dummyjson.com', + timeout: 2000, +}); + +apiClient.interceptors.response.use( + (response) => { + console.log('Interceptors response: ', response.data); + + response.data['timestamp'] = new Date(); + delete response.data['title']; + + return response; + }, + (error) => { + if (axios.isAxiosError(error)) { + console.error( + 'Interceptors: Fehler ', + error.response?.status, + error.message + ); + } else { + console.error('Unbekannter Fehler', error); + } + + return Promise.reject(error); + } +); + +async function fetchData(endpoint: string): Promise { + try { + const response = await apiClient.get(endpoint); + return response.data; + } catch (error) { + if (axios.isAxiosError(error)) { + throw new ApiError(error.response?.status ?? 500, error.message); + } + + throw new NetworkError( + 'Netzwerkfehler: ' + + (error instanceof Error ? error.message : 'Unbekannt') + ); + } +} + +async function fetchPost(): Promise { + try { + const post = await fetchData('/posts/1'); + console.log('Empfangene Daten', post.title); + } catch (error) { + console.log('Fehler beim Abrufen der Daten: ', error); + } +} + +fetchPost(); + +async function createPost(): Promise { + const payload: Omit = { + title: 'TypeScript mit Axios', + body: 'Dies ist ein Testpost', + userId: 1, + }; + + try { + const response = await apiClient.post('/posts/add', payload); + console.log('Erstellter Post', response.data); + } catch (error) { + console.log('Fehler beim Erstellen des Posts: ', error); + } +} + +createPost(); + +async function fetchWithRetry( + endpoint: string, + retries = 3, + delay = 1000 +): Promise { + for (let attempt = 1; attempt <= retries; attempt++) { + try { + return await fetchData(endpoint); + } catch (error) { + if (attempt < retries) { + await new Promise((resolve) => setTimeout(resolve, delay)); + delay *= 2; + } else { + console.error( + 'API endgültig fehlgeschlagen nach ', + retries, + 'Versuchen: ', + error + ); + return null; + } + } + } + return null; +} + +fetchWithRetry('/users/1?delay=5000'); diff --git a/src/rest-api/errors.ts b/src/rest-api/errors.ts new file mode 100644 index 0000000..1cdbd03 --- /dev/null +++ b/src/rest-api/errors.ts @@ -0,0 +1,15 @@ +export class ApiError extends Error { + constructor(public status: number, message: string) { + super(message); + this.name = 'ApiError'; + } +} + +export class NetworkError extends Error { + public status = 510; + + constructor(message: string) { + super(message); + this.name = 'NetworkError'; + } +} diff --git a/src/rest-api/senden-empfangen.ts b/src/rest-api/senden-empfangen.ts new file mode 100644 index 0000000..d95e3a6 --- /dev/null +++ b/src/rest-api/senden-empfangen.ts @@ -0,0 +1,87 @@ +async function fetchData() { + try { + const response = await fetch('https://dummyjson.com/posts/1aaa'); + if (!response.ok) { + throw new Error('Http-Fehler! Status: ' + response.status); + } + console.log(await response.json()); + } catch (error) { + console.log('Fehler beim Aufrufen der Daten: ', error); + } +} + +fetchData(); + +async function sendData() { + const payload = { + title: 'TypeScript REST', + userId: 1, + body: 'Dies ist ein Beispiel Post', + }; + + try { + const response = await fetch('https://dummyjson.com/posts/add', { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify(payload), + }); + + if (!response.ok) { + throw new Error('Http-Fehler! Status: ' + response.status); + } + + const data = await response.json(); + console.log('Antwort der API: ', data); + } catch (error) { + console.error('Fehler beim Senden der Daten: ', error); + } +} + +sendData(); + +async function fetchWithParams(username: string) { + try { + const response = await fetch( + `https://dummyjson.com/users/search?q=${username}` + ); + + if (!response.ok) { + throw new Error('Http-Fehler! Status: ' + response.status); + } + console.log(await response.json()); + } catch (error) { + console.log('Fehler beim Aufrufen der Daten: ', error); + } +} + +fetchWithParams('John'); + +async function fetchDataWithTimeout() { + const controller = new AbortController(); + const timeoutId = setTimeout(() => controller.abort(), 3000); + + try { + const response = await fetch('https://dummyjson.com/users/1?delay=5000', { + signal: controller.signal, + }); + + clearTimeout(timeoutId); + + if (!response.ok) { + throw new Error('Http-Fehler! Status: ' + response.status); + } + + console.log(await response.json()); + } catch (error: unknown) { + console.log(error); + if ((error as Error)?.name === 'AbortError') { + console.log('Anfrage abgebrochen wegen Timeout'); + } else { + console.log('Fehler beim Aufrufen der Daten: ', error); + } + } +} + +fetchDataWithTimeout();