前端如何调用后端接口(HTML + JS & Vue)
本文将以 Go 语言后端 为例,详细介绍:
- Go 后端接口如何设计
- 接口的请求 / 响应结构
- 前端如何用 HTML + JS 调用 Go 接口
- 前端如何用 Vue 工程模式 调用 Go 接口
- 两种方式的区别与适用场景
以 Go 语言后端为例,讲解前后端分离架构下的接口调用。内容包括 Go 后端接口设计、请求响应结构、前端通过 HTML+JS 和 Vue 工程模式调用接口的具体实现,以及跨域问题(CORS)的解决方案。对比了两种前端方式的优缺点,帮助开发者掌握前后端对接的核心能力。
本文将以 Go 语言后端 为例,详细介绍:
浏览器 | | HTTP 请求(JSON) ↓ 前端(HTML / Vue) | | HTTP 请求 ↓ Go 后端(API) | | JSON 响应 ↓ 前端渲染页面
先准备一个最简单但标准的 Go 接口,方便前端调用。
一个示例接口:用户登录
| 项目 | 内容 |
|---|---|
| URL | /user/login |
| 方法 | POST |
| 请求类型 | application/json |
| 返回类型 | application/json |
Go 后端代码示例
package main
import (
"encoding/json"
"net/http"
)
type LoginRequest struct {
Username string `json:"username"`
Password string `json:"password"`
}
type Response struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data,omitempty"`
}
func login(w http.ResponseWriter, r *http.Request) {
// 只允许 POST
if r.Method != http.MethodPost {
w.WriteHeader(http.StatusMethodNotAllowed)
return
}
var req LoginRequest
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
json.NewEncoder(w).Encode(Response{
Code: 400,
Msg: "参数错误",
})
return
}
// 模拟校验
if req.Username == "admin" && req.Password == "123456" {
json.NewEncoder(w).Encode(Response{
Code: 200,
Msg: "登录成功",
Data: map[string]string{
"token": "mock-token-123",
},
})
return
}
json.NewEncoder(w).Encode(Response{
Code: 401,
Msg: "用户名或密码错误",
})
}
func main() {
http.HandleFunc("/user/login", login)
http.ListenAndServe(":8080", nil)
}
启动后端后,接口地址为:
http://localhost:8080/user/login
这是最原始、最直观的方式,非常适合:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
</head>
<body>
<h2>用户登录</h2>
<form id="loginForm">
<div>
<input type="text" placeholder="用户名" id="username">
</div>
<div>
<input type="password" placeholder="密码" id="password">
</div>
<button type="submit">登录</button>
</form>
<script src="login.js"></script>
</body>
</html>
const form = document.getElementById('loginForm');
form.addEventListener('submit', async function (e) {
e.preventDefault(); // 阻止表单刷新页面
const username = document.getElementById('username').value;
const password = document.getElementById('password').value;
try {
const res = await fetch('http://localhost:8080/user/login', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify({ username, password })
});
const data = await res.json();
if (data.code === 200) {
alert('登录成功,token:' + data.data.token);
} else {
alert(data.msg);
}
} catch (err) {
console.error(err);
alert('请求失败');
}
});
监听表单提交 -> 阻止浏览器默认刷新 -> 获取输入框数据 -> 使用
fetch发送 HTTP 请求 -> 请求体转成 JSON -> 解析 Go 返回的 JSON -> 根据code判断成功或失败
✅ 优点:
❌ 缺点:
这是实际开发中最常用的方式。
使用 Vite 创建 Vue 项目后,常见结构:
src/ ├── api/ # 所有接口请求 │ └── user.js ├── views/ # 页面 │ └── Login.vue └── main.js
安装 axios
npm install axios
import axios from 'axios'
const request = axios.create({
baseURL: 'http://localhost:8080',
timeout: 5000
})
export default request
import request from './request'
export function login(data) {
return request({
url: '/user/login',
method: 'post',
data
})
}
Login.vue
<template>
<div>
<h2>用户登录</h2>
<input v-model="username" placeholder="用户名" />
<input v-model="password" type="password" placeholder="密码" />
<button @click="handleLogin">登录</button>
</div>
</template>
<script setup>
import { ref } from 'vue'
import { login } from '@/api/user'
const username = ref('')
const password = ref('')
const handleLogin = async () => {
try {
const res = await login({
username: username.value,
password: password.value
})
if (res.data.code === 200) {
alert('登录成功')
console.log(res.data.data.token)
} else {
alert(res.data.msg)
}
} catch (err) {
alert('请求失败')
}
}
</script>
在实际开发中,很多同学在 HTML / Vue 调用 Go 接口 时,会在浏览器控制台看到类似错误:
Access to fetch at 'http://localhost:8080/user/login' from origin 'http://127.0.0.1:5500' has been blocked by CORS policy
这并不是 Go 代码写错,而是 浏览器的安全机制:跨域限制(CORS)。
浏览器规定: 当前页面的'协议 + 域名 + 端口'必须和接口一致,否则就是跨域。
| 前端页面 | 后端接口 | 是否跨域 |
|---|---|---|
http://localhost:8080/login.html | http://localhost:8080/user/login | ❌ 否 |
http://127.0.0.1:5500/login.html | http://localhost:8080/user/login | ✅ 是 |
file:///login.html | http://localhost:8080/user/login | ✅ 是 |
只要 有一个不一样,浏览器就会认为是跨域。
端口不同 = 跨域
重点理解这句话:
❗ 跨域请求其实已经发到 Go 服务器了
❗ 是浏览器不让前端代码拿到响应
所以解决方案一定是: 后端告诉浏览器:我允许你访问
func enableCORS(w http.ResponseWriter) {
w.Header().Set("Access-Control-Allow-Origin", "*")
w.Header().Set("Access-Control-Allow-Headers", "Content-Type")
w.Header().Set("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
}
func login(w http.ResponseWriter, r *http.Request) {
enableCORS(w) // 预检请求,直接返回
if r.Method == http.MethodOptions {
return
}
// 正常登录逻辑
}
当你:
POSTContent-Type: application/json浏览器会先发一个 OPTIONS 预检请求:
OPTIONS /user/login
如果后端不处理: 正式请求不会发送
Vue 开发阶段通常通过 代理解决跨域:
// vite.config.js
export default {
server: {
proxy: {
'/api': {
target: 'http://localhost:8080',
changeOrigin: true
}
}
}
}
| 对比项 | HTML + JS | Vue |
|---|---|---|
| 学习成本 | 低 | 中 |
| 工程化 | ❌ | ✅ |
| 代码组织 | 差 | 好 |
| 适合项目 | 小 demo | 中大型项目 |
无论你使用 HTML + JS 还是 Vue:
本质都是:前端通过 HTTP 请求调用 Go 接口
理解了:
你就掌握了前后端对接的核心能力。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online