是的,完全可以通过Go语言为React Web应用程序提供API服务。Go的标准库已经包含了强大的HTTP服务器功能,无需额外框架即可构建RESTful API。
以下是一个完整的示例,展示如何创建Go API服务器来服务React应用:
package main
import (
"encoding/json"
"log"
"net/http"
"time"
)
// 用户数据结构
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
CreatedAt time.Time `json:"created_at"`
}
// 模拟数据库
var users = []User{
{ID: 1, Name: "张三", Email: "zhangsan@example.com", CreatedAt: time.Now()},
{ID: 2, Name: "李四", Email: "lisi@example.com", CreatedAt: time.Now()},
}
func main() {
// 设置路由
http.HandleFunc("/api/users", usersHandler)
http.HandleFunc("/api/health", healthHandler)
// 处理React静态文件(生产环境)
fs := http.FileServer(http.Dir("./build"))
http.Handle("/", fs)
// 启动服务器
log.Println("服务器启动在 http://localhost:8080")
if err := http.ListenAndServe(":8080", nil); err != nil {
log.Fatal("服务器启动失败:", err)
}
}
// 用户API处理器
func usersHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
w.Header().Set("Access-Control-Allow-Origin", "*")
switch r.Method {
case http.MethodGet:
// 获取所有用户
json.NewEncoder(w).Encode(users)
case http.MethodPost:
// 创建新用户
var newUser User
if err := json.NewDecoder(r.Body).Decode(&newUser); err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
newUser.ID = len(users) + 1
newUser.CreatedAt = time.Now()
users = append(users, newUser)
json.NewEncoder(w).Encode(newUser)
default:
http.Error(w, "方法不允许", http.StatusMethodNotAllowed)
}
}
// 健康检查端点
func healthHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
response := map[string]string{
"status": "healthy",
"time": time.Now().Format(time.RFC3339),
}
json.NewEncoder(w).Encode(response)
}
对于React应用,你可以这样调用Go API:
// React组件示例
import React, { useState, useEffect } from 'react';
function UserList() {
const [users, setUsers] = useState([]);
useEffect(() => {
// 调用Go API获取用户数据
fetch('http://localhost:8080/api/users')
.then(response => response.json())
.then(data => setUsers(data))
.catch(error => console.error('Error:', error));
}, []);
return (
<div>
<h1>用户列表</h1>
<ul>
{users.map(user => (
<li key={user.id}>
{user.name} - {user.email}
</li>
))}
</ul>
</div>
);
}
export default UserList;
Go的标准库net/http已经足够强大,可以处理:
- 路由管理
- 请求/响应处理
- JSON序列化/反序列化
- 中间件支持
- 静态文件服务
如果需要更复杂的路由功能,可以考虑使用Gin、Echo或Chi等框架,但对于大多数API场景,标准库已经足够。