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
相关文章推荐
- Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用
- Java调用WebService接口实现发送手机短信验证码功能
- Java调用WebService接口实现发送手机短信验证码功能
- Java调用WebService接口实现发送手机短信验证码功能
- Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用
- Java调用WebService接口实现发送手机短信验证码功能
- Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用
- Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用
- 用jax-ws来调用cxf webservice接口,jax-ws适应cxf安全验证
- webservice 绕过证书验证调用https接口
- Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用
- Java调用WebService接口实现发送手机短信验证码功能
- Java调用WebService接口实现发送手机短信验证码功能
- Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用
- Java调用WebService接口实现发送手机短信验证码功能
- Java调用WebService接口实现发送手机短信验证码功
- 调用webservice接口时出现401错误 添加身份验证
- Linux下使用Curl调用Java的WebService接口
- xfire实现对WebService调用接口用户验证
- Java调用WebService接口实现发送手机短信验证码功能,java 手机验证码,WebService接口调用