背景:
买的厂家的器材,可以扫描器材上的二维码获取器材信息,但是公网可以访问,公司内网无法访问
需求:
把厂家二维码的信息拿出来,放到公司自己的二维码中,并制作标签
实现思路:
1.调用帆软扫码工具,来获取源二维码信息
对于扫码输入文本控件
对于调用API按钮控件添加点击事件
JS代码如下:
// 获取参数
var a = _g().parameterEl.getWidgetByName("标志明码").getValue();
// 目标网址
console.log(a)
const url = `http://XXXXXX/test?a=${encodeURIComponent(a)}`;
// 创建一个新的 XMLHttpRequest 对象
const xhr = new XMLHttpRequest();
// 设置请求方法和目标 URL
xhr.open('GET', url, true);
// 监听请求状态变化
xhr.onreadystatechange = function () {
// 当请求状态为完成时
if (xhr.readyState === XMLHttpRequest.DONE) {
// 确保请求成功
if (xhr.status === 200) {
console.log('Response:', xhr.responseText);
// 赋予控件实际值
kongjian= _g().parameterEl.getWidgetByName("textEditor0");
kongjian.setValue("Response:"+xhr.responseText,false);
} else {
console.error('Error:', xhr.status, xhr.statusText);
}
}
};
// 发送请求
xhr.send();
// 刷新页面
setTimeout(function() {_g().parameterCommit(); }, 500)
对于标志明码文本控件
2.将信息发送给python自写的接口,处理信息
python自写的接口
@app.route("/test", methods=["get"]) # 指定外网访问的路径和方式,并指定 a 为路径参数 def test(): # 利用获取到的链接发送请求抓取数据 a = request.args.get("a")
# 处理逻辑,我这里因为源二维码的扫描信息是一个链接,所以对这个链接发送请求获取数据,然后处理,入库展示
if __name__ == '__main__': print('{:-^30}'.format('接口开始运行')) host = 'XXXX' port = '5100' print('http://{}:{}/'.format(host, int(port))) server = pywsgi.WSGIServer((host, int(port)), app) # 使用WSGI启动服务 server.serve_forever()
这里用的是
pywsgi.WSGIServer
服务,自己调试的时候,可以直接app.run(),但是这还是测试环境,没有上边的稳定
3.调用接口生成标签
获取到二维码信息之后,自动带出信息
点击打印之后跳转(继承参数)
SELECT * FROM image_result
where 标志明码= REPLACE('${textEditor0}', 'Response:', '')
在生成二维码的单元格插入公式
"<img src=https://api.qrserver.com/v1/create-qr-code/?size=250x250&data=" + B1 + ">"
单元格属性 -- > 其他 ---> 显示内容 【用HTML显示内容】
最重要的是帆软访问自写接口的部分,由于是帆软访问python,所以会出现
Access to XMLHttpRequest at 'http:/XXXXX:5100/test/2' from origin 'http://XXXXX.com' has been blocked by CORS policy: The request client is not a secure context and the resource is in more-private address space `private`.
报错信息
原因是帆软和python不同源,跨域访问,被浏览器组织了,尝试了在代码里加入
CORS(app) # 解决跨域问题
// 设置允许跨域访问的域
app.use(function(req, res, next) {
res.header("Access-Control-Allow-Origin", "http://XXXXX.com");
res.header("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
res.header("Access-Control-Allow-Headers", "Content-Type");
next();
});
但是都没解决问题,最后直接使用了粗暴的方法
1.浏览器打开chrome://flags/#block-insecure-private-network-requests页面
2.找到Block insecure private network requests并将其设置为Disabled
这个时候帆软就可以正常的访问自写接口了,在网上看到如果把两边的域名都改成https也可以,这边没有做尝试,如果有伙伴尝试了,记得留言啊