Files
Genarrative/src/editor/shared/jsonClient.ts
2026-05-28 15:42:46 +08:00

63 lines
1.5 KiB
TypeScript

import {
API_RESPONSE_ENVELOPE_HEADER,
API_RESPONSE_ENVELOPE_VERSION,
appendApiErrorRequestId,
parseApiErrorMessage,
unwrapApiResponse,
} from '../../../packages/shared/src/http';
export async function fetchJson<T>(
url: string,
fallbackMessage = '请求失败',
): Promise<T> {
const response = await fetch(url, {
headers: {
[API_RESPONSE_ENVELOPE_HEADER]: API_RESPONSE_ENVELOPE_VERSION,
},
});
const responseText = await response.text();
if (!response.ok) {
throw new Error(
appendApiErrorRequestId(
parseApiErrorMessage(
responseText,
`${fallbackMessage}: ${response.status}`,
),
response.headers.get('x-request-id'),
),
);
}
return responseText
? unwrapApiResponse<T>(JSON.parse(responseText) as T)
: ({} as T);
}
export async function saveJsonObject(
url: string,
payload: Record<string, unknown>,
fallbackMessage = '保存失败',
) {
const response = await fetch(url, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
[API_RESPONSE_ENVELOPE_HEADER]: API_RESPONSE_ENVELOPE_VERSION,
},
body: JSON.stringify(payload, null, 2),
});
const responseText = await response.text();
if (!response.ok) {
throw new Error(
appendApiErrorRequestId(
parseApiErrorMessage(responseText, fallbackMessage),
response.headers.get('x-request-id'),
),
);
}
}
export { appendApiErrorRequestId, parseApiErrorMessage };