`
JavaSam
  • 浏览: 952183 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

webservice学习之客户端封装类

 
阅读更多
axis1



import java.rmi.RemoteException;

import javax.xml.rpc.ParameterMode;


import org.apache.axis.client.Call;
import org.apache.axis.client.Service;
import org.apache.axis.encoding.XMLType;


public class Axis1ClientUitl {

	public static Object callService(String url,Class type,String method,Object[] args){
		  Call call = initCall(url, method);
		   //执行方法并带上参数
		  Object result=null;
		try {
			result = call.invoke(args);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		return result;
	}

	private static Call initCall(String url, String method) {
		Service service = new Service();
		Call call = null;
		try {
			call = (Call) service.createCall();
			call.setTargetEndpointAddress(new java.net.URL(url));
			call.setOperationName(new javax.xml.namespace.QName("urn:sap-com:document:sap:soap:functions:mc-style", method));
			call.setReturnClass(org.w3c.dom.Element.class);
			call.addParameter("op1", XMLType.XSD_STRING, ParameterMode.IN);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return call;
	}
}

 

AXIS2

 

import javax.xml.namespace.QName;

import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.rpc.client.RPCServiceClient;
public class Axis2ClientUtil {

	/**
	 * 初始化调用客户端
	 * @return
	 */
	private static RPCServiceClient initServiceClient(String serviceURL){
		 //  使用RPC方式调用WebService        
        RPCServiceClient serviceClient;
		try {
			serviceClient = new RPCServiceClient();
			Options options = serviceClient.getOptions();
			//  指定调用WebService的URL
			EndpointReference targetEPR = new EndpointReference(serviceURL);
			options.setTo(targetEPR);
			return serviceClient;
		} catch (AxisFault e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 调用service
	 * @return
	 */
	public static Object[] callService(String serviceURL,Class type,String methodName,String args){
		
	    try {
	    	RPCServiceClient service2Client = initServiceClient(serviceURL);
	    	//  指定methodName方法的参数值
	    	Object[] opAddEntryArgs = new Object[] {args};
	    	//  指定methodName方法返回值的数据类型的Class对象
	    	Class[] classes = new Class[] {type};
	    	//  指定要调用的methodName方法及WSDL文件的命名空间
	    	QName opAddEntry = new QName("urn:sap-com:document:sap:soap:functions:mc-style", methodName);
			return service2Client.invokeBlocking(opAddEntry, opAddEntryArgs,classes);
		} catch (AxisFault e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	    return null;
	}

}


 

 

 

JAVA.NET  URL方式调用

 

import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;

public class UrlCallServiceUtil {

        /**
	 * 
	 * @param strURL 要调用的url地址
	 * @param strCharse	设置字符编码方式,为null,设置为utf8
	 * @return
	 * @throws Exception
	 */
	public static String postRequest(String strURL, String strCharset)
			throws Exception {
		if ((strURL == null) || (strURL.length() == 0))
			return null;
		if ((strCharset == null) || (strCharset.length() == 0)) {
			strCharset = "UTF-8";
		}
		String[] arrContent = (String[]) null;
		if (strURL.indexOf("?") > -1) {
			arrContent = string2Array(strURL.substring(strURL.indexOf("?") + 1), '&', false);
			strURL = strURL.substring(0, strURL.indexOf("?"));
		}

		StringBuffer sb = new StringBuffer();
		HttpURLConnection con = null;
		try {
			URL url = new URL(strURL);
			con = (HttpURLConnection) url.openConnection();
			con.setDoOutput(true);
			con.setDoInput(true);
			con.setInstanceFollowRedirects(true);
			con.setRequestMethod("POST");
			con.addRequestProperty("Content-type","application/x-www-form-urlencoded");
			con.setUseCaches(false);
			con.connect();

			if ((arrContent != null) && (arrContent.length > 0)) {
				StringBuffer sbContent = new StringBuffer();
				for (int i = 0; i < arrContent.length; i++) {
					if ((arrContent[i] == null)	|| (arrContent[i].indexOf("=") == -1))
						continue;
					sbContent.append(arrContent[i].substring(0,	arrContent[i].indexOf("="))).append("=");
					sbContent.append(URLEncoder.encode(arrContent[i].substring(arrContent[i].indexOf("=") + 1),strCharset)).append("&");
				}
				DataOutputStream out = new DataOutputStream(con.getOutputStream());
				out.writeBytes(sbContent.toString());
				out.flush();
				out.close();
			}

			BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(), strCharset));
			String line;
			while ((line = reader.readLine()) != null) {
				sb.append(line);
			}
			con.disconnect();
			return sb.toString();
		} catch (Exception e) {
			System.out.print(e.getMessage());
			sb.append(e.getMessage());
			String str1 = sb.toString();
			return str1;
		} finally {
			if (con != null)
				con = null;
		}
	}

	public static String[] string2Array(String s, char delim, boolean trim) {
		if (s.length() == 0)
			return new String[] {};
		List<String> a = new ArrayList<String>();
		char c;
		int start = 0, end = 0, len = s.length();
		for (; end < len; ++end) {
			c = s.charAt(end);
			if (c == delim) {
				String p = s.substring(start, end);
				a.add(trim ? p.trim() : p);
				start = end + 1;
			}
		}
		String p = s.substring(start, end);
		a.add(trim ? p.trim() : p);
		return (String[]) a.toArray(new String[a.size()]);
	}

}

 

 最后一种,也是最笨的一种-----最原始(因为webservice能够跨语言是因为它在网络上请求,回应的数据结构是固定的或者说是标准)

TIPS:所有的语言封装的webservice,其底层都是传输的相同的xml文件

所以我们也可以自己手动拼接SOAP XML然后用url发送代码如下

 

 

 

SoapTap类

 

import java.util.List;

/**
 * soap标签
 * @author Administrator
 *
 */
public class SoapTag {

	private String tagName;//标签名称
	private String tagValue;//标签值
	private String tagAttr;//标签属性
	private List<SoapTag> children;//子标签
	private SoapTag parent;//父类标签

	public String getTagName() {
		return tagName;
	}

	public void setTagName(String tagName) {
		this.tagName = tagName;
	}

	public String getTagValue() {
		return tagValue;
	}

	public void setTagValue(String tagValue) {
		this.tagValue = tagValue;
	}

	public List<SoapTag> getChildren() {
		return children;
	}

	public void setChildren(List<SoapTag> children) {
		this.children = children;
	}

	public SoapTag getParent() {
		return parent;
	}

	public void setParent(SoapTag parent) {
		this.parent = parent;
	}
	
	public String getTagAttr() {
		return tagAttr;
	}

	public void setTagAttr(String tagAttr) {
		this.tagAttr = tagAttr;
	}

	/**
	 * 转化为soapxml
	 * @return
	 */
	public String toSoapStr(StringBuilder retSoap){
		retSoap.append(createTagL());
		List<SoapTag> kids = getChildren();//拿到子节点
		if(kids != null&&kids.size()>0){
			for(SoapTag tag:kids){
				tag.toSoapStr(retSoap);
			}
		}
		retSoap.append(createTagR());
		return retSoap.toString();
	}
	/**
	 * 生成单个tag标签左边
	 * @param name
	 * @param value
	 * @return
	 */
	private String createTagL(){
		return "<"+getTagName()+">";
	}
    /**
     * 生成单个tag标签右边
     * @param name
     * @param value
     * @return
     */
    private String createTagR(){
    	return  "</"+getTagName()+">";
    }
}

  

工具类(项目中有特殊情况的逻辑,自己改吧改吧)

 

 

import org.apache.log4j.Logger;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.ProtocolException;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;


public class SoapHttpUtil {

    private static Logger log = Logger.getLogger(SoapHttpUtil.class);

    private static Map<String,String> tagMap = new LinkedHashMap<String, String>();
    
    static{
    	tagMap.put("Strcustid", null);
    	tagMap.put("TActivities", "CustId,ActiId,ActiType,ActiCodeNm,TitleNm,StartDt,EndDt,ActiStatus,ActiContent,MangerNms,CusPartis,InformantNm,ReportDt,Attachement");
    	tagMap.put("TContact", "CustId,Name,Sex,DepNm,Post,Email,FixTel,Mobile,IsMainContact");
    	tagMap.put("TIbs", "CustId,IbsId,Name,RelationType,RelationName,DepNm,Email,FixTel,Mobile,IsMainIbs");
    	tagMap.put("TabCondition", "ConField,ConHigh,ConLow,ConOption,ConSign");
    }
    


    /**
     * 调用机构CRM用户新增接口
     * @param serviceURL endpoint
     * @param paramMap
     * @return
     */
    public static String callService(String serviceURL,String custid){
        // 生成XML
        String soapBody = getSoapBody("ZcsGetcustinfoforcrm","urn:sap-com:document:sap:soap:functions:mc-style",custid);
        // 发送soap1.1请求
        Map<String,String> retSoap = doSoapPostRequest(serviceURL, soapBody, "utf-8");
        // 解析结果并返回
        StringBuilder retBuilder = new StringBuilder();
        return parseResponse(retSoap.get("RESULT"));
    }

    /**
     * 根据参数生成soap发送的xml
     * @param paramMap
     * @return
     */
    public static String getSoapBody(String actionurn,String namespace,String custids) {
    	StringBuilder sb = new StringBuilder();
    	sb.append("<soapenv:Envelope xmlns:soapenv='http://schemas.xmlsoap.org/soap/envelope/' ");
    	sb.append("   xmlns:urn='"+namespace+"'>\n");
    	sb.append("   <soapenv:Header/>\n");
    	sb.append("   <soapenv:Body>\n");
    	sb.append("      <urn:"+actionurn+">\n");
    	createSopTag(sb,tagMap,custids);//调用内部类
    	sb.append("      </urn:"+actionurn+">\n");
    	sb.append("   </soapenv:Body>\n");
    	sb.append("</soapenv:Envelope>");
    	return sb.toString();
    	
    }
    /**
     * 子类tag
     */
	private static void createSopTag(StringBuilder ret,Map<String,String> _tagMap,String param){
		for(Entry<String, String> entry:_tagMap.entrySet()){
			String key = entry.getKey();
			String value = entry.getValue();
			if(value == null){
				ret.append("<"+key+">" + param+"</"+key+">");
			}else{
				String values[] = value.split(",");//
				List<SoapTag> kid = new ArrayList<SoapTag>();
				List<SoapTag> itemKid = new ArrayList<SoapTag>();
				
				SoapTag parent = new SoapTag();
				parent.setTagName(key);
				parent.setTagValue("");
				
				SoapTag itemTag = new SoapTag();//itemTag
				itemTag.setTagName("item");
				kid.add(itemTag);
				
				for(String kidTag:values){
					SoapTag kidtag = new SoapTag();
					kidtag.setTagName(kidTag);
					kidtag.setTagValue("");
					itemKid.add(kidtag);
				}
				itemTag.setChildren(itemKid);
				parent.setChildren(kid);
				parent.toSoapStr(ret);//转化为tagxml
			}
		}
	}


    /**
     * 解析结果
     * @param respStr
     * @return
     */
    public static String parseResponse(String respStr){
    	StringBuilder active = new StringBuilder();//活动服务
    	StringBuilder ourcust = new StringBuilder();//我方联系人
    	StringBuilder cust = new StringBuilder();//客户方联系人
        Map<String, String> map = new HashMap<String, String>();
        Document  soupdoc = null;
        try {
        	soupdoc = Jsoup.parse(respStr);
        } catch (Exception e) {
            log.error("接口返回结果无法解析", e);
            throw new RuntimeException("接口返回结果无法解析", e);
        }
        Elements activities = soupdoc.select("TActivities");//活动服务记录
        Elements contact = soupdoc.select("TContact");//客户方联系人
        Elements ibs = soupdoc.select("TIbs");//我方跟踪团队
        parseEles(active,activities.get(0).children());
        parseEles(cust,contact.get(0).children());
        parseEles(ourcust,ibs.get(0).children());
        String activsJson = finalJson("active",active);
        String custjson = finalJson("cust",cust);
        String ourcustjson = finalJson("ourcust",ourcust);
        return "{" + activsJson +","+custjson+","+ourcustjson+"}";
    }
    /**
     * @return
     */
    private static String finalJson(String name ,StringBuilder json){
    	String _name = toJsonStyle(name);
    	String items = json.substring(0,json.lastIndexOf(","));
    	return ""+_name+":["+items+"]";
    }
    /**
     * item节点
     * @param retBuilder
     * @param els
     * @return
     */
    private static String parseEles(StringBuilder retBuilder,Elements els){
    	for(int i = 0 ;i < els.size();i++){
    		Element e = els.get(i);
    		parseChildren(retBuilder,e.children());
    	}
    	return null;
    }
    /**
     * 解析子节点
     * @return
     */
    private static String parseChildren(StringBuilder retBuilder,Elements els){
    	StringBuilder tempBuilder = new StringBuilder();
    	tempBuilder.append("{");
    	for(int i = 0 ;i < els.size();i++){
    		Element e = els.get(i);
    		String jitem = toJson(e);
    		tempBuilder.append(jitem+",");
    	}
    	String  temp = tempBuilder.substring(0, tempBuilder.lastIndexOf(","));
    	retBuilder.append(temp + "},");
    	return retBuilder.toString();
    }
    /**
     * 转换为json对象
     * @return
     */
    private static String toJson(Element e){
    	String name = e.tagName().toUpperCase();
    	String value = e.text();
    	return toJsonStyle(name) + ":" + toJsonStyle(value);
    }
    /**
     * 转换为json格式加双引号
     * @return
     */
    public static String toJsonStyle(String value){
    	return "\""+value+"\"";
    }

    /**
     * Post提交
     * @param urlstr
     * @param body
     * @return
     */
    public static Map<String, String> doSoapPostRequest(String urlstr, String body, String charset) {
        Map<String, String> reMap = new HashMap<String, String>();
        int resCode = -1; //返回状态值
        String resMsg = ""; //返回信息
        HttpURLConnection httpConn = null;
        OutputStream out = null;
        BufferedReader bfw = null;
        String line = null;
        StringBuffer sb = new StringBuffer();
        try {
            URL url = new URL(urlstr);
            httpConn = (HttpURLConnection) url.openConnection();
            httpConn.setRequestMethod("POST");
            if (charset == null) {
                httpConn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
            }else {
                httpConn.setRequestProperty("Content-Type", "text/xml; charset=" + charset);
                httpConn.setRequestProperty("SOAPAction", urlstr);
            }
            httpConn.setUseCaches(false);
            httpConn.setInstanceFollowRedirects(false);
            httpConn.setConnectTimeout(5000);
            httpConn.setReadTimeout(10000);
            httpConn.setDoInput(true);
            httpConn.setDoOutput(true);

            out = httpConn.getOutputStream();
            out.write(body.getBytes("UTF-8"));
            out.flush();
        } catch (MalformedURLException e) {
            log.error("请求异常", e);
            throw new RuntimeException("请求异常", e);
        } catch (ProtocolException e) {
            log.error("请求异常", e);
            throw new RuntimeException("请求异常", e);
        } catch (IOException e) {
            log.error("请求异常", e);
            throw new RuntimeException("请求异常", e);
        } finally {
            if (out != null) {
                try {
                    out.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        // 结果处理
        try {
            // 获取返回值
            resCode = httpConn.getResponseCode();
            resMsg = httpConn.getResponseMessage();
            if (resCode == 200) {
                bfw = new BufferedReader(new InputStreamReader(httpConn.getInputStream(), "utf-8"));
                while ((line = bfw.readLine()) != null) {
                    String curLine = line.trim();
                    if (!isEmpty(curLine))  sb.append(curLine);
                }
                reMap.put("CODE", "1");
                reMap.put("RESULT", sb.toString());
            } else {
                reMap.put("CODE","-1");
                reMap.put("RESULT","code=" + resCode+",msg=" + resMsg);
            }
        } catch (IOException e) {
            log.error("返回结果读取异常", e);
            throw new RuntimeException("返回结果读取异常", e);
        } finally {
            if (bfw != null) {
                try {
                    bfw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return reMap;
    }
    /**
     * 判断字符串是否为空
     * @param src
     * @return
     */
    public static boolean isEmpty(String src) {
        return src == null || src.trim().length() <= 0;
    }


    public static void main(String[] args) throws Exception{
        SoapHttpUtil ws = new SoapHttpUtil();
        String serviceURL = "test.do";
        String ret = ws.callService(serviceURL, "1000004106");
        System.out.println(ret);
    }

}

 

 

 

 

 

0
0
分享到:
评论

相关推荐

    xfire webservice 集成spring客户端封装例子

    xfire webservice 集成spring客户端封装成到一个类打包到客户端就像调静态方法一样

    WebService 服务端及客户端样例工程

    本示例工程涵盖了WebService服务端和客户端的实现,帮助开发者更好地理解和应用WebService技术。 服务端开发: 在服务端,我们通常会创建一个SOAP(Simple Object Access Protocol)服务,它是WebService最常见的一...

    jax webservice 服务器和客户端示例程序

    - **生成客户端代理**:使用`wsimport`工具,根据服务的WSDL生成客户端所需的Java类,这些类封装了与服务交互的逻辑。 - **实例化客户端代理**:创建客户端代理类的实例,通过调用其方法来执行Web服务请求。 - **...

    java版WebService生成客户端和服务端的实例

    这些代码包含了客户端 stubs 和 skeletons,用于封装和解封装SOAP消息。一旦客户端代码生成,你就可以像调用本地方法一样调用远程的WebService。 在实际应用中,你还需要考虑安全性、性能优化、错误处理等问题。...

    客户端编程方式调用webservice

    2. **生成客户端代理类**:上一步生成的客户端代理类包含了与WebService交互所需的所有方法。这些类提供了调用服务端操作的接口,封装了底层的SOAP消息发送和接收。 3. **实例化客户端代理**:在Java代码中,我们...

    webservice for axis客户端详尽代码

    本资源“webservice for axis客户端详尽代码”提供了一套完整的Axis客户端代码示例,对于学习和理解如何在Java应用中使用Axis来调用Web服务极具价值。 一、Web Service基础知识 Web服务通常通过SOAP(Simple ...

    WebService客户端

    WebService客户端是基于Web服务技术的一种应用程序,它允许不同的系统之间通过互联网进行通信和交互。在分布式计算环境中,WebService客户端扮演着关键角色,使得各种应用程序能够跨平台、跨语言地共享数据和服务。 ...

    webservice服务器端和客户端源码

    本压缩包包含的"webservice服务器端和客户端源码"提供了实现Web服务的基本框架,让我们来详细探讨其中涉及的知识点。 一、Web服务基础 1. SOAP(Simple Object Access Protocol):Web服务的核心协议,用于交换结构...

    java webservice服务端及客户端简单示例

    简单的webservice示例,及使用java工具生成客户端 在JDK1.6版本以后,在&lt;JAVA_HOME&gt;/bin目录下有一个wsimport.exe工具,该工具可以根据wsdl文件自动生成webservice接口调用的java客户端代码,十分方便。而自己仅需要...

    webservice客户端简单实例

    总结来说,本实例涉及的是在Windows 7环境下,使用Apache Tomcat和JDK创建一个基于JAX-WS的WebService客户端。这个过程包括获取WSDL文件,生成客户端代码,编写应用程序,部署和运行。理解并掌握这些步骤对于开发与...

    webservice客户端生成工具

    客户端生成工具是实现Web服务交互的关键组件,它能够帮助开发者自动创建与WebService接口进行通信的客户端代码,大大简化了开发流程。本文将详细介绍关于Web服务客户端生成工具的相关知识点。 1. **Web服务标准与...

    javaWebservice代码与客户端

    这些类封装了调用WebService的方法。 3. **实例化客户端**:创建代理类的实例,设置服务的地址(端点URL)。 ```java Service service = Service.create(new URL("http://example.com/UserService?wsdl"), new ...

    在自己的项目中利用axis2+spring发布webservice与客户端调用包括session

    标题中的“在自己的项目中利用axis2+spring发布webservice与客户端调用包括session”指出的是一个关于在实际项目开发中如何使用Axis2和Spring框架来发布Web服务,并且涉及了Web服务客户端调用以及会话(session)...

    webservice 服务器和客户端系统代码

    本项目提供了WebService服务器和客户端的系统代码,便于在本地进行测试和调试。 首先,让我们深入了解一下`SpringBoot`。SpringBoot是由Pivotal团队提供的全新框架,旨在简化Spring应用的初始搭建以及开发过程。它...

    webservice xfire 客户端调用实现

    这些代理类封装了调用远程服务的方法,使得开发者可以像调用本地方法一样调用Web服务。 对象传递是XFire的一大特色,它使得复杂的业务对象能够在Web服务之间无缝传递。在传统的Web服务中,通常需要将对象转换为XML...

    WebService的一些封装技巧.pdf

    6. **WebService的通用封装类RemoteCaller** 文档的另一部分内容中出现了一个名为RemoteCaller的封装类。这个类可能是封装了调用WebService方法的一个通用工具类,通过封装通用的调用逻辑,简化了客户端调用...

    使用webservice实现客户端与服务器通信,

    客户端通过发送SOAP消息与服务器进行通信,SOAP是一种XML格式的消息协议,用于封装请求和响应数据。 在通信过程中,配置文件起着至关重要的作用。对于服务器,可能包含有关监听端口、服务绑定地址、服务部署路径等...

    VC开发的WEBSERVICE客户端

    这些类封装了与Web Service交互的细节。 - **设置必要的库和头文件**:添加生成的代理类文件到项目中,并包含所需的库和头文件,如`atlbase.h`, `atlcom.h`, `atlconv.h`等。 - **实例化和服务调用**:在代码中...

    php编写webservice soap服务端及客户端

    标题“php编写webservice soap服务端及客户端”意味着我们将讨论如何使用PHP实现SOAP协议的两个关键部分:服务提供者和服务消费者。 首先,让我们深入了解PHP如何构建SOAP服务端。在PHP中,我们可以使用SoapServer...

    webservice在java中客户端调用

    在Java中,调用WebService客户端通常涉及以下步骤: 1. **理解SOAP协议**:WebService主要基于SOAP(Simple Object Access Protocol)协议,它是XML格式的消息传输协议,用于交换结构化和类型化的信息。理解SOAP...

Global site tag (gtag.js) - Google Analytics