精华内容
下载资源
问答
  • 因为以前从未用数据库java接口推送数据,所以为了实现这个demo我是一步一个脚印的踩坑啊!!! 此文章的作用以及应用场景:利用数据库主动推送数据,实现前端页面数据实时更新,替换ajax轮询机制。推送的依据是,...

     

     


    因为以前从未用数据库向java接口推送数据,所以为了实现这个demo我是一步一个脚印的踩坑啊!!!

    此文章的作用以及应用场景:利用数据库主动推送数据,实现前端页面数据实时更新,替换ajax轮询机制。推送的依据是,只要数据库指定的表中数据增加有了变化,数据库会触发触发器然后通过存储过程调用消息推送接口

     

    代码如下:....

         

    ----------------------------触发器---------------------------------------
    USE [devRep]
    GO
    /****** Object:  Trigger [dbo].[tr_sm_demo]    Script Date: 2019/9/26 14:06:46 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    
    
    -- Description:	<Insert触发器>
    -- =============================================
    create TRIGGER [dbo].[tr_sm_demo] 
     
    ON [dbo].[demo] 
     
    AFTER insert
     
    AS 
    BEGIN
    	declare @id int
     
    	set @id = (select id from demo where id=@id)  --如不指定条件查询  会出现 子查询返回的不是一个参数 !<> >>?  乱七八糟的一个错误  就是这里返回必须是一个数据
     
    	exec proc_useJPushAPI @id --调用存储过程并传参 如果传入的参数未变则不会触发
     
    	SET NOCOUNT ON;
    END
    
    ----------------------------存储过程--------------------------------
    
    USE [devRep]
    GO
    /****** Object:  StoredProcedure [dbo].[proc_useJPushAPI]    Script Date: 2019/9/26 13:56:19 ******/
    SET ANSI_NULLS ON
    GO
    SET QUOTED_IDENTIFIER ON
    GO
    -- =============================================
    
    -- Description:	<调用消息推送接口>
    -- =============================================
    CREATE procedure [dbo].[proc_useJPushAPI]
    	@id varchar(20)		--demo表的id字段
    AS
    BEGIN
    	--创建存储过程里的参数
    	declare @url varchar(4000)	--接口路由
    	declare @object int			--OLE对象实例
    	declare @responseText varchar(4000) --文本
    	declare @name varchar(20)
        select @name=name from demo;  --查询demo表为接口传递参数
    	set @url = 'http://127.0.0.1:8080/site/recedata?name='+@name ;
    	
    	print @url
     
    	exec sp_OACreate'MSXML2.XMLHTTP',@object out
    	exec sp_OAMethod @object,'open',null,'get',@url,'false'
    	exec sp_OAMethod @object,'send'
    	exec sp_OAMethod @object,'responseText',@responseText output
     
    	print @responseText
     
    	exec sp_OADestroy @object
     
    	SET NOCOUNT ON;
     
    END
    //接收java接口代码 
    @RequestMapping(value = "/recedata")
        public String recedata( String name) {
            try {
                System.out.println("sql server 访问啦---");
                return "HELLO";
            } catch (Exception e) {
                logger.info(e.getMessage(),e);
            }
            return null;
        }

     

    第二种写法

    create table A(keyId int,info1 varchar(20))
    go
    insert into A values(1,'a')
    insert into A values(2,'b')
    insert into A values(3,'C')
    insert into A values(4,'d')
    insert into A values(5,'e')
    insert into A values(6,'f')
    go
    create trigger tr_a_test on a
    after update 
    as
    begin
     declare @keyId_old int ,@info1_old varchar(20)
     declare @keyId_new int ,@info1_new varchar(20)
      
      ---获取修改前的值
      select @keyId_old=keyId,@info1_old =info1 from deleted  
      ---获取修改后的值
      select @keyId_new=keyId,@info1_new =info1 from inserted    
      ----打印获取的相关值   
       print '-------修改前的值------'   
       print @keyId_old
       print @info1_old   
       print '-------修改后的值------'
       print @keyId_new
       print @info1_new   
    end
    go
    
    update A set info1='testwwwtwt',keyId=108 where keyId =2 
    go
    drop trigger  tr_a_test
    go
    truncate table A
    drop table A 
    go

     

    mybatis

     

     create TRIGGER ${triggerName}
    
            ON ${tableName}
    
            AFTER INSERT ,UPDATE ,DELETE
    
            AS
            BEGIN
    
           declare @id varchar(11)
           declare @url varchar(255)
           declare @object int
           declare @responseText varchar(255)
     --删除
        if(not exists(select 1 from inserted) and exists(select 1 from deleted))
    
              select @id=${titleId} from deleted
        ELSE
        ---获取修改后的值
          select @id=${titleId} from inserted
          print @id
            set @url = 'http://${urlApi}/${controUrl}?id='+@id;
            print @url
    
    
        Exec sp_OACreate 'Msxml2.ServerXMLHTTP.3.0', @Object OUT;
        exec sp_OAMethod @object,'open',null,'get',@url,'false'
    
        exec sp_OAMethod @object,'send'
        exec sp_OAMethod @object,'responseText',@responseText output
    
        Exec sp_OADestroy @Object
        EXEC sp_OAGetErrorInfo @Object --异常输出
    
    END;

    现在只要在数据库执行这个sql into demo (name) values  ('你真的很棒啊'); 就可以访问接口

    这里有个坑啊     如果你的表名是demo,接收java接口的@RequestMapping 里也是叫demo, 那么无论你在怎么增加  它都不会跑到这个方法

    嗨!出错了嘛? 看这

    SQL Server 阻止了对组件 'Ole Automation Procedures' 的 过程'sys.sp_OACreate' 的访问

    借鉴博客:

    http://www.manongjc.com/article/44753.html

    https://www.jianshu.com/p/244c3cc30123

    https://www.cnblogs.com/tohen/p/4265263.html

    https://www.cnblogs.com/lflyq/archive/2016/11/15/6065160.html

    做个记录...

    用数据库推送 websocket接收渲染前端页面应该是  万瑞古德!

     

    -----------------补存-------2020年12月9日11:20:40

    之前写的触发器向指定接口传数据,只是写了一个demo,并没有真正使用,后续使用遇到一些问题,做一些记录

    问题:

    使用mybatis创建触发器和存储过程后,在数据库里添加demo表中的数据,由于传的参数是id,在接口里查询当前参数id的值,结果mybatis查询走到mapper层就卡死了,当前百思不得其解,以为是程序写的有问题。经过不断的摸索和实验最后发现当在数据库中添加

    一条数据时触发器立马请求存储过程中的http接口,然后接口根据id查询最新的数据,为啥会卡死呢?原因就是触发器之前,这个事务并未结束,insert并没有真正的添加到数据库中,所以导致一系列问题.

    解决:

    我的解决思路很简单,上代码

     new Thread(() -> {
                    try {
                        //放到多线程中等待1-2秒,等他的事务完事后在查询
                        Thread.sleep(1500);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                  
                }).start();

    如有问题,请指出

     

    展开全文
  • Kettle作为开源ETL工具,使用较多(因为不花钱)。 最近我个人在使用的时候遇到了需要将hive的数据... 因为下游推送数据时候,需要先获取 Token密码,再拼接为API的URL 。所以,第一步需要先获取Token密码: ...

        Kettle作为开源ETL工具,使用较多(因为不花钱)。

        最近我个人在使用的时候遇到了需要将hive的数据以Json的格式推动到API 接口。调用API使用的是Kettle的组件“rest client”。具体的流程如下:

        因为向下游推送数据时候,需要先获取 Token密码,再拼接为API 的URL 。所以,第一步需要先获取Token密码:

                

               1.Token_url:主要是放入获取Token密码的URL,方便第2步骤使用:

                    

                   如何不限制记录为1设置为n,则访问n次url并且生产n个token密码

                2.获取Token: 访问URL,并得到包含Token密码的结果

                   

                 从上一步获取URL,设置为GET方式。因为上游返回的是Json文档,所以这里数据类型设置为Json,返回结果集为“result”。返回的结果集如下:

                   

               3.解析接收到的结果,得到Token密码:

                   

                   

                  因为返回结果集是Json格式,所以使用Json input组件进行解释。源设置需要按图中设置,需要输出什么字段需要向图二那样设置源字段再Json的路径和输出字段名。否则需要制定本地Json文件路径

                4.设置变量:

                   

                  将token密码放到变量中。因为变量只能由一个值,所以前面1那里需要“”限制“”设定为1,否则报错。关于为何需要添加“变量设置”,再稍后会讲解。

            第二步,向API推送数据,大致流程是:输入数据,转化为Json格式,调用API推送

                     

                  1.表输入:

                                

                     自定义查询语句,句末不要添加“;”,否则或报错,AS 后面使用目标字段名称(也就是下游对应的名字)

                2.JSON Output: 将结果集转化为JSON格式

                    

                   设置转化模式,因为不需要输出到文件,所以选择了“output value”,条目名称和输出值的名字可以自定义,每个条目的的数行数请根据API的处理能力设置。

                   

                   这里主要是建立源字段和目标字段的对应关系,如果下游字段名称是英文,可以把它们放入表输入的AS 后面,然后再JSON Output的图二那里点击“获取字段”,就能看到字段名(SELECT结果集中的字段名)和元素名称(下游的字段名)对应关系了,最后针对顺序或者元素名称的大小写调整下就好了,注意JSON的字段名是区分大小的。

               3.JSON Input: 调整Json数据的格式

                  

                  指定输入源,因为是从之前的步骤获取,所以选择“源定义在一个字段中”,为何这样可看下图:

                   

                  

                 在“字段”选项中选择数据路径,自定义“名称“,因为的需要Jsonbody 中的{..}部分,所以路径为$.JsonBody[*]。

    路径的设置请按需要设置。

                 

               3. REST Client : 调用API 推送数据

                  

                 URL和推送方式根据API的接口配置

           第3步,将上面两个步骤的转化放入作业中:

                 

              统计满足条件的记录数:因为结果集为空,在2步那里会报空指针错误,所以先判断按条件是否由结果集。如果没有则走上图红色线,否则继续绿色线。这里就相当于IF ...ELSE判断。可以自定义SQL语句

              

              注意:有人会说在这里为什么不用count,我之前试过,这样会报错的。这个组件是对query的输出结果行数进行判断。无论有没数据,使用count 都会由统计结果输出的,且组件会判断有满足条件的数据。

            “getToken”和“postData”是引用第1步和第2步,因为获取token的URL是公用的,所以获取Token转化是公用的,Token也放到参数中,方便后面的转化引用。

     

     

     

     

     

     

     

     

     

    展开全文
  • 外呼接口实现官方接口文档:http://developer.7moor.com/v2docs/dialout/1、对接数据查询七陌商务索取到七陌用户中心账号密码,在查询页面查询到三个参数letaccountId="T0********";//账户idletapiSecret="495b60*...

    在白码低代码开发平台上对接七陌外呼接口,实现选择客户进行外呼,并保存通话记录的功能。

    外呼接口实现

    官方接口文档:http://developer.7moor.com/v2docs/dialout/

    1、对接数据查询

    向七陌商务索取到七陌用户中心账号密码,在查询页面查询到三个参数

    let accountId = "T0********";//账户id

    let apiSecret = "495b60****************5f0555af";//账户secret

    let host = "https://openapis.7moor.com";//请求域名

    查询页面:http://developer.7moor.com/data-query/

    2、接口鉴权信息

    时间戳

    //时间

    let date = new Date();

    let YY = date.getFullYear();

    let MM = (date.getMonth() + 1 

    let DD = (date.getDate() + 1 <= 10 ? '0' + date.getDate() : date.getDate());

    let hh = (date.getHours() + 1 <= 10 ? '0' + date.getHours() : date.getHours());

    let mm = date.getMinutes() + 1 <= 10 ? '0' + date.getMinutes() : date.getMinutes();

    let ss = date.getSeconds() + 1 <= 10 ? '0' + date.getSeconds() : date.getSeconds();

    let time = YY + MM + DD + hh + mm + ss;

    包头验证信息Authorization

    //包头验证信息 Authorization的值为 Base64编码(账户Id +冒号+时间戳)

    let buffer = $modules.lib.Buffer.from(accountId + ":" + time);

    let authorization = buffer.toString("base64");

    请求参数sig

    //sig, 32位大写MD5加密 (帐号Id + 帐号APISecret +时间戳)

    const crypto = $modules.crypto;

    const hash = crypto.createHash('md5');

    let sig = hash.update(accountId + apiSecret + time).digest('hex').toLocaleUpperCase();

    3、外呼接口请求地址

    //请求地址

    let url = host + "/v20180426/call/dialout/" + accountId + "?sig=" + sig;

    4、请求头部

    //请求头部

    let headers = {

    "Content-Type": "application/json;charset=utf-8",

    "Authorization": authorization,

    }

    5、请求体

    相关参数参考官方文档:http://developer.7moor.com/v2docs/dialout/

    //请求体

    let data = {

    "FromExten": $input.FromExten,

    "Exten": $input.Exten,

    "ExtenType": typeMap[$input.ExtenType],

    "ActionID": $input.ActionID,

    "DialoutStrVar": $input.DialoutStrVar,

    };

    为了方便用户端理解,extenType参数输入增加map

    //ExtenType map

    let typeMap = {

    "手机": "Local",

    "软电话": "sip",

    "IP话机": "gateway",

    }

    6、发起外呼请求

    //外呼

    let call = await $modules.curl(url, {

    method: "post",

    dataType: "json",

    headers,

    data,

    });

    7、输出请求结果

    //输出

    //$output.sig = sig;

    //$output.authorization = authorization;

    $output.request = data;

    $output.result = call.data;

    $output.success = call.data.Succeed.toString();

    $output.msg = call.data.Message;

    坐席接听方式说明:外呼时强制坐席使用该接听方式进行外呼。Local为“手机”,”sip为“软电话”需登录企话宝,gateway为“语音网关”,需注册绑定IP话机。

    Sip方式外呼效果:

    6d9f2739849346710d505e30cccf54c8.gif

    通话记录事件推送实现

    官方接口文档:http://developer.7moor.com/event/

    1、设置推送地址

    添加一个webhook,设置路径。

    cea589d0addc6d9e1320e2c4b644ffaf.png

    将完整路径复制,与用户中心账户名一并发给七陌业务员,让对方配置该路径。

    3e7b45234e5ea2aee8965e1028792bff.png

    2、处理接收的信息

    async function hook($req = request, $resp = response, $modules = modules) {

    //返回字符串 200,告知七陌已成功接收

    $resp.body = "200";

    let json = {

    query: $req.query,//接收的数据,get方式

    body: $req.body,//接收的数据,post方式

    timestamp: new Date().toString()

    }

    //保存接收的数据

    $modules.data.saveData("60177fad283f87288d276269", {

    "60177fc32f8b27288c6023dd": JSON.stringify(json)

    })

    }

    接收到的数据:

    4bc906260ccc06175204695e5081c639.png

    展开全文
  • EventSource 是服务器主动客户端推送数据的一个网络事件接口。一个 EventSource 实例会对 HTTP 服务开启一个持久化的连接,以 text/event-stream 格式发送事件, 会一直保持开启直到被要求关闭。 服务端 // node ...

    EventSource

    • 服务端主动推动数据

    EventSource 是服务器主动向客户端推送数据的一个网络事件接口。一个 EventSource 实例会对 HTTP 服务开启一个持久化的连接,以 text/event-stream 格式发送事件, 会一直保持开启直到被要求关闭。

    服务端

    // node 的实现
    
    // 单边通讯,服务器主动推送客户端
    const fs = require("fs");
    const http = require("http");
    let server = http.createServer((req, res) => {
      let url = req.url;
      if (url === "/") {
        // 这个路由主要是显示界面(当然如果不需要 node 加载 html 文件,也可以不用这个路由)
        res.setHeader("Content-Type", "text/html;charset=utf-8");
        let rStream = fs.createReadStream("./index.html");
        rStream.pipe(res);
      } else if (url === "/sse") {
        // SSE 接口
    
        // 如果页面的打开形式不是 通过当前node 环境(非同源),那么设置允许跨域
        res.setHeader("Access-Control-Allow-Origin", "*");
    
        // 设置成为 text/event-stream 是关键
        res.setHeader("Content-Type", "text/event-stream;charset=utf-8");
        setInterval(() => {
          // 不能使用 end ,因为 end 直接就断开连接了。而我们的需求是长连接
          // data: 数据开始标志
          // \r\n\r\n 数据结束标志
          res.write("data:" + new Date() + "\r\n\r\n");
        }, 1000);
      }
    });
    server.listen(3001);
    console.log("this server is listening on port 3001");
    

    客户端

    <html>
      <body>
        <h1>
          SSE 案例
        </h1>
        <p id="info"></p>
    
        <button onclick="cls()">关闭连接</button>
    
        <script>
          let source = new EventSource("http://127.0.0.1:3001/sse");
          // 如果 当前页面是通过 node 环境呈现,不需要跨域的话,也可以这样写
          // let source = new EventSource("/sse");
    
          source.onopen = function () {
            console.log("连接成功");
            // 0 connecting 正在连接
            // 1 open 已打开
            // 2 closed 已关闭
            // console.log(source.readyState); 查看状态
          };
    
          // 如果有数据发送过来会触发 message 事件
          source.onmessage = function (e) {
            console.log(e.data);
            document.getElementById("info").innerHTML = e.data;
          };
    
          // 如果出现错误
          source.onerror = function (err) {
            console.log(err);
            return;
          };
    
          function cls() {
            // 关闭连接
            source.close();
          }
        </script>
      </body>
    </html>
    
    展开全文
  • 使用极光推送向apicloud应用推送消息

    千次阅读 热门讨论 2018-07-16 20:45:18
    在app开发过程中,client和server的信息交互分两种方式-pull(拉)或者push(推)。...所以出现了push的方式,当服务器产生新的消息时,主动客户端程序推送,这种推送的方式更及时,消耗资源更少。
  • 写惯了接口都不知道该怎么主动推送数据了。。 Websocket,一种在单个 TCP 连接上进行全双工通讯的协议。也就是说,它允许服务端主动客户端推送数据。并且只需要一次握手,两者之间就可以创建持久性的连接,并进行...
  • 其实企业微信机器人就是一个webhook接口,用户以post data这个Webhook地址发起HTTP POST 请求,即可实现给该群组发送消息了。最近在使用python这个万能的胶水语言实现一些办公自动化的操作,顺便用python简单实现...
  • 一、上海导购网CPS接口:从上海导购网引导过来的用户在本商城下订单后,本商家应该按协议好的分成规则支付给上海导购网一定的佣金//首次将本商城订单数据推送给第三方合作商家(上海导购网) //要求:从上海导购网过来...
  • 接口主动外部推送数据 1外部调用python接口,返回数据 这种方式一般可以通过http接口,定义接口的ip和端口,外部通过ip和端口调用,调用的程序再返回结果。 接口服务代码如下: import flask import json from ...
  • 通过接口向其他系统推送部门,那么部门的增删改由谁完成??我只管查询数据将查询结果推过去,还是我这边每次修改,删除的结果也要过去
  • 外呼接口实现1、对接数据查询七陌商务索取到七陌用户中心账号密码,在查询页面查询到三个参数letaccountId="T0********";//账户idletapiSecret="495b60****************5f0555af";//账户secretlethost="https:/...
  • 1、普通收录工具可以百度搜索主动推送资源,缩短爬虫发现网站链接的时间,不保证收录效果。 2、API提交和手动提交共享配额,每日至多提交10万条有价值的内容,sitemap提交配额不与其他方式共享,具体配额以站点...
  • 1、对接数据查询 七陌商务索取到七陌用户中心账号密码,在查询页面查询到三个参数 letaccountId="T0********";//账户id letapiSecret="495b60****************5f0555af";//账户secret l...
  • 其实企业微信机器人就是一个webhook接口,用户以post data这个Webhook地址发起HTTP POST 请求,即可实现给该群组发送消息了。最近在使用python这个万能的胶水语言实现一些办公自动化的操作,顺便用python简单实现...
  • 拉模式和推模式区别拉模式(定时轮询访问接口获取数据数据更新频率低,则大多数的数据请求时无效的在线用户数量多,则服务端的查询负载很高定时轮询拉取,无法满足时效性要求推模式(客户端进行数据推送)仅在...
  • 推送:平台调用应用服务器的restful接口将数据主动发给北向应用(这些restful接口是平台在北向接口文档的消息推送章节提前定好,由应用服务器实现的。)回调地址:应用实现消息推送的restful接口时,可以自定义接口的...
  • springboot SseEmitter 消息推送

    千次阅读 2020-03-31 19:15:25
    这是SpringMVC提供的一种技术,可以实现服务端客户端实时推送数据.用法非常简单,只需要在Controller提供一个接口,创建并返回SseEmitter对象,发送数据可以在另一个接口调用其send方法发送数据. SpringBoot已经集成了...
  • 推模式(客户端进行数据推送) 仅在数据更新时,才有推送 需要维护大量的在线长连接 数据更新后,可以立即推送 基于WebSocket协议做推送 浏览器支持的socket编程,轻松维持服务端的长连接 基于TCP协议之上...
  • 推模式(客户端进行数据推送) 仅在数据更新时,才有推送 需要维护大量的在线长连接 数据更新后,可以立即推送 基于WebSocket协议做推送 浏览器支持的socket编程,轻松维持服务端的长连接 基于TC...
  • 百度主动推送即将网站内容主动推送到百度站长平台数据推送接口,百度主动推送可缩短爬虫发现网站链接时间,网站时效性内容建议使用链接提交工具,实时搜索推送数据。 百度站长平台页提供了百度自动推送API实例...
  • 微信推送模板消息

    2019-03-28 15:44:28
    微信公众号用户推送模板消息 首先需要在微信公众号平台添加自己要推送的模板(这边就以测试公众号为例) 根据添加的模板内容与格式数据 接下来就是根据api的接口去调用 官方文档:...
  • 其实企业微信机器人就是一个webhook接口,用户以post data这个Webhook地址发起HTTP POST 请求,即可实现给该群组发送消息了。最近在使用python这个万能的胶水语言实现一些办公自动化的操作,顺便用python简单实现...
  • 消息推送与拉取

    千次阅读 2016-06-21 06:42:27
    推送”一般是指因特网内容提供者定期预订用户“推送数据,来减少用于网络上搜索的时间。它根据用户的兴趣来搜索、过滤信息,并将其定期推给用户,帮助用户高效率地发掘有价值的信息,譬如通过电子邮件
  • 公众号api接口具体是做什么用的呢,微信公众平台目前分成消息接口...通用接口的作用是实现诸如获取粉丝资料,上传媒体文件以便消息接口回复图片、语音和视频等多媒体消息等功能,丰富消息接口的同时支持主动推送消息...
  • 推送:平台调用应用服务器的restful接口将数据主动发给北向应用(这些restful接口是平台在北向接口文档的消息推送章节提前定好,由应用服务器实现的。) 回调地址:应用实现消息推送的restful接口时,可以自定义接口...
  • 基于开发,使用websocket推送数据,当浏览器不支持websocket时自动切换彗星推送数据。 效果截图 在线演示 接收消息页面: ://www.workerman.net:2123 初步推送接口网址: ://...
  • 链接提交工具是网站主动百度搜索推送数据的工具,本工具可缩短爬虫发现网站链接时间,网站时效性内容建议使用链接提交工具,实时搜索推送数据。 本工具可加快爬虫抓取速度,无法解决网站内容是否收录问题 百度...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 209
精华内容 83
关键字:

向接口推送数据