java 调用webservice 接口 (入参为xml),并解析soap 报文(原生dom解析)

public static String doRequest(String url,String method,String data,String xmlns,String way) {
		String result="";
		try {
			
			// 2 创建URL:
			StringBuffer sb=null;
			URL req_url = new URL(url);
			//第二步:打开一个通向服务地址的连接  
	        HttpURLConnection con= (HttpURLConnection) req_url.openConnection();  

	        //con.setConnectTimeout(30000);// 设置连接主机超时时间(毫秒)
			//con.setReadTimeout(30000);// 设置主机读取数据超时
			// 4,设置请求方式和请求头:
			con.setDoInput(true); // 是否有入参
			con.setDoOutput(true); // 是否有出参
			con.setRequestMethod(method); // 设置请求方式
			con.setRequestProperty("connection", "Keep-Alive");
			con.setRequestProperty("user-agent", "Apache-HttpClient/4.1.1");
	        //con.setRequestProperty("Accept-Encoding", "gzip,deflate");
			con.setRequestProperty("content-type", "text/xml;charset=utf-8");
			//设置请求参数
			String requestBody = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"";
			requestBody += " xmlns:web=\""+xmlns+"\">";
			requestBody += "<soapenv:Body>";
			requestBody += "<web:"+way+">";
			requestBody += "<web:in0>";
			
			requestBody +="<![CDATA["+data+"]]>";
			requestBody += "</web:in0>";
			requestBody += "</web:"+way+">";
			requestBody += "</soapenv:Body>";
			requestBody += "</soapenv:Envelope>";
			new BaseBean().writeLog("请求包体--", requestBody);
			//System.out.println("请求包体--"+ requestBody);
			// 6,通过流的方式将请求体发送出去:
			OutputStream out = con.getOutputStream();
			out.write(requestBody.getBytes("utf-8"));
			out.flush();
			out.close();
			// 7,服务端返回正常:
			int code = con.getResponseCode();
			//System.out.println(code);
			new BaseBean().writeLog("code--", code);
				if (code == 200) {// 服务端返回正常
					InputStream is = con.getInputStream();
					byte[] b = new byte[1024];
					sb = new StringBuffer();
					int len = 0;
					while ((len = is.read(b)) != -1) {
					String str = new String(b, 0, len, "UTF-8");
					sb.append(str);
					}	
					result=sb.toString();
					//System.out.println(result);
					is.close();
					con.disconnect();
				} 
                /*
				 * else{ 
                       System.out.println("服务器返回失败"); 
                       }
					 */
		}catch (Exception e) {
			System.out.println(e.getMessage());
		}
		
	return result;	
}
	//w3c dom解析soap
	public static String GetSoap(String result) throws Exception{
		//解析Soap包文
		//new BaseBean().writeLog("获取返回数据"+result);
		 DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();  
	       DocumentBuilder db = dbf.newDocumentBuilder();  
	       Document document = db.parse(new InputSource(new StringReader(result)));  
	       NodeList sessions = document.getChildNodes(); 
	       String xml="";
	       for (int i = 0; i < sessions.getLength(); i++) {   
	           Node session = sessions.item(i);  
	           NodeList sessionInfo = session.getChildNodes();  
	           for (int j = 0; j < sessionInfo.getLength(); j++) {  
	               Node node = sessionInfo.item(j);  
	               NodeList sessionMeta = node.getChildNodes();  
	               for (int k = 0; k < sessionMeta.getLength(); k++) {        
	                   xml=sessionMeta.item(k).getTextContent();   
	               }  
	           }  
	       }   
	       System.out.println("获取xml 文件"+xml);
		return xml;
			
		}
	// XML格式字符串转hashmap通过key value 获取指定标签值
		public static Map<String, String> getXMLStringValue(String result){
			
			Map<String, String> rm = new HashMap<String, String>();
			StringReader sr = new StringReader(result); 	// result数据源:XML格式字符串
			InputSource is = new InputSource(sr);
			DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
			DocumentBuilder builder = null;
			try {
				builder = factory.newDocumentBuilder();
			} catch (ParserConfigurationException e) {
				e.printStackTrace();
			}
			org.w3c.dom.Document document = null;
			try {
				document = builder.parse(is);
			} catch (SAXException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			}
			Element rootElement = document.getDocumentElement();
			NodeList nodes = rootElement.getChildNodes();	// 一级标签
	 
			for (int i = 0; i < nodes.getLength(); i++) {
	 
				Node node = nodes.item(i);
				if (node.getNodeType() == Node.ELEMENT_NODE) {
					if (node.getFirstChild() != null) {
						rm.put(node.getNodeName(), node.getFirstChild().getNodeValue());
					}
					NodeList nodeList = node.getChildNodes();	// 二级标签
					if (nodeList != null) {
						for (int j = 0; j < nodeList.getLength(); j++) {
							Node childnode1 = nodeList.item(j);
							if (childnode1 instanceof Element) {
								if (childnode1.getFirstChild() != null) {
									rm.put(childnode1.getNodeName(), childnode1.getFirstChild().getNodeValue());
								}
								NodeList nodeList1 = childnode1.getChildNodes();	// 三级标签
	 
								if (nodeList1 != null) {
									for (int k = 0; k < nodeList1.getLength(); k++) {
										Node childnode2 = nodeList1.item(k);
										if (childnode2 instanceof Element) {
											if (childnode2.getFirstChild() != null) {
												rm.put(childnode2.getNodeName(), childnode2.getFirstChild().getNodeValue());
											}
											NodeList nodeList2 = childnode2.getChildNodes();
											
											// 当有四级或以上标签时,在此重复写解析代码
										}
									}
	 
								}
							}
						}
	 
					}
				}
			}
			return rm;
		}
}



在main里面调用测试,这里只贴出调用代码

try {
            //准备xml参数
            String xml="xml参数";
			String data = SmsWebserviceUtil.doRequest("接口地址", "请求方式",xml, "http://webservice","接口方法");
			//System.out.println(data);
			String result=SmsWebserviceUtil.GetSoap(data);
			Map<String,String> requestMap=SmsWebserviceUtil.getXMLStringValue(result);
			// 获取指定标签值
			String value=requestMap.get("key");
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

解析soap这两个方法可以优化合并。大佬们可以合并下。

  • 0
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: Java可以通过SOAP协议调用Web Service接口。具体步骤如下: 1. 创建一个SOAP消息请求体,包括SOAP消息头和SOAP消息体。 2. 创建一个SOAP连接对象,并设置连接的URL地址。 3. 发送SOAP消息请求,等待Web Service接口返回SOAP消息响应。 4. 解析SOAP消息响应,获取需要的数据。 5. 关闭SOAP连接对象。 需要注意的是,调用Web Service接口需要提供接口的WSDL文件,以便生成客户端代码。可以使用Java自带的wsimport工具生成客户端代码,也可以使用第三方工具如Apache CXF等。 另外,调用Web Service接口时需要注意SOAP消息的格式和命名空间等问题,以确保请求和响应能够正确解析。 ### 回答2: Java是一门广泛应用于开发Web应用程序的高级编程语言。它是一门面向对象的语言,具备简单易学、可移植性强、安全性高等特点,被广泛地应用于各种软件开发领域中。Java调用WebService接口,是现在Web开发中非常重要的技术之一。 WebService(简称WS)是基于Web的远程调用协议,用于服务提供者和服务消费者之间的互操作。它是一种跨平台、跨语言的通信方式,其中SOAP(简单对象访问协议)是一种常用的WebService交互协议。Java可以通过SOAP调用WebService接口服务。 Java中使用SOAP调用WebService接口的步骤如下: 1.编写WebService客户端代码 Java提供了访问WebService接口服务的类:javax.xml.soap.SOAPConnection和javax.xml.soap.SOAPConnectionFactory。我们可以通过下面的代码获取SOAPConnection: ``` SOAPConnectionFactory factory = SOAPConnectionFactory.newInstance(); SOAPConnection connection = factory.createConnection(); ``` 2.创建SOAP请求 在SOAP请求中,我们需要设置相关的参数,包括:SOAP消息的版本、SOAP请求消息体、SOAP请求头等。下面是创建请求消息的代码示例: ``` //初始化一个SOAP消息 MessageFactory messageFactory = MessageFactory.newInstance(SOAPConstants.SOAP_1_1_PROTOCOL); SOAPMessage soapMessage = messageFactory.createMessage(); //创建SOAP报文SOAPHeader soapHeader = soapMessage.getSOAPHeader(); SOAPBody soapBody = soapMessage.getSOAPBody(); ``` 3.设置SOAP请求参数 在请求中,需要设置相关参数,包括EndPoint地址、SOAPAction、参数值等。下面是设置请求参数的代码示例: ``` //设置WebService的请求地址 URL url= new URL("http://www.example.com/WebService"); //创建一个SOAP消息并设置Header和Body SOAPMessage soapMessage = MessageFactory.newInstance().createMessage(); SOAPHeader soapHeader = soapMessage.getSOAPHeader(); SOAPBody soapBody = soapMessage.getSOAPBody(); //设置要调用WebService方法名 String methodName = "getWebServiceResult"; //设置SoapAction String soapAction = "http://www.example.com/WebService/getWebServiceResult"; soapMessage.getMimeHeaders().addHeader("SOAPAction", soapAction); //调用WebService SOAPConnectionFactory factory = SOAPConnectionFactory.newInstance(); SOAPConnection connection = factory.createConnection(); SOAPMessage response = connection.call(soapMessage, url); ``` 4.解析SOAP响应 在获取WebService接口服务的结果后,我们需要对SOAP响应进行解析。下面是解析SOAP响应的代码示例: ``` //解析响应数据 SOAPBody soapBody = response.getSOAPBody(); NodeList nodeList = soapBody.getElementsByTagName("return"); String responseStr = nodeList.item(0).getTextContent();//获取返回值 ``` 综上所述,Java调用WebService接口SOAP的过程包括了编写WebService客户端代码、创建SOAP请求、设置SOAP请求参数及解析SOAP响应等步骤。这些步骤的实现可以帮助我们更好地调用WebService接口,并获取接口的响应结果。 ### 回答3: Java 语言作为一种广泛应用于企业级应用的编程语言,自然对接webservice等网络接口是其常见的应用场景之一。在Java中,调用webservice接口有多种方法,其中最常用的是使用soap协议来调用webservice接口soap协议即简单对象访问协议,是一种基于XML的协议,用于将网络上的消息传递给远程执行的程序。使用soap协议调用webservice接口可以实现跨平台、跨语言、跨网络的消息传递,是一种比较常用的通信方式。 在Java中,调用webservice接口需要使用Java API for XML Web Services(JAX-WS)技术。JAX-WS是一种Java EE标准,提供了一套API,支持Java应用与webservice接口之间的通信。以下是调用webservice接口的步骤: 1. 创建一个JAX-WS客户端工程(Client Project),该工程用于调用webservice接口。可以在Eclipse、IntelliJ IDEA等IDE中创建该工程。 2. 在工程中创建一个webservice客户端代理(Web Service Client Proxy),用于调用webservice接口。可以使用Eclipse这类IDE中提供的WSDL文件生成工具(例如wsimport)来生成webservice客户端代理。 3. 使用生成的webservice客户端代理来调用webservice接口。在Java中,使用webservice客户端代理对象调用webservice接口的过程类似于使用Java接口调用远程程序,可以通过SOAPMessage传输请求和响应信息,完成与webservice接口进行交互的过程。 需要注意的是,在调用webservice接口时,需要提供webservice接口的URL、命名空间(Namespace)、操作名称(Operation)等信息。另外,我们还可以为webservice接口提供请求头信息(Header)和请求参数(Parameter),以便webservice端正确地处理请求。 总之,通过Java调用webservice接口,在很多应用中都是必不可少的一步,特别是在企业级应用中更是如此。因此,我们需要深理解soap协议和JAX-WS技术的原理和应用,才能在实际开发中进行合理的使用和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值