XuqmGroup-RNSDK/src/core/http.ts
XuqmGroup 67d54bf1f2 docs(sdk): 添加 Android SDK 文档和 API 设计规范
- 新增 Android SDK 使用文档,包含模块结构、集成方式和快速开始指南
- 添加 SDK API 重设计规范,统一初始化和登录接口设计
- 补充安全设计规范,完善 UserSig 鉴权和敏感数据处理方案
- 创建平台 REST API 规范,定义服务端到服务端的调用接口
- 添加离线推送架构设计,集成各大厂商推送服务与 IM 联动方案
2026-04-29 15:46:40 +08:00

50 行
1.4 KiB
TypeScript

import AsyncStorage from '@react-native-async-storage/async-storage'
import { getConfig } from './config'
const TOKEN_KEY = '@xuqm_sdk_token'
const DEFAULT_API_URL = 'https://dev.xuqinmin.com'
export async function getToken(): Promise<string | null> {
return AsyncStorage.getItem(TOKEN_KEY)
}
export async function saveToken(token: string): Promise<void> {
return AsyncStorage.setItem(TOKEN_KEY, token)
}
export async function clearToken(): Promise<void> {
return AsyncStorage.removeItem(TOKEN_KEY)
}
export async function apiRequest<T>(
path: string,
options: { method?: string; body?: unknown; params?: Record<string, string> } = {},
): Promise<T> {
const config = getConfig()
const token = await getToken()
let url = DEFAULT_API_URL.replace(/\/$/, '') + path
if (options.params) {
const qs = new URLSearchParams(options.params).toString()
url += (url.includes('?') ? '&' : '?') + qs
}
const res = await fetch(url, {
method: options.method ?? 'GET',
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
...(token ? { Authorization: `Bearer ${token}` } : {}),
},
body: options.body ? JSON.stringify(options.body) : undefined,
})
if (!res.ok) {
const err = await res.json().catch(() => ({ message: res.statusText }))
throw new Error(err.message ?? `HTTP ${res.status}`)
}
const json = await res.json()
return json.data ?? json
}