前端如何调用后端接口(HTML + JS & Vue )

本文将以 Go 语言后端 为例,详细介绍:

  • Go 后端接口如何设计
  • 接口的请求 / 响应结构
  • 前端如何用 HTML + JS 调用 Go 接口
  • 前端如何用 Vue 工程模式 调用 Go 接口
  • 两种方式的区别与适用场景

一、整体架构说明

前后端分离架构

浏览器
  |
  | HTTP 请求(JSON)
  ↓
前端(HTML / Vue)
  |
  | HTTP 请求
  ↓
Go 后端(API)
  |
  | JSON 响应
  ↓
前端渲染页面
  • 前端:负责 页面 + 交互
  • 后端(Go):负责 业务逻辑 + 数据处理
  • 通信方式:HTTP + JSON

二、Go 后端接口准备

先准备一个最简单但标准的 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

三、HTML + JavaScript 调用 Go 接口

这是最原始、最直观的方式,非常适合:

  • 学习 HTTP 请求本质
  • 不使用前端框架的简单项目
  • 理解 fetch / axios 的底层思想

1. HTML 页面结构

<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>登录页面</title> </head> <body> <h2>用户登录</h2> <form> <div> <input type="text" placeholder="用户名"> </div> <div> <input type="password" placeholder="密码"> </div> <button type="submit">登录</button> </form> <script src="login.js"></script> </body> </html> 

2. JavaScript 调用 Go 接口

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('请求失败'); } }); 

3.代码流程

监听表单提交阻止浏览器默认刷新获取输入框数据使用 fetch 发送 HTTP 请求请求体转成 JSON解析 Go 返回的 JSON根据 code 判断成功或失败

4. HTML + JS 的特点

✅ 优点:

  • 简单直接
  • 学习成本低
  • 无需工程化

❌ 缺点:

  • 代码容易混乱
  • 不适合复杂项目
  • 不利于组件复用

四、Vue 工程模式调用 Go 接口

这是实际开发中最常用的方式


1、Vue 项目基本结构

使用 Vite 创建 Vue 项目后,常见结构:

src/  ├── api/          # 所有接口请求  │    └── user.js  ├── views/        # 页面  │    └── Login.vue  ├── main.js

2、Vue 中封装 API 请求

 安装 axios

npm install axios

3. 创建 axios 实例(src/api/request.js)

import axios from 'axios' const request = axios.create({ baseURL: 'http://localhost:8080', timeout: 5000 }) export default request 

4. 用户接口封装(src/api/user.js)

import request from './request' export function login(data) { return request({ url: '/user/login', method: 'post', data }) }

5、Vue 页面中调用 Go 接口

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> 

五、Vue 调用流程总结

  1. 页面触发点击事件
  2. 调用封装好的 API 方法
  3. axios 发送 HTTP 请求
  4. Go 后端处理并返回 JSON
  5. Vue 根据返回结果更新 UI

六、前端调用 Go 接口时跨域问题

在实际开发中,很多同学在 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)

1.什么是跨域?

浏览器规定:
当前页面的“协议 + 域名 + 端口”必须和接口一致,否则就是跨域。

前端页面后端接口是否跨域
http://localhost:8080/login.htmlhttp://localhost:8080/user/login❌ 否
http://127.0.0.1:5500/login.htmlhttp://localhost:8080/user/login✅ 是
file:///login.htmlhttp://localhost:8080/user/login✅ 是

只要 有一个不一样,浏览器就会认为是跨域。

2.为什么 Vue / HTML 调用时容易跨域?

  • HTML 用 Live Server(5500 端口)
  • Vue 开发服务器(5173 端口)
  • Go 后端监听(8080 端口)

 端口不同 = 跨域

3. 跨域不是 Go 限制,而是浏览器限制

重点理解这句话:

跨域请求其实已经发到 Go 服务器了

是浏览器不让前端代码拿到响应

所以解决方案一定是:
 后端告诉浏览器:我允许你访问

4. Go 后端开启 CORS(通用做法)

1)最基础的 CORS 处理函数
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") } 

2)在接口中使用(必须支持 OPTIONS)
func login(w http.ResponseWriter, r *http.Request) { enableCORS(w) // 预检请求,直接返回 if r.Method == http.MethodOptions { return } // 正常登录逻辑 } 

5.为什么一定要处理 OPTIONS 请求?

当你:

  • 使用 POST
  • 并且 Content-Type: application/json

浏览器会先发一个 OPTIONS 预检请求

OPTIONS /user/login

如果后端不处理:

 正式请求不会发送

6.Vue 项目中的跨域

Vue 开发阶段通常通过 代理解决跨域

// vite.config.js export default { server: { proxy: { '/api': { target: 'http://localhost:8080', changeOrigin: true } } } } 

七、HTML + JS vs Vue 

对比项HTML + JSVue
学习成本
工程化
代码组织
适合项目小 demo中大型项目

八、结语

无论你使用 HTML + JS 还是 Vue

 本质都是:前端通过 HTTP 请求调用 Go 接口

理解了:

  • 请求方法(GET / POST)
  • JSON 数据格式
  • 接口返回结构

你就掌握了前后端对接的核心能力

Read more

【无人机】elrs遥控器到手必懂参数

接收机 ELRS 遥控器/高频头如何与接收机对频 | SpeedyBee 知识库 | 专业FPV穿越机视频教程与常见问题解答,最全新手FPV穿越机调参指南。 ELRS接收机和高频头如何升级固件 | SpeedyBee 知识库 | 专业FPV穿越机视频教程与常见问题解答,最全新手FPV穿越机调参指南。 通道功能 前置学习通道功能,主要英文名称混眼熟。 功能类别配置项说明与常见选项备注/应用场景通道映射自定义通道输出通过WiFi网页(如http://10.0.0.1)调整接收机PWM输出通道的映射。例如,将物理通道1映射到输出通道3,适应不同的舵机布局。 通道输出类型PWM输出:直接驱动舵机、电调。CRSF协议:通过串口与飞控通信,传输所有通道数据及遥测。无飞控的固定翼/小车常用PWM;多旋翼或复杂机型常用CRSF接入飞控。通道分辨率摇杆通道(CH1-CH4)通常为10位分辨率(0-1023),提供精细的控制。控制飞行器的姿态、油门等。 辅助通道(AUX1-AUX12)可配置为2值开关(如1000/2000ms)、3值开关或多位比例控制。用于模式切换、

OpenClaw 完整安装与配置文档(包含Minimax/deepseek模型接入、飞书机器人接入)

OpenClaw 完整安装与配置文档 文档说明:本文档适用于 Linux 系统(Debian/Ubuntu 系列),详细梳理 OpenClaw 从基础环境准备、核心程序安装,到模型配置(Minimax/DeepSeek)、飞书渠道对接的全流程,所有交互式配置选项完整呈现,步骤可直接复制执行,适配新手操作。 适用场景:OpenClaw 新手部署、企业内部飞书机器人对接、Minimax/DeepSeek 模型配置 前置说明: 1. 服务器需联网,确保能访问 GitHub、npm、飞书官网; 2. 操作全程使用终端命令行,建议使用远程工具(如 Xshell、Putty)连接服务器; 3. 复制命令时需完整复制,避免遗漏特殊符号; 4. 所有交互式配置选项均完整列出,按文档指引选择即可。 5. 拥有root用户/sudo权限。

新兴市场股市估值与智能家居安全标准的互动

新兴市场股市估值与智能家居安全标准的互动 关键词:新兴市场股市估值、智能家居安全标准、互动关系、金融市场、技术标准、市场影响、风险管理 摘要:本文旨在深入探讨新兴市场股市估值与智能家居安全标准之间的互动关系。通过分析两者的核心概念、算法原理、数学模型,结合实际项目案例,揭示它们相互影响的内在机制。研究新兴市场股市估值如何受智能家居安全标准的发展影响,以及股市估值的波动又怎样作用于智能家居安全标准的制定和实施。同时,介绍相关的工具和资源,展望未来发展趋势与挑战,为投资者、企业和监管机构提供全面的参考。 1. 背景介绍 1.1 目的和范围 本研究的目的是全面剖析新兴市场股市估值与智能家居安全标准之间的互动关系。范围涵盖新兴市场的股票市场,包括亚洲、非洲、拉丁美洲等地区的股市,以及智能家居领域的安全标准制定、实施和发展。通过对两者互动机制的研究,为投资者、企业和政策制定者提供决策依据,帮助他们更好地理解市场动态,把握投资机会,制定合理的发展战略。 1.2 预期读者 本文的预期读者包括金融投资者、智能家居企业管理者、行业分析师、政策制定者以及对新兴市场和智能家居领域感兴趣的研究

75元!复刻Moji 2.0 小智 AI 桌面机器人,基于乐鑫ESP32开发板,内置DeepSeek、Qwen大模型

文末联系小编,获取项目源码 Moji 2.0 是一个栖息在你桌面上的“有灵魂的伴侣”,采用乐鑫 ESP32-C5开发板,配置 1.5寸 360x360 高清屏,FPC 插接方式,支持 5G Wi-Fi 6 极速连接,内置小智 AI 2.0 系统,主要充当智能电子宠物的角色,在你工作学习枯燥时,通过圆形屏幕上的动态表情包卖萌解压,提供情绪陪伴;同时它也是功能强大的AI 语音助手,支持像真人一样流畅的连续对话,随时为你查询天气、解答疑惑或闲聊解闷,非常适合作为极客桌搭或嵌入式学习的开源平台。 🛠️ 装配进化 告别手焊屏幕的噩梦。全新设计的 FPC 插座连接,排线一插即锁,将复刻门槛降至最低。 🚀 性能进化 主控升级为 ESP32-C5。支持 5GHz Wi-Fi 6,