AngularJS XMLHttpRequest

news2026/5/19 10:41:05
AngularJS XMLHttpRequest (HTTP 请求) 学习笔记在 AngularJS 中$http服务是处理 XMLHttpRequest (XHR) 的核心工具。它封装了原生的XMLHttpRequest对象提供了基于Promise的异步 API并集成了拦截器、转换器和自动的 CSRF 保护。一、核心概念$http服务1. 什么是$http定义AngularJS 内置服务用于与远程服务器进行 HTTP 通信。原理底层封装了原生的XMLHttpRequest或JSONP。返回值返回一个Promise对象基于$q服务支持.then()链式调用。自动处理自动解析 JSON 响应。自动设置Content-Type头。自动处理 CSRF Token如果配置了。2. 基本用法app.controller(MyCtrl,function($scope,$http){// GET 请求$http.get(/api/users).then(function(response){// 成功回调$scope.usersresponse.data;}).catch(function(error){// 错误回调console.error(Error:,error.status,error.statusText);});});二、HTTP 方法详解$http支持所有标准的 HTTP 方法每个方法都返回一个 Promise。1.GET- 获取数据$http.get(/api/users,{params:{page:1,size:10}// 自动转换为查询字符串 ?page1size10}).then(function(response){$scope.usersresponse.data;});2.POST- 提交数据$http.post(/api/users,{name:John,age:25}).then(function(response){$scope.message用户创建成功;});3.PUT- 更新数据$http.put(/api/users/1,{name:Jane,age:26}).then(function(response){$scope.message用户更新成功;});4.DELETE- 删除数据$http.delete(/api/users/1).then(function(response){$scope.message用户删除成功;});5.PATCH- 部分更新$http.patch(/api/users/1,{age:27}).then(function(response){// 处理响应});6.JSONP- 跨域请求// 注意JSONP 需要服务器支持 callback 参数$http.jsonp(/api/users?callbackJSONP_CALLBACK).then(function(response){$scope.usersresponse.data;});三、请求配置对象 (Config Object)所有 HTTP 方法都接受一个可选的配置对象用于自定义请求行为。$http({method:POST,// 请求方法url:/api/users,// 请求 URLheaders:{// 自定义请求头Content-Type:application/json,Authorization:Bearer token123},params:{// GET 请求的查询参数page:1,size:10},data:{// POST/PUT 的请求体name:John,age:25},timeout:5000,// 超时时间毫秒transformRequest:[],// 自定义请求数据转换函数transformResponse:[],// 自定义响应数据转换函数cache:true,// 启用缓存withCredentials:true// 允许发送 Cookie}).then(successCallback,errorCallback);常用配置项详解headers设置自定义 HTTP 头如 Token、Content-Type。params自动附加到 URL 的查询参数GET 请求。data请求体数据POST/PUT/PATCH。timeout请求超时时间超过则自动取消。cachetrue使用$http默认缓存。false禁用缓存。CacheService使用自定义缓存服务。withCredentials跨域请求时携带 Cookie需服务器支持 CORS。四、响应对象结构$http的 Promise 成功回调接收一个响应对象包含以下属性$http.get(/api/users).then(function(response){// response.data: 响应体已自动解析 JSON// response.status: HTTP 状态码 (200, 404, 500...)// response.headers: 响应头获取函数// response.config: 原始请求配置对象// response.statusText: 状态文本 (OK, Not Found)console.log(response.data);console.log(response.status);});错误响应$http.get(/api/users).catch(function(response){// response.status: 错误状态码 (404, 500...)// response.data: 错误信息// response.statusText: 错误文本// response.config: 原始请求配置});五、快捷方法 vs 通用方法方法语法适用场景快捷方法$http.get(),$http.post()简单请求代码简洁通用方法$http({ method: ..., ... })复杂配置自定义头、超时、转换器等示例对比// 快捷方法$http.get(/api/users,{params:{id:1}});// 通用方法功能相同$http({method:GET,url:/api/users,params:{id:1}});六、拦截器 (Interceptors)拦截器是$http的强大功能允许在请求发送前或响应返回后全局拦截和修改数据。1. 定义拦截器app.factory(HttpInterceptor,function($q,$injector){return{// 请求拦截器request:function(config){// 添加 Tokenconfig.headers[Authorization]Bearer localStorage.getItem(token);returnconfig;},// 请求错误拦截器requestError:function(rejection){console.error(请求错误:,rejection);return$q.reject(rejection);},// 响应拦截器response:function(response){// 处理成功响应if(response.status200){// 可以修改响应数据}returnresponse;},// 响应错误拦截器responseError:function(rejection){// 统一处理错误如 401 跳转登录if(rejection.status401){// 跳转到登录页window.location.href/login;}return$q.reject(rejection);}};});2. 注册拦截器app.config(function($httpProvider){$httpProvider.interceptors.push(HttpInterceptor);// 或者推入函数$httpProvider.interceptors.push(function($q){return{request:function(config){...}};});});3. 典型应用场景统一添加 Token在request中注入 JWT。全局错误处理在responseError中处理 401/403/500。请求加载动画在request中显示 Loadingresponse中隐藏。数据转换统一格式化请求/响应数据。七、请求取消 (Cancelling Requests)AngularJS 支持取消未完成的 HTTP 请求防止内存泄漏和无效请求。1. 使用timeout配置varcanceler$q.defer();$http.get(/api/users,{timeout:canceler.promise}).then(function(response){// 处理响应});// 取消请求canceler.resolve();2. 在控制器销毁时取消app.controller(UserCtrl,function($scope,$http,$q){varcanceler$q.defer();$http.get(/api/users,{timeout:canceler.promise}).then(function(response){$scope.usersresponse.data;});// 控制器销毁时取消请求$scope.$on($destroy,function(){canceler.resolve();});});八、CSRF 保护AngularJS 自动处理 CSRF跨站请求伪造保护。1. 配置默认从 Cookie 读取XSRF-TOKEN。自动在请求头中添加X-XSRF-TOKEN。配置项$httpProvider.defaults.xsrfCookieName和$httpProvider.defaults.xsrfHeaderName。app.config(function($httpProvider){$httpProvider.defaults.xsrfCookieNameXSRF-TOKEN;$httpProvider.defaults.xsrfHeaderNameX-XSRF-TOKEN;});2. 后端配合后端需设置XSRF-TOKENCookie。后端需验证请求头中的X-XSRF-TOKEN。九、最佳实践1. 封装 API 服务不要直接在控制器中写$http应封装到 Service 中。// services/api.jsapp.factory(UserService,function($http){return{getAll:function(){return$http.get(/api/users);},getById:function(id){return$http.get(/api/users/id);},create:function(user){return$http.post(/api/users,user);}};});// 控制器中使用app.controller(UserCtrl,function($scope,UserService){UserService.getAll().then(function(res){$scope.usersres.data;});});2. 统一错误处理使用拦截器统一处理错误避免在每个控制器中重复写catch。3. 避免内存泄漏在$destroy事件中取消未完成的请求。避免在循环中发起大量请求使用防抖或节流。4. 使用 Promise 链// ✅ 好链式调用UserService.getAll().then(function(res){$scope.usersres.data;returnUserService.getStats();}).then(function(stats){$scope.statsstats.data;}).catch(function(error){console.error(Error:,error);});5. 处理大文件上传使用FormData和transformRequest: angular.identity。varformDatanewFormData();formData.append(file,fileInput.files[0]);$http.post(/api/upload,formData,{headers:{Content-Type:undefined},transformRequest:angular.identity});十、常见问题与解决方案问题原因解决方案跨域错误 (CORS)服务器未配置 CORS 头服务器添加Access-Control-Allow-OriginCSRF 失败Cookie 或 Header 名称不匹配检查$httpProvider配置和后端设置数据未更新异步回调中未触发$apply使用 Promise 或$timeout请求被取消组件销毁时未清理在$destroy中调用canceler.resolve()JSON 解析失败响应不是标准 JSON检查transformResponse或服务器返回格式重复请求快速点击导致多次提交使用防抖或禁用按钮十一、总结AngularJS$http服务的核心要点Promise 基础所有请求返回 Promise支持.then()和.catch()。配置灵活支持自定义头、参数、超时、缓存等。拦截器强大全局处理请求/响应统一添加 Token、处理错误。自动处理JSON 解析、CSRF 保护、错误状态码。封装原则将$http封装到 Service控制器只负责业务逻辑。资源清理在组件销毁时取消未完成的请求防止内存泄漏。通过合理使用$http和拦截器可以构建出健壮、可维护的异步数据交互层。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2541253.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…