Linux wget后台写入数据库及jQuery调用WebService JSON响应问题
你提到现在有两个相关的需求和问题:一是想用Linux的wget从WebService拿到JSON响应,然后把数据写入数据库,还要后台执行;二是你写的jQuery脚本在和WebService交互(提交JSON、接收JSON返回)时出了问题,咱们分别来解决这两部分。
一、Linux后台获取JSON并写入数据库的实现方案
要完成这个需求,咱们可以写个shell脚本,把wget、JSON解析、数据库写入的逻辑串起来,再让脚本后台运行,具体步骤如下:
编写shell脚本(比如命名为
fetch_sales_to_db.sh)
脚本里先通过wget拉取JSON数据,用jq(一款非常好用的JSON解析工具)提取需要的字段,再调用mysql客户端把数据写入数据库。示例代码如下:#!/bin/bash # 配置参数,根据你的实际情况修改 API_URL="https://api.xxxxxxxxxxxxxxxxxxx/DailySales?FromDate=2024-01-01%2000:01:00&ToDate=2024-01-02%2000:01:00" TEMP_JSON="/tmp/daily_sales_temp.json" DB_USER="你的数据库用户名" DB_PASS="你的数据库密码" DB_NAME="你的数据库名" # 用wget静默拉取JSON到临时文件,后台执行 wget -q -O $TEMP_JSON $API_URL & # 等待wget任务完成 wait $! # 用jq解析JSON(假设返回的是数组,每个元素包含sale_id、amount、sale_date字段) # 遍历解析后的数据,逐条写入mysql jq -r '.[] | "\(.sale_id)\t\(.amount)\t\(.sale_date)"' $TEMP_JSON | while read -r sale_id amount sale_date; do mysql -u$DB_USER -p$DB_PASS $DB_NAME -e "INSERT INTO sales (id, amount, sale_date) VALUES ('$sale_id', '$amount', '$sale_date');" done # 清理临时文件 rm $TEMP_JSON几个注意点:
- 先安装
jq:Debian/Ubuntu用apt install jq,CentOS/RHEL用yum install jq - URL里的空格要转成
%20,不然wget会解析出错 - 明文写数据库密码不安全,推荐用
~/.my.cnf配置文件存储认证信息,这样脚本里可以去掉-p$DB_PASS
- 先安装
让脚本后台执行
用nohup命令让脚本在后台运行,即使你退出终端也能继续执行:nohup ./fetch_sales_to_db.sh > /dev/null 2>&1 &这样脚本就会在后台默默完成数据获取和写入的工作了。
二、前端jQuery脚本的问题排查与修复
看你贴的代码片段,发现几个可能导致故障的点,咱们逐一修正:
URL参数的转义问题
你拼接URL时用了&(这是HTML转义字符)和空格,在JavaScript里应该直接用&,并且对包含空格的参数用encodeURIComponent转义,避免请求失败:// 正确的URL拼接方式 var fromDateStr = date_from + " 00:01:00"; var toDateStr = date_to + " 00:01:00"; self.productURI = 'https://api.xxxxxxxxxxxxxxxxxxx/DailySales?FromDate=' + encodeURIComponent(fromDateStr) + '&ToDate=' + encodeURIComponent(toDateStr);未完成的AJAX函数逻辑
你代码里的self.getAllProducts函数调用了未定义的self.pobierz_dane_aja,应该是没写完AJAX请求逻辑。完整的AJAX请求应该这样写(假设API是GET请求):self.getAllProducts = function () { $.ajax({ url: self.productURI, type: 'GET', // 如果API要求POST,改成POST即可 dataType: 'json', // 告诉jQuery自动把响应解析成JSON对象 success: function(response) { self.products = response; // 把返回的JSON数据赋值给products数组 // 这里可以加渲染页面的逻辑,比如把数据展示到productsDiv里 $(self.productsDiv).html(JSON.stringify(self.products)); }, error: function(xhr, status, error) { console.error('请求出错啦:', status, error); // 这里可以加前端错误提示,比如给用户弹个消息 } }); };跨域问题(如果存在)
如果你的前端页面和API域名不一样,会遇到跨域限制。这时候需要后端API配置CORS(跨域资源共享),或者用代理服务器转发请求。本地开发时可以在AJAX配置里加crossDomain: true,但最终还是需要后端配合开启CORS。
内容的提问来源于stack exchange,提问作者Krzysztof Krajewski

