用js实现web端跨域请求

具体例子请参看博客:http://blog.csdn.net/ls0609/article/details/73920229

最近一个项目需要实现客户端pc机器上录音并且上传给服务器端实现语音识别,用的chrome浏览器调试,eclipse平台J2EE开发环境。项目开始的时候,不知道需要跨越请求,用XMLHttpRequest 写上传代码后发现不起作用,后来查阅资料发现需要跨越请求,服务器配合修改允许跨域访问传送数据。

修改后的代码上传数据部分如下:

function uploadSpeexData(data)
  {//传入的是一窜Blob,里面是dataview数据
    var uploadData = data[0];                   
    var mTimestamp = new Date().getTime();
    var tempSign = mAppSecret + "api="+mApi+"appkey="+mAppKey+"timestamp="+mTimestamp+mAppSecret;
    var mSign = $.md5(tempSign);

    var serverUrl = mUrl+"?"+"appkey"+"="+mAppKey
                    +"&"+"api="+mApi
                    +"&"+"timestamp="+mTimestamp
                    +"&"+"sign="+mSign
                    +"&"+"seq="+mSeq
                    +"&"+"compress="+1;//+"&"+"compress="+0;
                //+"&"+"stop="+1;   


        if (window.FileReader)
        {
        var reader = new FileReader();
        reader.readAsArrayBuffer(data);//读出到arraybuffer中
        reader.onloadend = function() {
            var UInt8Data = new Uint8Array(this.result);
            var pcmData = UInt8Data.subarray(0);
            var dataArray  = new Int16Array(pcmData.buffer);
             var spxcode = new Speex({ quality: 10 , mode:  1, bits_size:  70});
             var spxdata = spxcode.encode(dataArray, true);//speex压缩

             var blobData = new Blob(spxdata);  //压缩后的数据生成Blob类型
             var readerTemp = new FileReader();
             readerTemp.readAsArrayBuffer(blobData);//读到arraybuffer中
             //下面是实现跨越请求上次到服务器
             readerTemp.onloadend = function() {
                    $.ajax({
                        url: serverUrl,//服务器地址
                        data:this.result,//读到arraybuffer中的待上传数据
                        type: 'POST', //设置post上传数据类型
                        dataType: 'text',//here
                        processData: false,//数据不进行预处理
                        headers: {'Content-Type': 'application/octet-stream'},
                        xhrFields: {//跨越请求,必须加上这个字段
                            withCredentials: true
                           },
                        success: function (data) {
                            //alert('请求成功');
                        interval = setInterval(getServerResult, 500, serverUrl);

                        },
                        error:function(msg){
                        //alert('请求发生错误');
                        }
                    });     
             }                                                                                              
        }
        }
  }


  function getServerResult(serverUrl) 
 {           
    var url_request = serverUrl+"&"+"stop="+1
    //向服务器请求返回结果
        $.ajax({
            url: url_request,
            type: 'GET',
            dataType: 'json',//here
            async: false,
            xhrFields: {
                withCredentials: true
            },
            success: function (data) {
                //alert('请求成功: '+data);
                //alert('请求成功: ');
                result = data;
                intervalCount++;
                if ((result['data'] && result['data']['asr'] && 
                     result['data']['asr']['final']) || intervalCount > 20) {
                    clearInterval(interval);
                    //$('#result').text(JSON.stringify(result));
                    //alert(JSON.stringify(result));
                    callBack(JSON.stringify(result));                   
                  intervalCount = 0;
                  clearInterval(interval);
                } else {
                    //$('#log').append(JSON.stringify(result) + '<br>');
                }                   
            },
            error:function(msg){
               callBack(JSON.stringify(msg));       
               intervalCount = 0;
            //alert(''请求发生错误123: '+msg);
            clearInterval(interval);
            }
        });
    }   

在ajax请求中,
xhrFields: {
withCredentials: true
},
跨越请求,必须加上这个字段.

通过上述代码,最终在项目中实现了跨越请求,也拿到了服务器端语音识,和语义理解的json字符串。

具体例子请参看博客:http://blog.csdn.net/ls0609/article/details/73920229

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值