Query通过Ajax向PHP服务端发送请求并返回JSON数据

本文演示了如何利用jQuery和Ajax技术从PHP服务端获取并展示MySQL数据库中的用户信息,通过点击用户列表中的姓名,即时显示该用户的详细信息如电话、邮箱等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Query通过Ajax向PHP服务端发送请求并返回JSON数据

服务端PHP读取MYSQL数据,并转换成JSON数据,传递给前端Javascript,并操作JSON数据。本文将通过实例演示了jQuery通过Ajax向PHP服务端发送请求并返回JSON数据。阅读本文的读者应该具备jQuery、Ajax、PHP相关知识,并能熟练运用。


JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写,同时也易于机器解析和生成。JSON在前后台交互的过程中发挥着相当出色的作用。请接着往下看教程。

XHTML

 
<ul id="userlist"
   <li><a href="#" rel="1">张三</a></li> 
   <li><a href="#" rel="2">李四</a></li> 
   <li><a href="#" rel="3">王五</a></li> 
</ul> 
<div id="info"
   <p>姓名:<span id="name"></span></p> 
   <p>性别:<span id="sex"></span></p> 
   <p>电话:<span id="tel"></span></p> 
   <p>邮箱:<span id="email"></span></p> 
</div> 
实例中,显示了一个用户姓名列表ul#userlist,一个用户详细信息层#info。值得注意的是,我给每个<a>标签设置属性“rel”并赋值,这个很重要,将在jQuery中使用。我要实现的效果就是:当点击用户列表中任意用户的姓名,将即时显示出该用户的详细信息,如电话、EMAIL等。

CSS

 
#userlist{margin:4px; height:42px} 
#userlist li{float:left; width:80px; line-height:42px; height:42px; font-size:14px;  
font-weight:bold} 
#info{clear:left; padding:6px; border:1px solid #b6d6e6; background:#e8f5fe} 
#info p{line-height:24px} 
#info p span{font-weight:bold} 
CSS设置了用户列表和用户详细信息的显示外观,您也可以自己设计一个好看的外观。

jQuery

使用jQuery前,别忘了先要确保载入的jQuery库。

 
<script type="text/javascript" src="../js/jquery.js"></script> 
接下来开始写jQuery代码了。

 
$(function(){ 
    $("#userlist a").bind("click",function(){ 
        var hol = $(this).attr("rel"); 
        var data = "action=getlink&id="+hol; 
         
        $.getJSON("server.php",data, function(json){  
            $("#name").html(json.name); 
            $("#sex").html(json.sex); 
            $("#tel").html(json.tel); 
            $("#email").html(json.email); 
       });  
    }); 
}); 
我给用户列表的每个<a>标签都绑定一个click事件,当单击用户姓名时,执行以下操作:获取当前标签的属性“rel”的值,并组成一个数据串:var data = "action=getlink&id="+hol,接着通过ajax向服务端server.php发送JSON请求,得到后台响应后,返回JSON数据,并将得到的数据显示在用户详细信息中。

PHP

后台server.php得到前端的Ajax请求后,通过传递的参数连接数据库并查询用户表,将相应的用户信息转换成一个数组$list,最后将数组转换成JSON数据。关于PHP与JSON的操作可以查看本站收集的文章:PHP中JSON的应用。以下是server.php的详细代码,其中数据连接部分省略,请大家自行建立数据连接。

 
include_once("connect.php"); //连接数据库 
$action=$_GET[action]; 
$id=intval($_GET[id]); 
if($action=="getlink"){ 
    $query=mysql_query("select * from user where id=$id"); 
    $row=mysql_fetch_array($query); 
    $list=array("name"=>$row[username],"sex"=>$row[sex],"tel"=>$row[tel],"email"=>$row[email]); 
    echo json_encode($list); 

通过本文可以知道jQuery通过Ajax向服务端发送JSON请求,使用方法$.getJSON非常方便简单。并且可以将服务端返回的数据进行解析,得到相应字段的内容,相比像HTML请求返回的一大串字符串那样处理方便快捷。

最后附上mysql表结构

 
CREATE TABLE IF NOT EXISTS `user` ( 
  `id` int(11) NOT NULL auto_increment, 
  `username` varchar(100) NOT NULL, 
  `sex` varchar(6) NOT NULL, 
  `tel` varchar(50) NOT NULL, 
  `email` varchar(64) NOT NULL, 
  PRIMARY KEY  (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8; 

 

声明:本文为原创文章,helloweba.com和作者拥有版权,如需转载,请注明来源于helloweba.com并保留原文链接,否则视为侵权。

 

转载于:https://www.cnblogs.com/qhorse/p/4698716.html

<think>在UniApp中开发钉钉小程序时,通过SSE(Server-Sent Events)实现对话请求携带数据服务端,需要注意以下几点: 1. SSE通常使用GET请求,但携带数据服务端有两种方式:查询字符串(URL参数)或请求头(如Authorization)。 2. 钉钉小程序中,UniApp的`uni.request`支持分块传输(`enableChunked: true`),用于接收SSE流。 3. 由于SSE是单向通道(服务器到客户端),客户端发送数据需在建立连接时通过URL参数传递,或在请求头中设置。 ### 实现步骤 1. **构造请求URL和参数**:将需要传递的数据作为查询参数附加到URL上。 2. **设置请求头**:如需传递认证信息(如token),可放在请求头中。 3. **发起SSE请求**:使用`uni.request`启用分块传输。 4. **处理分块数据**:通过`onChunkReceived`回调接收服务器推送的事件流。 ### 代码示例 ```javascript methods: { startSSEConversation(prompt) { // 将用户输入作为参数附加到URL(或使用其他方式传递) const url = `https://your-server.com/chat-sse?prompt=${encodeURIComponent(prompt)}`; // 发起SSE请求 const requestTask = uni.request({ url: url, method: 'GET', header: { 'Authorization': 'Bearer your_token', // 可选:携带认证信息 'Content-Type': 'text/event-stream' // 服务器要求 }, enableChunked: true, // 启用分块传输 success: (res) => { console.log('SSE连接成功', res); }, fail: (err) => { console.error('SSE连接失败', err); // 可在此实现重连逻辑 } }); // 监听分块数据 requestTask.onChunkReceived((chunk) => { const data = chunk.data; if (data) { // 解析事件流(示例:事件格式为 "data: {...}\n\n") const events = data.trim().split('\n\n'); events.forEach(event => { if (event.startsWith('data:')) { try { const jsonStr = event.replace('data:', '').trim(); const payload = JSON.parse(jsonStr); this.handleStreamingData(payload); // 处理数据 } catch (e) { console.error('解析事件失败', e); } } }); } }); // 保存请求任务,用于关闭连接 this.sseTask = requestTask; }, handleStreamingData(payload) { // 更新UI,例如拼接流式文本 this.conversationText += payload.text; }, stopSSE() { if (this.sseTask) { this.sseTask.abort(); this.sseTask = null; } } } ``` ### 关键说明 1. **数据传递方式**: - **URL参数**:适用于非敏感数据(如用户输入的问题文本)。 - **请求头**:适用于敏感信息(如token),需服务器支持。 - **注意**:SSE不支持在连接中途发送数据(如POST body),因为它是单向的。 2. **事件流解析**: - 服务器响应必须是`text/event-stream`格式。 - 每个事件以`data:`开头,以`\n\n`结束(参考SSE标准)。 - 示例服务器事件:`data: {"text": "Hello"}\n\n`。 3. **跨平台兼容性**: - UniApp已封装钉钉小程序的`dd.request`,但需真机测试(开发工具可能不支持分块传输)。 - 微信小程序同理(参考引用[1]),但钉钉实现类似。 4. **服务器要求**: - 支持SSE:设置响应头`Content-Type: text/event-stream`和`Cache-Control: no-cache`。 - 处理客户端传递的参数(从URL或请求头)。 ### 注意事项 - **性能**:避免高频事件(钉钉小程序可能限制内存)。 - **错误处理**:网络中断时,需监听`fail`实现重连(如指数退避)。 - **跨域**:确保服务器配置CORS(钉钉要求HTTPS)。 通过以上方法,即可在UniApp钉钉小程序中实现SSE对话请求携带数据服务端。 §§相关问题§§ 1. 如何在SSE连接中断后实现自动重连? 2. 钉钉小程序SSE请求数据大小限制是多少? 3. 如何安全地在SSE请求中传递敏感数据(如用户凭证)?</think>### UniApp钉钉小程序SSE请求携带数据服务端的实现方案 在UniApp钉钉小程序中通过SSE实现对话请求携带数据服务端,需要特别注意SSE的特性:**SSE协议默认使用GET请求**,无法直接发送请求体(如POST的JSON数据)。以下是完整的解决方案: #### 核心实现方法 1. **通过URL参数传递数据**(推荐方法) 将需要发送数据作为查询字符串附加到URL: ```javascript const userInput = "你好,今天天气如何?"; const sessionId = "abcd1234"; // 构建带参数的URL const url = `https://your-api.com/chat?sesssionId=${encodeURIComponent(sessionId)}&prompt=${encodeURIComponent(userInput)}`; uni.request({ url: url, method: 'GET', enableChunked: true, // 启用分块传输 // ...其他配置 }) ``` 2. **通过请求头传递数据**(适合小量数据) 在header中携带认证信息或简单数据: ```javascript uni.request({ url: 'https://your-api.com/chat', method: 'GET', header: { 'X-Session-Token': 'your_token_here', 'X-User-Id': 'user123' }, enableChunked: true, // ...其他配置 }) ``` #### 完整实现代码 ```javascript // 在Vue组件的methods中 methods: { startSSEChat(userInput) { // 构建带参数的URL const params = new URLSearchParams({ prompt: userInput, sessionId: this.sessionId, timestamp: Date.now() }).toString(); const url = `https://your-chat-api.com/sse?${params}`; // 发起SSE请求 this.sseTask = uni.request({ url: url, method: 'GET', enableChunked: true, // 关键:启用分块传输 header: { 'Authorization': `Bearer ${this.userToken}`, 'Content-Type': 'text/event-stream' }, success: (res) => { console.log('SSE连接成功', res.statusCode); }, fail: (err) => { console.error('SSE连接失败', err); this.reconnect(); // 实现重连逻辑 } }); // 处理服务器推送的数据 this.sseTask.onChunkReceived((chunk) => { try { const eventData = this.parseSSEData(chunk.data); this.updateConversation(eventData); // 更新对话内容 } catch (e) { console.error('解析错误', e); } }); }, // 解析SSE数据格式 parseSSEData(rawData) { // 示例事件流格式: "data: {...}\n\n" const events = rawData.trim().split('\n\n'); return events.map(event => { if (event.startsWith('data:')) { return JSON.parse(event.replace('data:', '').trim()); } return null; }).filter(Boolean); }, // 更新对话内容 updateConversation(data) { data.forEach(item => { this.conversationList.push({ role: 'assistant', content: item.text, timestamp: new Date() }); }); }, // 关闭连接 stopChat() { if (this.sseTask) { this.sseTask.abort(); this.sseTask = null; } } } ``` #### 服务端要求(Node.js示例) ```javascript // Node.js Express 服务端示例 const express = require('express'); const app = express(); app.get('/sse', (req, res) => { // 1. 获取客户端传递的参数 const { prompt, sessionId } = req.query; console.log(`收到请求: ${prompt} [会话: ${sessionId}]`); // 2. 设置SSE响应头 res.writeHead(200, { 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', 'Connection': 'keep-alive', 'Access-Control-Allow-Origin': '*' // 解决跨域 }); // 3. 模拟流式响应 const responses = prompt.split('').map((char, i) => `思考中${'.'.repeat(i+1)}` ); // 4. 发送分块数据 responses.forEach((text, index) => { setTimeout(() => { res.write(`data: ${JSON.stringify({ text })}\n\n`); // SSE格式 }, index * 300); }); // 5. 结束流 setTimeout(() => { res.end(); }, responses.length * 300 + 1000); }); app.listen(3000); ``` #### 关键注意事项 1. **数据大小限制** 钉钉小程序URL最大长度约2000字符,建议: - 压缩数据(如使用`encodeURIComponent`) - 敏感数据请求头 - 大文件数据需改用WebSocket 2. **安全要求** - 所有请求必须使用HTTPS - 敏感参数需加密处理 - 服务端验证`Origin`头防止CSRF 3. **性能优化** ```javascript // 客户端节流处理 let lastUpdate = 0; onChunkReceived((chunk) => { const now = Date.now(); if (now - lastUpdate > 100) { // 100ms节流 updateUI(chunk.data); lastUpdate = now; } }) ``` 4. **兼容性方案** 如果钉钉环境不支持分块传输,可降级为轮询: ```javascript // 兼容性检查 if (!uni.request({}).onChunkReceived) { this.fallbackToPolling(); } ``` > **提示**:实际开发中,推荐使用[uni-ajax](https://www.npmjs.com/package/uni-ajax)库简化请求处理,它内置了SSE支持和对钉钉小程序的适配[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值