您的位置:首页 > 运维架构 > Linux

curl验证,调用webservice接口

2017-07-05 19:57 976 查看

概要:

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[/code] 


格式化一下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[/code] 
结果如图



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

思考:

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

http://blog.csdn.net/russ44/article/details/53308838
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  wsdl curl soap linux 异构
相关文章推荐