diff --git a/netx_api/ume_client.py b/netx_api/ume_client.py index ef8c512..c8b2cb1 100644 --- a/netx_api/ume_client.py +++ b/netx_api/ume_client.py @@ -175,10 +175,10 @@ class UMEClient: return headers def _client(self) -> httpx.Client: - # Force HTTP/1.1 (disable HTTP/2) due to UME server compatibility issues. - # httpx defaults to HTTP/1.1 unless http2=True, but some environments still - # negotiate/behave unexpectedly; be explicit here. - return httpx.Client(verify=self.verify_tls, timeout=self.timeout_s, http2=False) + # Use explicit HTTPTransport to keep behavior consistent with onsite validation. + # In this mode, requests run over HTTP/1.1 and avoid HTTP/2 negotiation issues. + transport = httpx.HTTPTransport() + return httpx.Client(verify=self.verify_tls, timeout=self.timeout_s, transport=transport) def _extract_token_and_ttl(self, payload: dict[str, Any]) -> tuple[str, int | None]: token = "" diff --git a/web/src/pages/UmePage.tsx b/web/src/pages/UmePage.tsx index 2dcdec4..21c2997 100644 --- a/web/src/pages/UmePage.tsx +++ b/web/src/pages/UmePage.tsx @@ -18,6 +18,7 @@ function toIsoNoMs(d: Date): string { export function UmePage() { const queryClient = useQueryClient(); + const [tokenOpError, setTokenOpError] = useState(""); const [syncPage, setSyncPage] = useState(1); const [syncPageSize, setSyncPageSize] = useState(20); const [neKeyword, setNeKeyword] = useState(""); @@ -71,15 +72,31 @@ export function UmePage() { }); const tokenRefreshMutation = useMutation({ mutationFn: refreshUmeToken, - onSuccess: async () => { + onSuccess: async (res) => { + if (!res?.ok) { + setTokenOpError(String(res.error || res.error_kind || "token_refresh_failed")); + } else { + setTokenOpError(""); + } await queryClient.invalidateQueries({ queryKey: ["umeTokenStatus"] }); }, + onError: (err) => { + setTokenOpError(String(err)); + }, }); const tokenDisconnectMutation = useMutation({ mutationFn: disconnectUmeToken, - onSuccess: async () => { + onSuccess: async (res) => { + if (!res?.ok) { + setTokenOpError(String(res.error || res.error_kind || "token_disconnect_failed")); + } else { + setTokenOpError(""); + } await queryClient.invalidateQueries({ queryKey: ["umeTokenStatus"] }); }, + onError: (err) => { + setTokenOpError(String(err)); + }, }); const tokenExpiresIn = Number(tokenStatusQuery.data?.expires_in_s || 0); @@ -151,9 +168,9 @@ export function UmePage() { 断开 token - {(tokenRefreshMutation.error || tokenDisconnectMutation.error) && ( + {(tokenOpError || tokenRefreshMutation.error || tokenDisconnectMutation.error) && (
- 操作失败: {String(tokenRefreshMutation.error || tokenDisconnectMutation.error)} + 操作失败: {tokenOpError || String(tokenRefreshMutation.error || tokenDisconnectMutation.error)}
)}