wsdl是经过wsdl文件做为不一样应用的通讯接口,因此如何生成wsdl语言很重要,可是不少时候咱们发现本身编写的头文件经过gsoap工具soapcpp2.exe从头文件中没法正常生成对应的wsdl语言,几经寻找,终于发现:javascript
经过对应头文件.h生成客户端或服务器代理代码的时候,对应的头文件中的注释描述信息和对外接口都须要有规定的格式才能正确生成wsdl语言文件。html
一、如过头文件中导出函数命名没有前缀,那么能生成对应的客户端或服务器代理相关代码,可是没法为每个接口生成对应的请求和响应wsdl文件,不然,必须添加ns__前缀,注意是两条下划线才能够生成,且生成的schema对应的域名为默认ns.xsdjava
头文件:jquery
#ifndef _C_WEB_CLIENT_INTERFACE_web
#define _C_WEB_CLIENT_INTERFACE_浏览器
int ns__Add( int num1, int num2, int* sum );服务器
int ns__Sub(int num1, int num2, int* sum);app
int ns__Mul(char *namelist, char **arealist);ssh
#endif异步
生成命令:
soapcpp2 -c test.h -1
生成结果包含各个接口的请求和响应wsdl文件,例如Add方法的请求wsdl: ns.Add.req.xml
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ns="http://tempuri.org/ns.xsd">
<SOAP-ENV:Body>
<ns:Add>
<num1>0</num1>
<num2>0</num2>
</ns:Add>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Add方法的响应wsdl文件:ns.Add.res.xml
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ns="http://tempuri.org/ns.xsd">
<SOAP-ENV:Body>
<ns:AddResponse>
<sum>0</sum>
</ns:AddResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
二、加入带注释的wsdl配置项目
#ifndef _C_WEB_CLIENT_INTERFACE_
#define _C_WEB_CLIENT_INTERFACE_
// wsdl配置项
//gsoap ns service name: name_area
//gsoap ns service style: rpc
//gsoap ns service encoding: encoded
//gsoap ns service namespace: http://127.0.0.1:9000/name_area.wsdl
//gsoap ns service location: http://127.0.0.1:9000/name_area
//gsoap ns schema namespace: urn:name_area
int ns__Add( int num1, int num2, int* sum );
int ns__Sub(int num1, int num2, int* sum);
int ns__Mul(char *namelist, char **arealist);
#endif
生成add方法的请求wsdl文件名:name_area.Add.req.xml
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ns="urn:name_area">
<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<ns:Add>
<num1>0</num1>
<num2>0</num2>
</ns:Add>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
生成add方法的响应wsdl文件名:name_area.Add.res.xml
<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope
xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"
xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:ns="urn:name_area">
<SOAP-ENV:Body SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
<ns:AddResponse>
<sum>0</sum>
</ns:AddResponse>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
总结: 要想生成对应的wsdl文件,接口命名必须以ns__前缀打头,其次要控制对应wsdl文件文件名和编码等配置,必需要有对应的注释配置项目,soapcpp2工具会自动检查对应配置生成对应的文件;
---------------------
转自:https://blog.csdn.net/sunxiaopengsun/article/details/77069126
做为一个java开发人员,当咱们获取到了对方提供的wsdl地址,而后在网页上可以访问wsdl文档之后,如何调用对方的webservic借口呢?一下有几种方法,能够参考一下。第一种是 HttpURLConnection方式第二种是 JSP页面上纯JS调用内容说明一、WSDL文档基本说明二、httpURLConnection方式调用三、JS方式调用四、获取的数据如何解析?一、WSDL文档基本说明接口文档以下:如下是公共对外开放的查询手机号归属地的一个借口文档:WSDL:http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl能够本身用浏览器打开访问一下;一眼望去,可能接口看起来很复杂,较为繁琐。 可是做为开发人员,使用的时候, 咱们能够查看关注点信息,就能实现接口的调用了!!那么咱们须要了解吗哪些信息呢?从上面的文档里面,咱们须要从头部(最上面一行)了解到:系统的targetNamespace="http://WebXml.com.cn/"从<wsdl:types>标签里的<s:element ></s:element>的name=“xxxxxxx”,获知该文档提供了两个方法:getMobileCodeInfo、getDatabaseInfo(后面带Response的是对应方法的回复)从底部的<wsdl:service name="MobileCodeWS"></wsdl:service>标签里面,能获知<http:address location="http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx"/>请求地址。http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx通常而言,知悉以上信息,你就能调用借口了。须要传参数调用的,可能在业务上须要与对方了解一下,参数的格式(数据类型,文档里是能够知晓的)二、httpURLConnection方式调用代码以下:package com.ssh.webserviceTSY; import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.io.UnsupportedEncodingException;import java.net.HttpURLConnection;import java.net.URL; public class Test { public static void main(String[] args) throws IOException { //第一步:建立服务地址 URL url = new URL("http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl"); //第二步:打开一个通向服务地址的链接 HttpURLConnection connection = (HttpURLConnection) url.openConnection(); //第三步:设置参数 //3.1发送方式设置:POST必须大写 connection.setRequestMethod("POST"); //3.2设置数据格式:content-type connection.setRequestProperty("content-type", "text/xml;charset=utf-8"); //3.3设置输入输出,由于默认新建立的connection没有读写权限, connection.setDoInput(true); connection.setDoOutput(true); //第四步:组织SOAP数据,发送请求 String soapXML = getXML("17321242779"); //将信息以流的方式发送出去 OutputStream os = connection.getOutputStream(); os.write(soapXML.getBytes()); //第五步:接收服务端响应,打印 int responseCode = connection.getResponseCode(); if(200 == responseCode){//表示服务端响应成功 //获取当前链接请求返回的数据流 InputStream is = connection.getInputStream(); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr); StringBuilder sb = new StringBuilder(); String temp = null; while(null != (temp = br.readLine())){ sb.append(temp); } /** * 打印结果 */ System.out.println(sb.toString()); is.close(); isr.close(); br.close(); } os.close(); } public static String getXML(String phone){ String soapXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?>" +"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2003/XMLSchema-instance\" " +"xmlns:web=\"http://WebXml.com.cn/\" " +"xmlns:xsd=\"http://www.w3.org/2003/XMLSchema\" " +"xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">" +"<soap:Body>" +"<web:getMobileCodeInfo>" +phone +"</web:getMobileCodeInfo>" +"</soap:Body>" +"</soap:Envelope>"; return soapXML; } }说明 : 通常的HTTP请求大部分都是相同的,可是因为webservice是基于soap协议的,因此,请求时的文本格式须要设置好。文中的soapXML信息,须要注意xmlns:web=“tns” 这个xml命名空间, 这个空间是依据wsdl文档里的头部NameSpace信息,肯定的程序会依据这个名称,检索到该文档里面的方法,譬如:<web: getDatabaseInfo> 获取getDatabaseInfo方法 (web是xmlns的名字,能够自定义,至关于“id”)三、JS方式调用<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%><!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"><title>Test WebService</title><script type="text/javascript" src="js/jquery-2.1.1.min.js"></script><script>$(function(){invoke();back();});var xhr;function invoke(){ if(window.ActiveXObject){ xhr = new ActiveXObject("Microsoft.XMLHTTP"); }else{ xhr = new XMLHttpRequest(); } //指定请求地址 var url = "http://ws.webxml.com.cn/WebServices/MobileCodeWS.asmx?wsdl"; //定义请求类型和地址和异步,通常都是post方式。 xhr.open("POST", url, true); //设置Content-Type xhr.setRequestHeader("Content-Type", "text/xml;charset=UTF-8"); //指定回调方法 xhr.onreadystatechange = back; //组装消息体的数据 var data = '<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" ' ' xmlns:web="http://WebXml.com.cn/" ' ' xmlns:xsd="http://www.w3.org/2003/XMLSchema" ' ' xmlns:xsi="http://www.w3.org/2003/XMLSchema-instance">' +'<soapenv:Body>' +'<web:getDatabaseInfo>' +'<data>' +'17321242719' +'</data>' +'</web:getDatabaseInfo>' +'</soapenv:Body>' +'</soapenv:Envelope>'; xhr.send(data); }function back(){ if(xhr.readyState == 4){ if(xhr.status == 200){ var doc = xhr.responseXML; alert(xhr.getAllResponseHeaders()); // xhr.getResponseBodyAsStream alert(xhr.responseText); } }/* else{ alert("请求失败") } */}</script></head><body></body></html>--------------------- 做者:森雅香 来源:CSDN 原文:https://blog.csdn.net/myblogzz/article/details/80311038 版权声明:本文为博主原创文章,转载请附上博文连接!