在 TypeScript 前端中使用 Umi-Request 調用 Java 接口的完整指南

下面我將詳細介紹如何在基于 TypeScript 的前端項目中使用 umi-request 調用 IntelliJ IDEA 中開發的 Java 接口,包括完整的實現方案和代碼示例。

整體方案設計

一、Java 后端接口準備

1. 創建 Spring Boot 控制器

// src/main/java/com/example/demo/controller/UserController.java
@RestController
@RequestMapping("/api")
public class UserController {@GetMapping("/users")public ResponseEntity<List<UserDTO>> getUsers() {// 實際業務邏輯 - 從數據庫獲取用戶List<UserDTO> users = userService.getAllUsers();return ResponseEntity.ok(users);}@PostMapping("/users")public ResponseEntity<UserDTO> createUser(@RequestBody UserDTO userDTO) {UserDTO savedUser = userService.createUser(userDTO);return new ResponseEntity<>(savedUser, HttpStatus.CREATED);}@GetMapping("/users/{id}")public ResponseEntity<UserDTO> getUserById(@PathVariable Long id) {UserDTO user = userService.getUserById(id);return ResponseEntity.ok(user);}
}

2. 定義 DTO 對象

// src/main/java/com/example/demo/dto/UserDTO.java
public class UserDTO {private Long id;private String username;private String email;private LocalDateTime createdAt;// 必須有無參構造函數public UserDTO() {}// 必須有 getter 和 setterpublic Long getId() { return id; }public void setId(Long id) { this.id = id; }// ...其他 getter/setter
}

3. 解決跨域問題

// src/main/java/com/example/demo/config/WebConfig.java
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addCorsMappings(CorsRegistry registry) {registry.addMapping("/api/**").allowedOrigins("http://localhost:8000") // 前端開發地址.allowedMethods("GET", "POST", "PUT", "DELETE").allowedHeaders("*").allowCredentials(true).maxAge(3600);}
}

二、前端配置與實現

1. 安裝 umi-request

npm install umi-request --save
# 或
yarn add umi-request

2. 創建請求工具文件

src/utils/request.ts

import { extend } from 'umi-request';
import { notification } from 'antd';// 定義后端接口基礎URL
const API_BASE_URL = process.env.NODE_ENV === 'production' ? 'https://api.yourdomain.com' : 'http://localhost:8080';// 創建請求實例
const request = extend({prefix: API_BASE_URL,timeout: 10000,headers: {'Content-Type': 'application/json',},errorHandler: (error) => {// 統一錯誤處理const { response } = error;if (response && response.status) {const errorText = response.statusText || '請求錯誤';const { status } = response;notification.error({message: `請求錯誤 ${status}`,description: errorText,});} else if (!response) {notification.error({message: '網絡異常',description: '無法連接到服務器,請檢查網絡',});}return Promise.reject(error);},
});// 請求攔截器
request.interceptors.request.use((url, options) => {// 添加認證 tokenconst token = localStorage.getItem('token');if (token) {options.headers = {...options.headers,Authorization: `Bearer ${token}`,};}return { url, options };
});// 響應攔截器
request.interceptors.response.use(async (response) => {const data = await response.clone().json();// 處理業務邏輯錯誤if (data && data.code !== 0) {notification.error({message: '操作失敗',description: data.message || '服務器返回錯誤',});}return response;
});export default request;

3. 定義 TypeScript 接口類型

src/services/types.ts

// 用戶數據類型
export interface User {id: number;username: string;email: string;createdAt: string; // 前端通常使用字符串表示日期
}// 創建用戶參數
export interface CreateUserParams {username: string;email: string;password: string;
}// API 響應格式
export interface ApiResponse<T> {code: number;message: string;data: T;
}

4. 創建 API 服務

src/services/userService.ts

import request from '@/utils/request';
import { User, CreateUserParams, ApiResponse } from './types';// 獲取用戶列表
export async function getUsers(): Promise<ApiResponse<User[]>> {return request('/api/users', {method: 'GET',});
}// 創建用戶
export async function createUser(params: CreateUserParams
): Promise<ApiResponse<User>> {return request('/api/users', {method: 'POST',data: params,});
}// 獲取單個用戶
export async function getUserById(id: number
): Promise<ApiResponse<User>> {return request(`/api/users/${id}`, {method: 'GET',});
}

5. 在 React 組件中使用

src/pages/UserList/index.tsx

import React, { useState, useEffect } from 'react';
import { Table, Button, Form, Input, message } from 'antd';
import { getUsers, createUser } from '@/services/userService';
import type { User, CreateUserParams } from '@/services/types';const UserList: React.FC = () => {const [users, setUsers] = useState<User[]>([]);const [loading, setLoading] = useState(false);const [form] = Form.useForm();// 加載用戶數據const loadUsers = async () => {setLoading(true);try {const response = await getUsers();if (response.code === 0) {setUsers(response.data);}} catch (error) {message.error('加載用戶數據失敗');} finally {setLoading(false);}};useEffect(() => {loadUsers();}, []);// 提交新用戶表單const handleSubmit = async (values: CreateUserParams) => {try {const response = await createUser(values);if (response.code === 0) {message.success('用戶創建成功');form.resetFields();loadUsers(); // 刷新列表}} catch (error) {message.error('創建用戶失敗');}};const columns = [{title: 'ID',dataIndex: 'id',key: 'id',},{title: '用戶名',dataIndex: 'username',key: 'username',},{title: '郵箱',dataIndex: 'email',key: 'email',},{title: '創建時間',dataIndex: 'createdAt',key: 'createdAt',},];return (<div style={{ padding: 24 }}><h2>用戶管理</h2>{/* 用戶列表 */}<Table dataSource={users} columns={columns} loading={loading}rowKey="id"/>{/* 創建用戶表單 */}<Formform={form}layout="vertical"onFinish={handleSubmit}style={{ marginTop: 24, maxWidth: 500 }}><Form.Itemlabel="用戶名"name="username"rules={[{ required: true, message: '請輸入用戶名' }]}><Input placeholder="請輸入用戶名" /></Form.Item><Form.Itemlabel="郵箱"name="email"rules={[{ required: true, message: '請輸入郵箱' },{ type: 'email', message: '請輸入有效的郵箱地址' }]}><Input placeholder="請輸入郵箱" /></Form.Item><Form.Itemlabel="密碼"name="password"rules={[{ required: true, message: '請輸入密碼' }]}><Input.Password placeholder="請輸入密碼" /></Form.Item><Form.Item><Button type="primary" htmlType="submit">創建用戶</Button></Form.Item></Form></div>);
};export default UserList;

三、環境配置與優化

1. 配置環境變量

.env.development

# 開發環境配置
API_BASE_URL=http://localhost:8080

.env.production

# 生產環境配置
API_BASE_URL=https://api.yourdomain.com

修改 request.ts

const API_BASE_URL = process.env.API_BASE_URL || 'http://localhost:8080';

2. 接口文檔集成(可選)

在 Java 項目中添加 Swagger 支持:

// pom.xml
<dependency><groupId>io.springfox</groupId><artifactId>springfox-boot-starter</artifactId><version>3.0.0</version>
</dependency>// SwaggerConfig.java
@Configuration
@EnableSwagger2
public class SwaggerConfig {@Beanpublic Docket api() {return new Docket(DocumentationType.SWAGGER_2).select().apis(RequestHandlerSelectors.any()).paths(PathSelectors.any()).build();}
}

前端可以通過訪問?http://localhost:8080/swagger-ui/?查看 API 文檔

3. 安全認證處理

Java 端添加 JWT 認證

@PostMapping("/login")
public ResponseEntity<AuthResponse> login(@RequestBody LoginRequest request) {// 驗證用戶名密碼// 生成 JWT tokenString token = JwtUtil.generateToken(userDetails);return ResponseEntity.ok(new AuthResponse(token));
}

前端處理認證

// 在 request.ts 的攔截器中
request.interceptors.request.use((url, options) => {// 排除登錄接口if (url.includes('/login')) return { url, options };const token = localStorage.getItem('token');if (token) {options.headers = {...options.headers,Authorization: `Bearer ${token}`,};}return { url, options };
});// 處理 401 未授權
request.interceptors.response.use(async (response) => {if (response.status === 401) {// 跳轉到登錄頁window.location.href = '/login';}return response;
});

四、調試與錯誤排查

常見問題解決方案

問題可能原因解決方案
404 錯誤接口路徑錯誤檢查前后端路徑是否一致
403 錯誤跨域問題確認后端 CORS 配置正確
401 錯誤未授權檢查認證 token 是否有效
500 錯誤后端異常查看 Java 控制臺日志
網絡錯誤服務未啟動確認 Java 服務正在運行

調試工具

  1. 瀏覽器開發者工具

    • Network 標簽查看請求/響應詳情

    • Console 查看錯誤信息

  2. Postman 測試接口

    • 直接測試 Java 接口是否正常工作

  3. IDEA HTTP Client

    • 在 IDEA 中創建?.http?文件測試接口

### 獲取用戶列表
GET http://localhost:8080/api/users### 創建用戶
POST http://localhost:8080/api/users
Content-Type: application/json{"username": "testuser","email": "test@example.com","password": "password123"
}

五、生產環境部署

Nginx 配置示例

nginxserver {listen 80;server_name yourdomain.com;# 前端靜態文件location / {root /path/to/frontend/dist;index index.html;try_files $uri $uri/ /index.html;}# 后端 API 代理location /api {proxy_pass http://localhost:8080;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;}# 其他配置...
}

總結

通過以上步驟,你可以完整實現 TypeScript 前端使用 umi-request 調用 Java 接口的功能:

  1. Java 后端:創建 RESTful API 并解決跨域問題

  2. 前端配置:設置 umi-request 實例和攔截器

  3. 類型安全:定義 TypeScript 接口類型

  4. 服務封裝:創建 API 服務模塊

  5. 組件集成:在 React 組件中調用 API

  6. 環境配置:設置不同環境的 API 地址

  7. 安全認證:集成 JWT 認證機制

  8. 部署優化:配置生產環境部署方案

這種架構提供了清晰的分離和類型安全,使得前后端開發可以并行進行,同時保持了代碼的可維護性和可擴展性。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/84921.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/84921.shtml
英文地址,請注明出處:http://en.pswp.cn/web/84921.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

GO Gin Web框架面試題及參考答案

目錄 Gin 與 net/http 有哪些主要區別?為什么選擇 Gin? 如何使用 Gin 啟動一個 HTTP 服務并設置默認路由? Gin 的默認路由和自定義路由器組是如何工作的? 如何在 Gin 中綁定請求參數(Query、Form、JSON、XML)? 如何在 Gin 中使用中間件?中間件執行順序是怎樣的? …

asp.net core Razor動態語言編程代替asp.net .aspx更高級嗎?

For Each item In products<tr><td>item.Id</td><td>item.Name</td><td>item.Price.ToString("C")</td></tr>Next為什么要用<tr> ? 在Blazor的Razor語法中&#xff0c;使用<tr>是為了在VB.NET代碼塊中…

css語法中的選擇器與屬性詳解:嵌套聲明、集體聲明、全局聲明、混合選擇器

嵌套聲明 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>嵌套聲明</title> <!-- 這里p span 的含義是p標簽下面的span標簽 所以有嵌套關系--><style>p span {font-weight:…

Linux 系統中,/usr/bin/ 和/bin/的區別?

在 Linux 系統中&#xff0c;/bin/ 和 /usr/bin/ 都是存放可執行程序&#xff08;命令&#xff09;的目錄&#xff0c;但它們在歷史定位、用途、掛載策略和系統設計上有一定區別。 ? 快速對比總結 項目/bin//usr/bin/全稱含義binary&#xff08;核心二進制&#xff09;user b…

蒼穹外賣--WebSocket、來單提醒、客戶催單

WebSocket 1.介紹 WebSocket是基于TCP的一種新的網絡協議。它實現了瀏覽器與服務器全雙工通信——瀏覽器和服務器只需要一次握手&#xff0c;兩者之間就可以創建持久性的連接&#xff0c;并進行雙向數據傳送。 HTTP協議和WebSocket協議對比&#xff1a; ①Http是短連接 ②W…

Linux 信號(Signal)與信號量(Semaphore)區別

特性信號 (Signal)信號量 (Semaphore)本質軟件中斷進程間同步機制用途通知進程發生了某個事件控制對共享資源的訪問通信方向單向 (內核→進程 或 進程→進程)多進程共享數據類型整數信號編號內核維護的計數器持久性瞬時,不排隊持久,直到顯式釋放實現層次內核實現內核或用戶空…

華為OD機考-觀看文藝匯演問題-區間問題(JAVA 2025B卷)

import java.util.*; /*** version Ver 1.0* date 2025/6/20* description 觀看文藝匯演*/ public class WatchMovie {public static void main(String[] args) {Scanner sc new Scanner(System.in);int num Integer.parseInt(sc.nextLine());List<Movie> movies new …

DeepSeek今天喝什么隨機奶茶推薦器

用DeepSeek生成了一個隨機奶茶推薦器-今天喝什么&#xff0c;效果非常棒&#xff01;UI界面美觀。 提示詞prompt如下 用html5幫我生成一個今天喝什么的網頁 點擊按鈕隨機生成奶茶品牌等&#xff0c;要包括中國常見的知名的奶茶品牌 如果不滿意還可以隨機再次生成 ui界面要好看 …

【國產AI服務器】全國產PCIE5.0交換板,替代博通89104/89144,支持海光、龍芯等平臺

實物圖 核心硬件配置 1、控制器芯片? 采用國產TL63104控制芯片?&#xff0c;支持2.5GT/s、5GT/s、8GT/s、16GT/s、32GT/s的PCIe傳輸速率&#xff0c;支持968Lanes。支持6個x16的group和1個x8的group&#xff0c;每個group支持1至8個端口。x16group支持x16、x8、x4、x2端口…

GPIO-LED驅動

一、LED引腳說明 寄存器地址地圖&#xff1a; 原理圖&#xff1a; 關于MOS管的說明&#xff1a; 總結&#xff1a;當GPIO0_B5這個引腳輸出高電平的時候&#xff0c;對應的N-MOS管導通—LED點亮 當GPIO0_B5這個引腳輸出低電平的時候&#xff0c;對應的N-MOS管截止---LED熄滅 二…

Gartner《Generative AI Use - Case Comparison for Legal Departments》

概述 這篇文章由 Gartner, Inc. 出品,聚焦于生成式人工智能(GenAI)在法律部門中的應用情況,通過對 16 個較為突出的 GenAI 法律技術應用場景進行分析,從商業價值和可行性兩個維度進行評估,旨在為法律總顧問等提供戰略對話依據,以便更好地做出技術投資決策,推動法律部門…

Vue 中 filter 過濾的語法詳解與注意事項

Vue 中 filter 過濾的語法詳解與注意事項 在 Vue.js 中,"過濾"通常指兩種不同概念:模板過濾器(Vue 2 特性)和數組過濾(數據過濾)。由于 Vue 3 已移除模板過濾器,我將重點介紹更實用且通用的數組過濾語法和注意事項。 一、數組過濾核心語法(推薦方式) 1. …

webpack+vite前端構建工具 -6從loader本質看各種語言處理 7webpack處理html

6 從loader本質看各種語言處理 語法糖&#xff1f; 6.1 loader的本質 loader本質是一個方法&#xff0c;接收要處理的資源的內容&#xff0c;處理完畢后給出內容&#xff0c;作為打包結果。 所有的loader&#xff08;例如babel-loader, url-loader等&#xff09;export出一個方…

算法第41天|188.買賣股票的最佳時機IV、309.最佳買賣股票時機含冷凍期、714.買賣股票的最佳時機含手續費

188.買賣股票的最佳時機IV 題目 思路與解法 基于 買賣股票的最佳時機iii&#xff0c;得出的解法。關鍵在于&#xff0c;每一天的賣或者買都由前一天推導而來。 class Solution { public:int maxProfit(int k, vector<int>& prices) {if(prices.size() 0) return …

【AI News | 20250623】每日AI進展

AI Repos 1、tools Strands Agents Tools提供了一個強大的模型驅動方法&#xff0c;通過少量代碼即可構建AI Agent。它提供了一系列即用型工具&#xff0c;彌合了大型語言模型與實際應用之間的鴻溝&#xff0c;涵蓋文件操作、Shell集成、內存管理&#xff08;支持Mem0和Amazon…

Python裝飾器decorators和pytest夾具fixture詳解和使用

此前一直認為fixture就叫python中的裝飾器&#xff0c;學習后才發現decorators才是裝飾器&#xff0c;fixture是pytest框架的夾具&#xff0c;只是通過裝飾器去定義和使用。所以要了解fixture就得先了解python裝飾器。 一、裝飾器(decorators) 1.定義 裝飾器&#xff08;dec…

目標檢測之YOLOv5到YOLOv11——從架構設計和損失函數的變化分析

YOLO&#xff08;You Only Look Once&#xff09;系列作為實時目標檢測領域的標桿性框架&#xff0c;自2016年YOLOv1問世以來&#xff0c;已歷經十余年迭代。本文將聚焦YOLOv5&#xff08;2020年發布&#xff09;到YOLOv11&#xff08;2024年前后&#xff09;的核心技術演進&am…

leetcode:面試題 08.06. 漢諾塔問題

題目鏈接 面試題 08.06. 漢諾塔問題 題目描述 題目解析 當只有一個盤子時&#xff1a;直接從A柱放到C柱即可。當有兩個盤子時&#xff1a;將A柱第一個盤子先放到B柱&#xff0c;再將A柱第二個盤子放到C柱&#xff0c;最后將B柱上的盤子放到C柱子。當有3個盤子時&#xff1a;先…

mybatis-plus一對多關聯查詢

MyBatis-Plus 本身主要關注單表操作&#xff0c;但可以通過幾種方式實現一對多關聯查詢&#xff1a; 1. 使用 XML 映射文件實現 這是最傳統的方式&#xff0c;通過編寫 SQL 和 ResultMap 實現&#xff1a; <!-- UserMapper.xml --> <resultMap id"userWithOrd…

一些想法。。。

1.for里面的局部變量這種還是在for里面定義比較好 比如 for(int i 0;i<n;i){ int num; cin>>num; } 實不相瞞&#xff0c;有一次直接cin了i怎么都沒看出來哪里錯了。。。 2.關于long long 如果發現中間結果大約是10^9&#xff0c;就要考慮int 溢出 即用 long …