zoukankan      html  css  js  c++  java
  • nodejs向远程服务器发送post请求----融云Web SDK/客户端获取token

    最近要用到一个叫融云的及时通讯的SDK,在获取token这个步骤的时候有点卡顿,以防以后碰到类似的问题,再此记录一下。

    客户端通过融云 SDK 每次连接服务器时,都需要向服务器提供 Token,以便验证身份,流程如下:

    流程如下:

    1、客户端获取用户id,并向服务器请求token(注意这里的服务器不是融云的服务器,而是客户端的服务端)

    2、客户端的服务端接收到token请求后,向融云的服务器请求token

    3、融云服务器接受到token请求,返回token给客户端的服务端。

    4、客户端的服务端接收到token以后,保存在数据库。

    5、服务端返回token给客户端。客户端每次请求token时,先检查数据库中是否存在有效的token。

    6、客户端附带token连接到聊天服务器

    官方给的示例如下:

    http请求:

    POST /user/getToken.json HTTP/1.1
    Host: api.cn.ronghub.com
    App-Key: uwd1c0sxdlx2
    Nonce: 14314
    Timestamp: 1408706337
    Signature: 45beb7cc7307889a8e711219a47b7cf6a5b000e8
    Content-Type: application/x-www-form-urlencoded
    
    userId=jlk456j5&name=Ironman&portraitUri=http%3A%2F%2Fabc.com%2Fmyportrait.jpg

    http响应:

    HTTP/1.1 200 OK
    Content-Type: application/json; charset=utf-8
    
    {"code":200, "userId":"jlk456j5", "token":"sfd9823ihufi"}

    一开始我并不理解获取token的流程,然后在浏览器页面发送向融云发送post请求,结果一直报错,大致是跨域问题(因为涉及到要向api.cn.ronghub.com主机地址发送post请求),整了一整天还是没解决,然后就考虑在nodejs服务器来发送post请求。

    代码如下:

    var regUrl = "http://api.cn.ronghub.com/user/getToken.json";
        var post_option = url.parse(regUrl);
    
        post_option.method = 'POST';
        var post_data = querystring.stringify({
            'userId' : "*******",    //你的
            'name' : "*******",      //你的
            'portraitUri' : "http://tva1.sinaimg.cn/crop.0.0.100.100.180/7e07eb40jw8f6hqda28x7j202t02tmx1.jpg"
        });
        console.log(post_data);
        post_option.headers = {
            'Content-Type' : 'application/x-www-form-urlencoded',
            'Content-Length' : post_data.length,
            'App-Key':"**********",    //你的
            'appSecret':'********',    //你的
            'Nonce':'14314',
            'timestamp':'1408706337',
            'Signature':'**************'  //你的
        };
        var post_req = http.request(post_option, function(response){
            response.on('data', function(buffer){
                console.log(buffer.toString());
            });
        });
        post_req.write(post_data);
        post_req.end();

    上面代码有些参数没有给出需要你自己填写,Signature是经过sha1换算以后得来的值,是不会变的,大家可以根据自己的情况修改

    Signature值的获取如下:

    var appSecret = '******'; // 开发者平台分配的 App Secret。
    var nonce = "14314"; // 获取随机数。
    var timestamp = "1408706337"; // 获取时间戳。
    var str = [appSecret,nonce,timestamp].sort().join('');
    var signature = sha1(str);

    上面的代码获取token以后直接显示在浏览器上,并没有存入数据库,大家可以自己修改。

    总结:

    如果采用浏览器来发送post请求,会存在跨域的问题,这时候就可以使用服务器来发送,浏览器请求服务器,服务器再体浏览器向远程服务器发送post请求,就完美避开了浏览器跨域的问题。

  • 相关阅读:
    Java多线程之JUC包:ReentrantLock源码学习笔记
    Java多线程之JUC包:Semaphore源码学习笔记
    Java多线程之JUC包:CountDownLatch源码学习笔记
    Java多线程之JUC包:AbstractQueuedSynchronizer(AQS)源码学习笔记
    Java多线程之JUC包:CyclicBarrier源码学习笔记
    架构设计:企业总体架构要如何做?小白也能快速领悟的设计思想
    可参考才是有价值的,架构设计的技改之路从来都不容易
    架构设计:高并发读取,高并发写入,并发设计规划落地方案思考
    微服务手册:API接口9个生命节点,构建全生命周期管理
    百度api使用心得体会
  • 原文地址:https://www.cnblogs.com/y-yxh/p/5982423.html
Copyright © 2011-2022 走看看