
本文详解如何通过 http api 实现 go 服务端与 angularjs 客户端的数据交互,重点说明路由定义、json 编解码、请求响应处理及前后端对接的关键约定。
本文详解如何通过 http api 实现 go 服务端与 angularjs 客户端的数据交互,重点说明路由定义、json 编解码、请求响应处理及前后端对接的关键约定。
要让 AngularJS 成功调用 Go 后端,核心在于建立语义清晰、协议一致的 RESTful HTTP 接口。AngularJS(通过 $http 或 $resource)本质上是向指定 URL 发起标准 HTTP 请求(如 GET/POST),Go 后端则需提供对应路径的处理器(Handler),接收请求、解析数据、执行业务逻辑,并以 JSON 格式返回响应——二者通过 HTTP 协议和 JSON 数据格式完成松耦合通信。
✅ Go 端:定义可访问的 API 路由与处理器
Go 使用标准 net/http 包即可快速搭建轻量 API 服务。关键步骤包括:
- 注册路由路径(如 /api/users);
- 编写 Handler 函数,统一处理请求体解析、业务逻辑、响应序列化;
- 设置响应头(如 Content-Type: application/json),确保前端正确解析。
以下是一个生产就绪的示例(已优化原始代码,增强健壮性与可维护性):
package main
import (
"encoding/json"
"fmt"
"io"
"log"
"net/http"
)
// 响应统一结构体(推荐)
type APIResponse struct {
Success bool `json:"success"`
Message string `json:"message,omitempty"`
Data interface{} `json:"data,omitempty"`
}
func respondJSON(w http.ResponseWriter, status int, resp APIResponse) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(status)
json.NewEncoder(w).Encode(resp)
}
// 示例业务结构体
type User struct {
ID int `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
}
func doBusinessLogicWithData(data []byte) (User, error) {
var user User
if err := json.Unmarshal(data, &user); err != nil {
return User{}, fmt.Errorf("invalid JSON: %w", err)
}
// 模拟保存逻辑(如写入数据库)
user.ID = 123 // 假设生成 ID
return user, nil
}
func apiHandler(w http.ResponseWriter, r *http.Request) {
// 1. 验证 HTTP 方法
if r.Method != http.MethodPost {
respondJSON(w, http.StatusMethodNotAllowed, APIResponse{
Success: false,
Message: "Only POST method is allowed",
})
return
}
// 2. 读取并解析请求体
data, err := io.ReadAll(r.Body)
if err != nil {
respondJSON(w, http.StatusBadRequest, APIResponse{
Success: false,
Message: "Failed to read request body",
})
return
}
defer r.Body.Close()
// 3. 执行业务逻辑
user, err := doBusinessLogicWithData(data)
if err != nil {
respondJSON(w, http.StatusBadRequest, APIResponse{
Success: false,
Message: err.Error(),
})
return
}
// 4. 返回结构化 JSON 响应
respondJSON(w, http.StatusOK, APIResponse{
Success: true,
Data: user,
})
}
func main() {
const serverPort = 8080
http.HandleFunc("/api/user", apiHandler) // 明确路径,避免模糊前缀匹配
log.Printf("? Go server listening on :%d", serverPort)
log.Fatal(http.ListenAndServe(fmt.Sprintf(":%d", serverPort), nil))
}
? 关键说明:/api/user 就是 AngularJS 中 $http.post('/api/user', userData) 所指向的后端端点(Endpoint)——它不是“某个变量”或“某个函数名”,而是一个可被 HTTP 客户端访问的 URL 路径,由 Go 的 http.HandleFunc 绑定并处理。
✅ AngularJS 端:使用 $http 调用该端点
在 AngularJS 控制器中,只需指定相同路径即可通信:
angular.module('myApp').controller('UserController', function($scope, $http) {
$scope.createUser = function() {
var userData = {
name: $scope.name,
email: $scope.email
};
$http.post('http://localhost:8080/api/user', userData)
.then(function(response) {
if (response.data.success) {
console.log('✅ Created:', response.data.data);
$scope.message = 'User saved successfully!';
} else {
$scope.error = response.data.message;
}
})
.catch(function(error) {
$scope.error = 'Network or server error: ' + error.status;
});
};
});
⚠️ 注意事项与最佳实践
-
CORS 问题:开发时若前端运行在 http://localhost:4200,而 Go 服务在 :8080,浏览器会拦截跨域请求。需在 Go Handler 中添加响应头:
w.Header().Set("Access-Control-Allow-Origin", "*") w.Header().Set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE") w.Header().Set("Access-Control-Allow-Headers", "Content-Type, Authorization")(生产环境请限制 Allow-Origin 到可信域名)
错误处理一致性:前后端应约定错误结构(如 {"success": false, "message": "..."}),便于 AngularJS 统一捕获提示。
路径设计建议:采用 REST 风格命名,如 /api/users(GET 列表)、/api/users/:id(GET 单个),便于 $resource 映射。
避免 fmt.Fprintln(w, string(jsonBytes)):直接打印字符串易导致编码/换行问题;务必使用 json.Encoder 并设置 Content-Type。
通过以上配置,Go 服务即成为一个标准的 JSON API 提供者,AngularJS 可像调用任意 Web API 一样与其交互——无需额外框架或中间件,纯标准 HTTP + JSON 即可高效协同。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











