curl验证,调用webservice接口

来源:互联网 发布:点阵字体编辑软件 编辑:程序博客网 时间:2024/06/05 17:41

概要:

wsdl规范的webservice使用的比较广泛,尤其是在异构系统中进行数据交换。验证webserivce的可用性,进而调用webservice的方法,大家都有自己的见解。客户端调用遵循wsdl规范的远程webservice服务,发送请求时本质上是http请求,这就为直接通过发送http请求,调用webservic服务提供了理论基础。

说说自己的方法。

我们将实际的运行环境,分为本地和线上

本地,生成客户端(cxf,jdk自带工具都可以),进行调用

线上,使用curl发送遵循soap协议的http请求,进行调用。


1、本地验证

本地验证,就不重复了,自行搜索。

2、线上环境验证

线上环境,通常为linux服务器,当然windows也是可以的,协议是通用的。验证环境如下

环境配置:

          操作系统:linux

         附属工具:curl

 2.1 生成SOAP协议格式的报文参数

调用远程的webservice服务,是通过http请求,就要构造请求参数,下面给出构造过程和结果

构造结果是啥样子的呢?

包含两部分,一个是curl的参数,部分是soap报文

整体上类似这样子

curl -H 'content-type: application/xml' -d '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:curlService xmlns:ns2="http://linghushaoixa.github.io"><request><password>yingying</password><userName>linghushaoxia</userName></request></ns2:curlService></soap:Body></soap:Envelope>' http://ip:port/soap/services/curl_soap_service?wsdl


格式化一下soap的原文,得到清晰的结构

soap协议的简要结构:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">  <soap:Body>    <ns2:curlService xmlns:ns2="http://linghushaoixa.github.io">      <request>        <password>yingying</password>        <userName>linghushaoxia</userName>      </request>    </ns2:curlService>  </soap:Body></soap:Envelope>


基本说明:

soap:Envelope,报文消息主体声明

soap:Body,消息体

ns2:curlService,方法

xmlns:ns2,目标命名空间,targetNamespace

request,请求参数,自定义的参数名,由接口的WebParam指定,本例中就命名为了request,不要照搬,导致错误

2.2 封装为curl命令

知道了结构,就可以进行封装了。封装的结果上图已经给出,需要的参数,方法名、参数名、参数的值、wsdl地址

代码如下

package com.linghushaoxia.soap.util;import java.io.StringWriter;import com.google.gson.Gson;import com.thoughtworks.xstream.XStream;/** * 功能说明:转换工具类 * @author: linghushaoxia * @time:2017年7月3日上午9:35:28 * @version:1.0 * */public class TransformUtil {/** *  * 功能说明:将soap协议的报文封装为curl命令,以便在linux服务器上执行 * @param url * wsdl的远程地址 * 远程webservice协议的soap报文 * @param soapXml * @return String * @time:2017年7月3日上午9:38:59 * @author:linghushaoxia * @exception: * */public static String wsdlToCurlWithSoapMsg(String url,String soapXml){String curl ="";StringBuilder curlBuilder = new StringBuilder();curlBuilder.append("curl -H").append(" 'content-type: application/xml'");curlBuilder.append(" -d ").append("'").append(soapXml).append("'");curlBuilder.append(" ").append(url);curl = curlBuilder.toString();return curl;}/** *  * 功能说明:将webservice接口调用转为curl命令,以便在linux服务器上执行 * @param wsdlUrl * wsdl地址 * @param methodName * 方法名 * @param webParam * 参数名,webservice客户端声明的名称 * @param request * 请求参数,pojo * @param targetNamespace * 命名空间 * @return String * @time:2017年7月3日下午3:03:24 * @author:linghushaoxia * @exception: * */public static <T> String wsdlToCurl(String wsdlUrl,String methodName,String webParam,T request,String targetNamespace){String curl ="";//封装为curl指令String soapXml  = buildSoapXml(methodName,webParam,request,targetNamespace);curl = wsdlToCurlWithSoapMsg(wsdlUrl, soapXml);return curl;}/** *  * 功能说明:将请求参数封装为soap协议的xml报文 * @param methodName * 方法名 * @param webParam * 参数名,webservice客户端声明的名称 * @param param * 请求参数,pojo * @param targetNamespace * 命名空间 * @return String * @time:2017年7月3日下午4:13:03 * @author:linghushaoxia * @exception: * */private static <T> String buildSoapXml(String methodName,String webParam,T param,String targetNamespace){/** * 封装soap协议格式 * 格式从cxf的客户端报文中截取得到 * 包含四部分 * start-body--method-param */StringBuilder soapBuilder = new StringBuilder();appendSoapEnvelopeStart(soapBuilder);appendSoapBodyStart(soapBuilder);appendSoapMethodStart(soapBuilder,methodName,targetNamespace);appendSoapParam(soapBuilder,webParam,param);appendSoapMethodEnd(soapBuilder,methodName);appendSoapBodyEnd(soapBuilder);appendSoapEnvelopeEnd(soapBuilder);return soapBuilder.toString();}/** *  * 功能说明:soap协议声明,开始 * @param soapBuilder * @time:2017年7月3日下午6:17:06 * @author:linghushaoxia * @exception: * */private static void appendSoapEnvelopeStart(StringBuilder soapBuilder){soapBuilder.append("<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\">");}/** *  * 功能说明:soap协议声明,结束 * @param soapBuilder * @time:2017年7月3日下午6:17:29 * @author:linghushaoxia * @exception: * */private static void appendSoapEnvelopeEnd(StringBuilder soapBuilder){soapBuilder.append("</soap:Envelope>");}/** *  * 功能说明:soap协议body,开始 * @param soapBuilder * @time:2017年7月3日下午6:18:09 * @author:linghushaoxia * @exception: * */private static void appendSoapBodyStart(StringBuilder soapBuilder){soapBuilder.append("<soap:Body>");}/** *  * 功能说明:soap协议body,结束 * @param soapBuilder * @time:2017年7月3日下午6:18:23 * @author:linghushaoxia * @exception: * */private static void appendSoapBodyEnd(StringBuilder soapBuilder){soapBuilder.append("</soap:Body>");}/** *  * 功能说明:soap协议方法,开始 * @param soapBuilder * 构建字符串对象 * @param methodName * 方法名 * @param targetNamespace  * 命名空间 * @time:2017年7月3日下午6:18:42 * @author:linghushaoxia * @exception: * */private static void appendSoapMethodStart(StringBuilder soapBuilder,String methodName,String targetNamespace){soapBuilder.append("<ns2:").append(methodName);soapBuilder.append(" ").append("xmlns:ns2=\"").append(targetNamespace).append("\"").append(">");}/** *  * 功能说明:soap协议方法,结束 * @param soapBuilder * @param methodName * 方法名 * @time:2017年7月3日下午6:19:03 * @author:linghushaoxia * @exception: * */private static void appendSoapMethodEnd(StringBuilder soapBuilder,String methodName){soapBuilder.append("</ns2:").append(methodName).append(">");}/** *  * 功能说明:soap协议,封装参数 * @param soapBuilder * @param webParam * 参数名,webservice客户端声明的名称 * @param param * 请求参数,pojo * @time:2017年7月3日下午6:19:21 * @author:linghushaoxia * @exception: * */private static <T>  void appendSoapParam(StringBuilder soapBuilder,String webParam,T param ){soapBuilder.append(beanToXml(param,webParam));}/** *  * 功能说明:java对象转为xml字符串,XStream * @param obj * @return String * @time:2017年7月3日下午4:03:03 * @author:linghushaoxia * @exception: * */private static <T> String beanToXml(T obj,String webParam){//返回结果String xmlResult="";XStream xstream = new XStream( ); //类别名,节点的名称,默认是全类名xstream.alias(webParam, obj.getClass());String xmlFormat= xstream.toXML(obj);/** * 取消格式化 */xmlResult=xmlFormat.replaceAll("\\s*|\\t|\\r|\\n", "");return xmlResult;}}

以上代码中几个关键参数,是怎么得到的?找到客户端产生的接口,本例为,ICurlSoapService

如下图



测试

/** * 功能说明:curl访问soap * @author: linghushaoxia * @time:2017年7月5日下午12:52:23 * @version:1.0 * */public class CurlSoapServiceDemo {public static void main(String[] args) {//wsdl地址String wsdlUrl="http://ip:port/cesso/services/curl_soap_service?wsdl";//所要调用的方法名String methodName="curlService";/** * 请求参数 */SoapRequest request=new SoapRequest();request.setUserName("linghushaoxia");request.setPassword("yingying");String webParam="request";//命名空间String targetNamespace="http://linghushaoixa.github.io";String curl= TransformUtil.wsdlToCurl(wsdlUrl, methodName, webParam,request, targetNamespace);System.out.println("curl=");System.out.println(curl);}


2.3 调用

登录到linux服务器,就可以执行了

curl -H 'content-type: application/xml' -d '<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:curlService xmlns:ns2="http://linghushaoixa.github.io"><request><password>yingying</password><userName>linghushaoxia</userName></request></ns2:curlService></soap:Body></soap:Envelope>' http://ip:port/cesso/services/curl_soap_service?wsdl



结果如图

可以看到,返回码为10001,msg为succes。这是服务端返回的结果,返回结果仍然以soap协议的报文给出。

思考:

怎么得到soap报文的格式呢?这是一个好问题,不同的框架,有不同的方法,欢迎留言讨论。

参考:

http://blog.csdn.net/russ44/article/details/53308838


阅读全文
0 0
原创粉丝点击