wsdl是通过wsdl文件作为不同应用的通信接口,所以如何生成wsdl语言很重要,但是很多时候我们发现自己编写的头文件通过gsoap工具soapcpp2.exe从头文件中无法正常生成对应的wsdl语言,几经寻找,终于发现:

通过对应头文件.h生成客户端或服务器代理代码的时候,对应的头文件中的注释描述信息和对外接口都需要有规定的格式才能正确生成wsdl语言文件。

1、如过头文件中导出函数命名没有前缀,那么能生成对应的客户端或服务器代理相关代码,但是无法为每一个接口生成对应的请求和响应wsdl文件,否则,必须添加ns__前缀,注意是两条下划线才可以生成,且生成的schema对应的域名为默认ns.xsd

头文件:

#ifndef _C_WEB_CLIENT_INTERFACE_

#define _C_WEB_CLIENT_INTERFACE_

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

生成命令:

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>

2、加入带注释的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调用

内容说明
1、WSDL文档基本说明
2、httpURLConnection方式调用
3、JS方式调用
4、获取的数据如何解析?

1、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

一般而言,知悉以上信息,你就能调用借口了。需要传参数调用的,可能在业务上需要与对方了解一下,参数的格式(数据类型,文档里是可以知晓的)

2、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”)

3、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 版权声明:本文为博主原创文章,转载请附上博文链接!

gsoap工具生成wsdl接口 注意事项的更多相关文章

  1. 调用CXF工具 生成 WSDL【转】

    在做WebService的时候,生成WSDL是必不可少的一步.我们通常使用的工具就是Axis和CXF. CXF提供了一个命令行工具,可以通过命令来生成Java to WSDL,也可以由WSDL生成Ja ...

  2. 使用java的wsimport.exe工具生成wsdl的客户端代码

    在jdk的bin目录下有一个wsimport.exe的工具,使用该工具可以根据wsdl地址生成java的客户端代码. 常用命令如下: wsimport  -keep -d d:\ -s d:\src  ...

  3. 使用gSOAP工具生成onvif框架代码

    <工具产生背景>          由于SOAP是一种基于xml的文件,手动编写SOAP文件太机械耗时,在这种背景下产生了gSAOP 这个工具,用于生成各种类型的代码,目前支持C/C++, ...

  4. 使用java的wsimport.exe生成wsdl的客户端代码【转】

    使用java的wsimport.exe工具生成wsdl的客户端代码 wsimport -keep -d d:\ -s d:\src -p com.map -verbose http://192.168 ...

  5. C# 利用VS自带的WSDL工具生成WebService服务类

    C# 利用VS自带的WSDL工具生成WebService服务类   WebService有两种使用方式,一种是直接通过添加服务引用,另一种则是通过WSDL生成. 添加服务引用大家基本都用过,这里就不讲 ...

  6. 根据wsdl,axis2工具生成客户端代码

    根据wsdl,axis2工具生成客户端代码 步骤: 1,下载axis2版本http://axis.apache.org/axis2/java/core/download.html 2,下载完成后解压, ...

  7. 根据wsdl,apache cxf的wsdl2java工具生成客户端、服务端代码

    根据wsdl,apache cxf的wsdl2java工具生成客户端.服务端代码 apache cxf的wsdl2java工具的简单使用: 使用步骤如下: 一.下载apache cxf的包,如apac ...

  8. webService学习之路(三):springMVC集成CXF后调用已知的wsdl接口

    webService学习之路一:讲解了通过传统方式怎么发布及调用webservice webService学习之路二:讲解了SpringMVC和CXF的集成及快速发布webservice 本篇文章将讲 ...

  9. webservice 服务端例子+客户端例子+CXF整合spring服务端测试+生成wsdl文件 +cxf客户端代码自动生成

    首先到CXF官网及spring官网下载相关jar架包,这个不多说.webservice是干嘛用的也不多说. 入门例子 模拟新增一个用户,并返回新增结果,成功还是失败. 大概的目录如上,很简单. Res ...

随机推荐

  1. 【微信小程序】e.currentTarget和e.target

    什么是事件 事件是视图层到逻辑层的通讯方式. 事件可以将用户的行为反馈到逻辑层进行处理. 事件可以绑定在组件上,当达到触发事件,就会执行逻辑层中对应的事件处理函数. 事件对象可以携带额外信息,如 id ...

  2. Material 风格的搜索框MaterialSearchView的使用

    大多数App中都有搜索的功能,虽然国内实实在在的遵循Google material design设计语言来设计的App实在不多,但个人感觉MD真的是非常值得研究,这次给大家介绍的是 Material ...

  3. 记一次接口调试错误: {"timestamp":"2019-09-11T03:04:30.036+0000","status":500,"error":"Internal Server Error","message":"Could not write JSON: Object is null; nested exception is com.fasterxml.jackson

    接口测试中用postman测试返回是正常的,但是使用其他人去调用就出错了,找了半天,才想起来使用了nginx,用于端口的代理转发.然后根据错误信息发现json格式的某个字段为null,结合日志中的报文 ...

  4. emacs bookmark(书签)初次使用

    emacs bookmark(书签)初次使用 编辑或者查看多个文件的时候,要想记住刚才在什么地方进行编辑,是很难的.所以emacs的bookmark功能就登场了.你可以在文件的任何地方设置一个书签,然 ...

  5. 微软Cloud+AI本地化社区更新

    有关微软Cloud+AI本地化方面的介绍请参见我之前的文章:<微软Cloud+AI本地化社区贡献指南>,本文将公布该社区最新的活动变更事宜. MLCP改进 我们想借此机会向您介绍我们在社区 ...

  6. JAVA反射(资源版)

    关于JAVA反射的作用可以看这篇博客(说的很详尽): https://www.cnblogs.com/jqyp/archive/2012/03/29/2423112.html 下面是关于JAVA反射的 ...

  7. (五)Amazon Lightsail 部署LAMP应用程序之迁移到Amazon RDS实例

    迁移到您的Amazon RDS实例 在某些时候,您的应用程序需求可能需要在 Amazon Lightsail中找不到的功能.幸运的是,将应用程序的一个或所有部分移动到其他AWS服务中非常简单 您将数据 ...

  8. golang中的接口

    CSDN找的一个网页,照着抄练一次. 差不多的使用场景都在了. package main import ( "fmt" ) type People interface { Retu ...

  9. 二,java框架学习

    二,java框架学习 实体类的编写规则 实体类里面的属性是私有的 私有属性使用公开的set,get,方法操作 要求实体类有属性作为唯一值(一般使用id值) 实体类属性建议不使用基本数据类型,使用基本数 ...

  10. jmeter录制移动端脚本

    jmeter录制脚本有两种方式,一种借助外部工具badbody,一种是本身的功能,使用代理服务器,介绍下如何使用代理服务器录制脚本.我一般在测app或者移动端H5页面时才会录制,所以此文也针对移动端. ...