发布于2026-07-19 阅读(0)
扫一扫,手机访问
要让 AngularJS 跟 Go 后端顺畅通信,说白了,核心就一件事:在 HTTP 协议之上,把接口的“规矩”定清楚,两边都严格遵守。AngularJS 这边,通过 $http 或 $resource 发起的,无非就是标准的 HTTP 请求(GET、POST 那套);Go 那头呢,就得准备好对应的路径处理器(Handler),接收请求、解析数据、干活,然后老老实实返回 JSON 格式的响应。整个过程,就是靠 HTTP 协议和 JSON 格式,完成一次松耦合的“握手”。
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 控制器里,路径照抄就行,两边对上就能通信:
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 sa ved 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 就能高效协同。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
8