Ajax调用webService的方法

本文介绍了一种使用Ajax技术调用WebService的方法。通过具体的JavaScript代码示例,展示了如何构造SOAP请求并发送到服务器,以及如何解析返回的XML响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<html>
        <head>
                <title>通过Ajax通用WebService</title>
        </head>
        <body>
        </body>
        <script>
        /* 通过Ajax调用webService*/
var method = "test1";  //接口方法名称
var webServiceIP = "http://127.0.0.1/";
var webServiceURL = webServiceIP + "jsService.nsf/jsDemoService?OpenWebService";

//定义接口方法参数   此参数格式定义请查看有关SOAP相关文档
var methodParam = '<?xml version="1.0" encoding="utf-8"?>';
methodParam += '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:DefaultNamespace">';
        methodParam += '<soap:Body>';
        methodParam += '<urn:' + method + ' xmlns="' + webServiceIP + '">';  //调用接品的方<urn:方法名 xmlns="服务器IP">
        methodParam += '<a xsi:type="xsd:string">10</a>';   //定义接口方法参数名及参数类型格式为<参数名称 xsi:type="xsd:参数类型"></参数名称>
        methodParam += '<b xsi:type="xsd:string">20</b>';
        methodParam += "</urn:" + method + ">";
        methodParam += "</soap:Body>";
        methodParam += "</soap:Envelope>";
callWebService(methodParam,webServiceURL)


//调用webservcie function
var xml_HTTP=false;
function callWebService(param,webServiceURL){ 
       
                if(window.XMLHttpRequest){
                        xml_HTTP=new XMLHttpRequest();  // Mozilla, Safari,...
                        }
                       
                if(window.ActiveXObject){   //IE
                                try{
                                        xml_HTTP=new ActiveXObject("Msxml2.XMLHTTP");
                                }catch(e){
                                        xml_HTTP=new ActiveXObject("Microsoft.XMLHTTP");
                                        }       
                                }
                if(!(xml_HTTP)) return false;  
                //xmlHttpReq=new ActiveXObject("Microsoft.XMLHTTP");
    xml_HTTP.open("POST", webServiceURL, false);//同步调用  false表法异步通信,true表示同步通信
    xml_HTTP.Send(param);   //接口方法参数
   
    //获取接口返回值
    if((xml_HTTP.readyState==4) &&(xml_HTTP.status==200)){  //readyState==4表示成功请求,200表示服务器成功处理
            var xmlObj=xml_HTTP.responseXml;
            try{  //两种方法获得返回值
            var strText=xmlObj.getElementsByTagName(method+"Return");  //通过解析XML得到返回值
            document.body.innerHTML="返回结果:"+strText.item(0).firstChild.text; //返回调用的值
            }catch(e){
            document.body.innerHTML="返回结果:"+xmlObj.text;
            }
    }
}       
</script>
</html>
===========================================================================================

<html>
        <head>
                <title>通过Ajax通用WebService</title>
        </head>
        <body>
        </body>
        <script>
        /* 通过Ajax调用webService*/
var method = "test1";  //接口方法名称
var webServiceIP = "http://127.0.0.1/";
var webServiceURL = webServiceIP + "jsService.nsf/jsDemoService?OpenWebService";

//定义接口方法参数   此参数格式定义请查看有关SOAP相关文档
var methodParam = '<?xml version="1.0" encoding="utf-8"?>';
methodParam += '<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:urn="urn:DefaultNamespace">';
        methodParam += '<soap:Body>';
        methodParam += '<urn:' + method + ' xmlns="' + webServiceIP + '">';  //调用接品的方<urn:方法名 xmlns="服务器IP">
        methodParam += '<a xsi:type="xsd:string">10</a>';   //定义接口方法参数名及参数类型格式为<参数名称 xsi:type="xsd:参数类型"></参数名称>
        methodParam += '<b xsi:type="xsd:string">20</b>';
        methodParam += "</urn:" + method + ">";
        methodParam += "</soap:Body>";
        methodParam += "</soap:Envelope>";
callWebService(methodParam,webServiceURL)


//调用webservcie function
var xml_HTTP=false;
function callWebService(param,webServiceURL){ 
       
                if(window.XMLHttpRequest){
                        xml_HTTP=new XMLHttpRequest();  // Mozilla, Safari,...
                        }
                       
                if(window.ActiveXObject){   //IE
                                try{
                                        xml_HTTP=new ActiveXObject("Msxml2.XMLHTTP");
                                }catch(e){
                                        xml_HTTP=new ActiveXObject("Microsoft.XMLHTTP");
                                        }       
                                }
                if(!(xml_HTTP)) return false;  
                //xmlHttpReq=new ActiveXObject("Microsoft.XMLHTTP");
    xml_HTTP.open(";POST", webServiceURL, false);//同步调用  false表法异步通信,true表示同步通信
    xml_HTTP.Send(param);   //接口方法参数
   
    //获取接口返回值
    if((xml_HTTP.readyState==4) &&(xml_HTTP.status==200)){  //readyState==4表示成功请求,200表示服务器成功处理
            var xmlObj=xml_HTTP.responseXml;
            try{  //两种方法获得返回值
            var strText=xmlObj.getElementsByTagName(method+"Return");  //通过解析XML得到返回值
            document.body.innerHTML="返回结果:"+strText.item(0).firstChild.text; //返回调用的值
            }catch(e){
            document.body.innerHTML="返回结果:"+xmlObj.text;
            }
    }
}       
</script>
</html>

这个问题的核心在于 OpenCV 中的某些算法(如 SURF)由于专利限制,默认配置下并未启用。因此当你尝试调用 `cv2.xfeatures2d.SURF_create()` 函数时会抛出错误。 以下是解决问题的具体步骤: --- ### **解决方案** #### 1. 安装包含非自由功能的 OpenCV 版本 OpenCV 的默认版本不支持一些受专利保护的功能(例如 SIFT 和 SURF)。你需要安装一个名为 `opencv-contrib-python` 的库,它包含了这些附加模块,并允许你通过设置特定选项来启用它们。 **操作步骤:** ```bash pip uninstall opencv-python -y pip install opencv-contrib-python==4.5.5.62 ``` 注意:这里我们推荐使用明确指定的版本(如 4.5.5.62),因为高版本可能会移除对某些旧函数的支持。 如果需要验证是否成功安装了该扩展包,可以运行以下命令: ```python import cv2 print("Contrib modules installed:", hasattr(cv2, "xfeatures2d")) ``` #### 2. 确保正确导入并初始化 SURF 检测器 在代码中直接创建 SURF 对象即可。假设已经完成了上述依赖项更新,则无需额外修改业务部分逻辑。 示例代码片段如下所示: ```python import cv2 # 初始化SURF特征检测器 surf = cv2.xfeatures2d.SURF_create(hessianThreshold=400) keypoints, descriptors = surf.detectAndCompute(image, None) print(f"Detected {len(keypoints)} keypoints.") ``` #### 3. 自己从源码编译 (高级用户) 如果你希望完全控制环境或者避免频繁升级导致的问题,可以选择手动下载官方发行版开源项目文件夹然后依据文档说明完成自定义构建过程。简而言之就是在 cmake 配置阶段添加参数 `-DOPENCV_ENABLE_NONFREE=ON` 启动对应开关再继续生成目标二进制产物。 --- ### § 相关问题 §: 1. 如果不想用 SURF 可以选择哪些替代方案? (比如 ORB、BRISK 或者 FAST+BRIEF 组合等) 2. 如何检查当前系统内的 OpenCV 是否已开启非自由特性? 3. 在 Linux 平台上如何按照上面提到的方式重新编译带完整特性的本地化副本?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值