JavaScript+Html 调用Wcf Rest Api接口

  1. 功能需求
         公司使用wcf rest搭建了一个服务,为了使不同网站客户能够访问这个服务,决定用最通用的javascript+html 嵌入到客户网站调用该服务。要求使用简单,数据格式为xml,并能兼容大部分浏览器(IE6-IE9、360、firefox、chrome)等
  2. 解决思路
          使用javascript+ajax请求的方式,调用远程服务。遇到的主要问题是如何解决浏览器兼容问题,比如IE8+调用远程服务的时候会遇到跨域问题,程序中是通过创建ActiveXObject解决的,而不是标准的XMLHttpRequest
  3. 主要代码解释
    1. IE浏览器,解决跨域访问问题
              
          function crossDomainIE() {
                      // Use Microsoft XDR
                      var xdr = new XDomainRequest();
                     xdr.open( "POST", url);
                     xdr.onload = function () {
                          // XDomainRequest doesn't provide responseXml, so if you need it:
                          var dom = new ActiveXObject( "Microsoft.XMLDOM");
                         dom.async = false;

                         displayData(xdr.responseText);
                     };
                     xdr.send(data);
                 }
    2. 其它浏览器,默认无跨域问题
      function noCrossDomain() {
                      var xmlhttp = createXMLHttp();
                     xmlhttp.open( "POST", url);
                     xmlhttp.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded");
                      //xmlhttp.setRequestHeader("Access-Control-Allow-Origin", "*");
                     xmlhttp.send(data);

                      // Create the callback:
                     xmlhttp.onreadystatechange = function () {
                          if (xmlhttp.readyState != 4) {
                              return; // Not there yet
                         }

                          if (xmlhttp.status != 200) {
                              return;
                         }
                         displayData(xmlhttp.responseText);
                     }
                 }
    3. XML文本转换为Xml Dom也存在浏览器兼容问题
            function convertXml2Dom(xmlData) {
                      if (window.ActiveXObject) {
                          //for IE
                         xmlDoc = new ActiveXObject( "Microsoft.XMLDOM");
                         xmlDoc.async = "false";
                         xmlDoc.loadXML(xmlData);
                          return xmlDoc;
                     } else if (document.implementation && document.implementation.createDocument) {
                          //for Others
                         parser = new DOMParser();
                         xmlDoc = parser.parseFromString(xmlData, "text/xml");
                          return xmlDoc;
                     }
                 }
    4. 解决firefox无法用innerText显示文本的问题1
      //显示查询结果
               function displayData(resp) {
                   var xmlObject = convertXml2Dom(resp);

                  document.getElementById( "lblAge").innerText = xmlObject.getElementsByTagName( "Age")[ 0].childNodes[ 0].nodeValue;

                   //相同值再次赋值给innerHTML是应为innerText在firefox中无效,暂不知道原因
                  document.getElementById( "lblAge").innerHTML = xmlObject.getElementsByTagName( "Age")[ 0].childNodes[ 0].nodeValue;
              }
  4. 完整源代码
    <script type = "text/javascript" >
             var url = "远程服务url地址";
             var data;

            window.onload = function () {
                 //请求xml数据
                data = "\
                      <?xml version='1.0' encoding='utf-8'?>\
                      <xmlhttpuest>\
                        <FirstName>Chen</FirstName>\
                        <LastName>Fox</LastName>\
                       </xmlhttpuest>\
                     "
    ;

                 if (window.XDomainRequest) { //为了解决IE的跨域问题
                    crossDomainIE();
                }
                 else {
                    noCrossDomain();
                }
            }

             //IE浏览器,解决跨域访问
             function crossDomainIE() {
                 // Use Microsoft XDR
                 var xdr = new XDomainRequest();
                xdr.open( "POST", url);
                xdr.onload = function () {
                     // XDomainRequest doesn't provide responseXml, so if you need it:
                     var dom = new ActiveXObject( "Microsoft.XMLDOM");
                    dom.async = false;

                    displayData(xdr.responseText);
                };
                xdr.send(data);
            }

             //其它浏览器,默认无跨域问题
             function noCrossDomain() {
                 var xmlhttp = createXMLHttp();
                xmlhttp.open( "POST", url);
                xmlhttp.setRequestHeader( "Content-Type", "application/x-www-form-urlencoded");
                 //xmlhttp.setRequestHeader("Access-Control-Allow-Origin", "*");
                xmlhttp.send(data);

                 // Create the callback:
                xmlhttp.onreadystatechange = function () {
                     if (xmlhttp.readyState != 4) {
                         return; // Not there yet
                    }

                     if (xmlhttp.status != 200) {
                         return;
                    }
                    displayData(xmlhttp.responseText);
                }
            }

             //创建ajax http对象
             function createXMLHttp() {
                 var xmlhttp;
                 if (window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari
                    xmlhttp = new XMLHttpRequest();
                }
                 else { // code for IE6, IE5
                    xmlhttp = new ActiveXObject( "Microsoft.XMLHTTP");
                }

                 return xmlhttp;
            }

             //将xml文本转换为xml dom
             function convertXml2Dom(xmlData) {
                 if (window.ActiveXObject) {
                     //for IE
                    xmlDoc = new ActiveXObject( "Microsoft.XMLDOM");
                    xmlDoc.async = "false";
                    xmlDoc.loadXML(xmlData);
                     return xmlDoc;
                } else if (document.implementation && document.implementation.createDocument) {
                     //for Others
                    parser = new DOMParser();
                    xmlDoc = parser.parseFromString(xmlData, "text/xml");
                     return xmlDoc;
                }
            }

             //显示查询结果
             function displayData(resp) {
                 var xmlObject = convertXml2Dom(resp);

                document.getElementById( "lblAge").innerText = xmlObject.getElementsByTagName( "Age")[ 0].childNodes[ 0].nodeValue;

                 //相同值再次赋值给innerHTML是应为innerText在firefox中无效,暂不知道原因
                document.getElementById( "lblAge").innerHTML = xmlObject.getElementsByTagName( "Age")[ 0].childNodes[ 0].nodeValue;
            }
         < /script >





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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值