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请求,就完美避开了浏览器跨域的问题。

时间: 2024-10-21 21:12:19

nodejs向远程服务器发送post请求----融云Web SDK/客户端获取token的相关文章

MSMQ向远程服务器发送消息错误总结

一:路径错误(Path)错误 如果向远程服务器发送消息,请使用格式名的形式,如: FormatName:Direct=TCP:121.0.0.1\\private$\\queueFormatName:Direct=OS:machinename\\private$\\queuenameFormatName:DIRECT=http://222.10.xx.xx/msmq/Private$/test注意:FontName是区分大小写的.如果表达式为"FORMATNAME:Dire......"

echarts通过ajax向服务器发送post请求,servlet从数据库读取数据并返回前端

1.echarts的官网上的demo,都是直接写死的随机数据,没有和数据库的交互,所以就自己写了一下,ok,我们开始一步一步走一遍整个流程吧. 就以官网最简单的那个小demo来做修改吧.官网上的小demo的效果图如下:(很熟悉,有没有) 2.按照echarts的使用方法新建一个echarts.html文件.为ECharts准备一个具备大小(宽高)的Dom(讲的有点细,熟悉的朋友直接跳过) <!DOCTYPE html> <head> <meta charset="u

观察HTTP协议中客户端向服务器发送的请求,理解并实现一个最简单的AJAX请求案例

一.什么是HTTP协议 HTTP协议即超文本传输协议,网站就是基于HTTP协议的,例如网站的图片.CSS.JS等都是基于HTTP协议进行传输的.HTTP协议是由从客户机到服务器的请求(Request)和从服务器到客户机的响应(Response)进行了约束和规范. 大白话的说,就是你在浏览器输入一个网址,例如http://baidu.com,这时你就是向百度的服务器发送了请求了....经过一系列你看不到的处理之后,你的浏览器出现一个百度的首页,这就是百度的服务器对你的浏览器的成功的响应. 二.在浏

利用HttpURLConnecion通过Nginx向代理邮件服务器发送POST请求

第一步:获取邮件各种参数,通过URLencode和Base64编码之后发送请求参数. 请求参数中,有邮件附件这样的大件,如何当做请求发送呢? 首先,将邮件内容转为字节数组,转为字节数组之后可以当做二进制操作了,保持了附件最原始的面貌,不会被任何其他因素影响. byte[] att= attachment.getContent(); //附件内容 //利用Base64进行加密传输,虽然加密的不够 Base64 base64 = new Base64(); //org.apache.commons.

VMware vSphere client 5.1登录出现这个错误:客户端无法向服务器发送完整请求

故障描述:服务器安装好VMware esxi 5.1,在自己的XP上安装了VMware vSphere client 5.1之后登录出现这个错误:客户端无法向服务器发送完整请求. 原来我另一台服务器安装的是5.0的版本,可以登录到虚拟机,为什么就不能登录到5.1呢?百度了一下,别的TX也有此类问题,但没有解决办法,估计还是客户端的问题,换了一台PC直接在浏览器输入服务器的IP,从打开的WEB页面直接下载Download vSphere Client.安装之后还是同样的问题.后来想到是不是不支持3

向微信服务器发送get请求

package weixinRespone; import java.io.IOException; import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.BufferedReader;im

融云 Android SDK 拍照,图片选择器方案分析

一  拍照 目前拍照融云提供两种方案 1 SDK kit 包中自带的拍照 关键类 : CameraInputProvider 此类点击是唤起 TakingPicturesActivity 特点是拍照后 勾选完成 会有一个预览界面  此方案如果在某些机型上 点击勾选后无响应 是因为 一些机型唤起 系统相机后 把下面的栈资源回收了 已经做了 onSaveInstanceState 的生命周期保存瞬间状态 但是还是偶现此情况 下面贴出实现代码 如果有知道此问题终极解决方案的开发者 欢迎留言 或者 联系

本地向远程服务器发送文件的问题。

最近在为服务器安装sql server 2008 r2数据库,因为使用serv-U出现"域正离线"的问题,花了很长时间还是解决不了.于是就想着直接向服务起传文件,发现传了一个大概70%的时候就挂了(复制终止,文件3.3g): 然后一直在找问题.发现远程桌面(mstsc)的选项里有一个选项(远程桌面=>本地资源) ,把驱动器勾上,然后连接就可以在服务器上访问本地的文件了.如图,而且貌似速度还比直接从本地复制粘贴到远程桌面速度还快: 还有我在网上找了好久都很难找到一个sql serv

nodejs通过代理(proxy)发送http请求(request)

var http = require('http') var opt = { host:'这里放代理服务器的ip或者域名', port:'这里放代理服务器的端口号', method:'POST',//这里是发送的方法 path:' https://www.google.com', //这里是访问的路径 headers:{ //这里放期望发送出去的请求头 } } //以下是接受数据的代码 var body = ''; var req = http.request(opt, function(res