前端埋点采集到的数据怎么发送到服务端?

news2024/11/26 10:27:44

水善利万物而不争,处众人之所恶,故几于道💦

目录

1. Image请求
2. Ajax请求
3. WebSocket 连接

1. Image请求

  1. 通过 Image请求将采集的数据发送到服务器。这种方式比较适合少量数据的采集,因为 lmage请求不需要返回任何数据。可以将采集到的数据通过URL参数的方式发送到服务器的接口。

  2. 它的原理是将采集的数据拼接成一个图片 URL,然后将该 URL 赋值给一个 Image 对象的 src 属性,浏览器会自动请求该 URL 对应的图片,而该图片并不会被展示到页面上,仅仅是用于发送数据到服务器。服务器接收到请求后解析 URL 中的参数,即可获取到所需的数据。

  3. Image 请求发送的数据大小有限制,大约在 2KB 左右,因此适合少量数据的采集。同时,由于 Image 请求不需要返回任何数据,因此无法获得发送数据的状态,不能得知发送是否成功,需要结合其他的方法进行确认。


前端埋点主要采用两种方式:js sdk 和 Java sdk
在这里插入图片描述

在发送数据的时候,我们可以以 img 请求的方式,将数据携带在请求参数列表中,进行发送。

在这里插入图片描述

而在服务端的nginx服务器上,我们可以配置自定义的日志格式,以及 log.gif 请求,来保存数据

在这里插入图片描述
在这里插入图片描述

  log_format是用于设置Nginx访问日志格式的指令,用于定义记录访问日志时所采用的日志格式。具体来说,它会根据设定的格式将请求的各种信息写入到指定的日志文件中。

  location 可以在 Nginx 中定义一些 URI 的访问规则。上述配置用于匹配请求 URI 为 “/log.gif” 的请求。当客户端向服务器发送的请求 URI 为 "/log.gif"时,Nginx 就会使用该层级定义的配置进行处理。比如我配置的默认的相应类型为 image/gif 和请求的访问日志记录位置以及日志的格式。

2. Ajax请求

  通过 Ajax请求将采集的数据发送到服务器。这种方式比较常见,也比较简单。可以将采集到的数据通过JSON或其他格式转换成字符串,然后通过 Ajax发送到服务器的接口。

例如:使用 XMLHttpRequest 或 Fetch API 将数据以异步请求的形式发送到服务端。

function sendDataToServer(data) {
  // 使用 XMLHttpRequest
  const xhr = new XMLHttpRequest();
  xhr.open('POST', 'https://your-server-endpoint.com/api/events');
  xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
  xhr.send(JSON.stringify(data));

  // 或者使用 Fetch API
  fetch('https://your-server-endpoint.com/api/events', {
    method: 'POST',
    headers: {
      'Content-Type': 'application/json'
    },
    body: JSON.stringify(data)
  });
}

3. WebSocket 连接

  通过 WebSocket 连接将采集的数据实时发送到服务器。这种方式相对于前两种方式来说,更适合需要实时监控的场景。

  在客户端,使用 JavaScript 脚本创建 WebSocket 连接,并在连接成功后,监听用户的行为事件,比如 click、load 等事件,当事件触发时,将采集到的数据使用 JSON 格式封装为一个消息,通过发送消息的方式,将数据实时地发送到服务器。

  在服务器端,需要使用 WebSocket 服务器框架来接收客户端的连接,处理客户端发送的数据,可以将数据存储到数据库中、进行实时分析等业务逻辑处理。

例如,使用 JavaScript 编写客户端代码:

// 创建WebSocket连接
const ws = new WebSocket('ws://localhost:8080')

// 监听连接成功事件
ws.onopen = function () {
  console.log('WebSocket连接成功')
}

// 监听连接关闭事件
ws.onclose = function () {
  console.log('WebSocket连接关闭')
}

// 监听错误事件
ws.onerror = function () {
  console.log('WebSocket连接错误')
}

// 监听消息事件,实现数据传输
ws.onmessage = function (event) {
  console.log('接收到服务器的消息:', event.data)
}

// 监听按钮点击事件,采集数据并发送到服务器
document.getElementById('button').addEventListener('click', function () {
  const data = {
    page: '商品详情页',
    action: '加入购物车'
  }
  const message = JSON.stringify(data)
  ws.send(message)
})

在服务器端,使用 Node.js 库 ws 来实现 WebSocket 服务器,处理客户端的连接、消息接收等业务逻辑:

const WebSocket = require('ws')

// 创建WebSocket服务器
const wss = new WebSocket.Server({ port: 8080 })

// 监听连接事件
wss.on('connection', function (ws) {
  console.log('客户端连接成功')
  
  // 监听消息事件,处理客户端发送的数据
  ws.on('message', function (message) {
    console.log('收到客户端的消息:', message)
    
    // 将数据存储到数据库
    // ...
    
    // 进行数据分析
    // ...
    
    // 向客户端推送消息
    ws.send('已接收到消息')
  })
})

这样,就可以实现埋点数据的实时监控和采集,通过 WebSocket 实现即时数据传输和推送。

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

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

相关文章

【Python】中文乱码问题与解决方案 深入分析

一直以来,python中的中文编码就是一个极为头大的问题,经常抛出编码转换的异常,python中的str和unicode到底是一个什么东西呢? 在本文中,以哈来解释作示例解释所有的问题,“哈”的各种编码如下: …

数据库单实例升级

一、单实例环境,全时长二个半钟多。详细图文说明到这下载 1、停止所有oracle相关进程。 Emctlstop dbconsole Isqlplusctl stop Lsnrctl stop sqlplus /nolog sql>conn /as sysdba Connectedtoanidleinstance. sql>shutdown 然后,冷备份下数据库cp…

c++学习之运算符重载详解

目录 1.运算符重载的基本概念 2.重载加法运算符 3.重载运算符<<(全局函数实现) 4.重载>>&#xff08;输入&#xff09;运算符&#xff08;全局函数实现&#xff09; 5. 重载/--运算符 6.重载运算符 7.可以重载的运算符 1.运算符重载的基本概念 运算符重载&…

研读Rust圣经解析——Rust learn-16(高级trait,宏)

研读Rust圣经解析——Rust learn-16&#xff08;高级trait&#xff0c;宏&#xff09; 高级trait关联类型Type为什么不用泛型而是Type 运算符重载&#xff08;重要等级不高&#xff09;重名方法消除歧义never typecontinue 的值是 ! 返回闭包 宏自定义宏&#xff08;声明宏&…

day7 实现TCP通信

目录 函数介绍 代码实现 函数介绍 socket函数与通信域&#xff1a; #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); -domain&#xff1a;指定通信域&#xff08;通信地址族&#xff09;&#xff1b; AF_I…

python-chatgpt自动化批量改写文章-基于gpt-3-5-turbo模型

作者&#xff1a;虚坏叔叔 博客&#xff1a;https://xuhss.com 早餐店不会开到晚上&#xff0c;想吃的人早就来了&#xff01;&#x1f604; 一、ChatGPT官方文档介绍&#xff1a; ChatGPT API—0.002美元&#xff0c;1000个token。比之前的GPT-3.0&#xff0c;成本直接降低了9…

vue3.2+ts错误:找不到模块“./App.vue”或其相应的类型声明。ts(2307)

报错原因&#xff1a; 未定义 .vue文件的类型&#xff0c;导致 ts 无法解析其类型&#xff0c;在vite-env.d.ts中定义后即可解决。 解决方法&#xff1a; 找到项目src目录下的vite-env.d.ts 文件&#xff0c;追加以下内容&#xff1a; declare module "*.vue" {impor…

【Python】chinese_calendar包的介绍和使用案例介绍(含代码)

一、问题引入 在我们的比赛中,我们对应的有时间数据,我们需要考虑不同时间段(例如月头、月中、月末等)产品需求量有何特性,节假日对产品需求量的影响,促销(如618、双十一等)对产品需求量的影响,季节因素对产品需求量的影响等。 但是我们的数据集中,却没有这种相关的…

PyTorch中的交叉熵函数 CrossEntropyLoss的计算过程

CrossEntropyLoss() 函数联合调用了 nn.LogSoftmax() 和 nn.NLLLoss()。 关于交叉熵函数的公式详见&#xff1a; 交叉熵损失函数原理详解 CrossEntropyLoss() 函数的计算过程可以拆解为如下四个步骤&#xff1a; 1、对输出的结果进行softmax操作,因为softmax操作可以将所有输入…

【Java基础教程】初识Java

作者简介&#xff1a; 辭七七&#xff0c;目前大一&#xff0c;正在学习C/C&#xff0c;Java&#xff0c;Python等 作者主页&#xff1a; 七七的个人主页 **文章收录专栏&#xff1a;Java.SE&#xff0c;本专栏主要讲解运算符&#xff0c;程序逻辑控制&#xff0c;方法的使用&a…

Java实现数据压缩所有方式性能测试

目录 1 BZip方式1.1 引入依赖1.2 BZip工具类代码1.3 BZip2工具类代码 2 Deflater方式3 Gzip方式4 Lz4方式4.1 简介4.2 算法思想4.3 算法实现4.3.1 lz4数据格式2、lz4压缩过程3、lz4解压过程 4.4 Lz4-Java4.4.1 简介4.4.2 类库 5 SevenZ方式5.1 引入依赖5.2 工具类代码 6 Zip方式…

C++(继承和组合)

继承&#xff1a;public继承是一种 is-a 的关系&#xff0c;也就是每一个派生类对象都有一个基类对象 这些关系都适合用继承来表达 ----> 继承了之后父类的成员就变成了子类的一部分&#xff0c;子类对象可以直接用 组合&#xff1a; 是一种has -a&#xff08;有一个&…

GraphSAGE聚合流程计算实例

本篇中我们只讨论聚合流程&#xff0c;不考虑GraphSAGE的小批量训练等内容。 我们先来看一下GraphSAGE的聚合流程伪代码&#xff0c;之后会给出两个具体的计算例子进行说明&#xff1a; 11行中&#xff0c; N ( k ) ( u ) N^{(k)}(u) N(k)(u)表示节点u的邻居节点采样函数&…

力扣杯2023春·个人赛

文章目录 力扣杯2023春-个人赛[LCP 72. 补给马车](https://leetcode.cn/problems/hqCnmP/)模拟 [LCP 73. 探险营地](https://leetcode.cn/problems/0Zeoeg/)模拟 哈希 [LCP 74. 最强祝福力场](https://leetcode.cn/problems/xepqZ5/)二维差分 离散化扫描线 [LCP 75. 传送卷轴…

CANOE入门到精通——CANOE系列教程记录1 第一个仿真工程

本系列以初学者角度记录学习CANOE&#xff0c;以《CANoe开发从入门到精通》参考学习&#xff0c;CANoe16 demo版就可以进行学习 概念 CANoe是一种用于开发、测试和分析汽车电子系统的软件工具。它通过在不同层次上模拟汽车电子系统中的不同部件&#xff0c;如ECU、总线和传感…

自动化运维工具Ansible之playbook剧本

目录 一、playbook 1、playbook简述 2、playbook剧本格式 3、playbook组成部分 4、playbook启动及检测 5、playbook模块实战实例1 6、vars模块实战实例2 7、when模块实战实例3 8、with_items循环模块实战实例4 9、template模块实战实例5 10、tags模块实战实例6 一、…

VM中kali虚拟机创建docker部署WebGoat

这里选择在docker中配置&#xff08;因为方便&#xff09; 首先下载docker sudo apt-get install docker.io 然后从Docker Hub下载WebGoat 8.0 的docker镜像 使用命令 docker pull webgoat/webgoat-8.0 完成后查看现在kali虚拟机中的docker镜像列表 输入命令 docker images …

0704一阶线性微分方程-微分方程

文章目录 1 线性方程1.1 定义1.2 解法&#xff08;常数变易法&#xff09;1.3 例题 2伯努利方程3 简单变量替换解方程结语 1 线性方程 1.1 定义 一阶微分方程&#xff1a;形式上能化成 d y d x P ( x ) y Q ( x ) \frac{dy}{dx}P(x)yQ(x) dxdy​P(x)yQ(x)的方程&#xff0c;…

树莓派CSI摄像头使用python调用opencv库函数进行运动检测识别

目录 一、完成摄像头的调用 二、利用python调用opencv库函数对图像进行处理 2.1 图像处理大体流程 2.2 opencv调用函数的参数以及含义 2.2.1 ret, img cap.read() 读取帧图像 2.2.2 cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 灰度图像 2.2.3 gray_diff_img cv2.absdiff(g…

详解子网划分练习题(32道)

目录 1 子网划分概念&#xff1a; 2 划分方法&#xff1a; 子网划分方法&#xff1a;段&#xff0c;块&#xff0c;数的计算三步。 段就是确定ip地址段中既有网络地址&#xff0c;又有主机地址的那一段是四段中的那一段&#xff1f; 块就确定上一步中确定的那一段中的主机…