`

SOAP方式发送XML调用Web Services

阅读更多

    客户有一个需求,发布了一个Web Services,其中一个Function,输入的请求参数是Soap协议的XML文件,通过请求后.会输出一个XML格式的文件.

    涉及的技术有Freemaker.

    基本的思路是:通过一个连接请求,发送soap方式的XML请求文档,然后通过读取流的方式,返回结果.

 

private String serviceAddress = "http://localhost:8080/axis/services/Corticon";
private URL webServiceUrl;

@PostConstruct
private void init() {
	try {
		webServiceUrl = new URL(serviceAddress);
	} catch (MalformedURLException e) {
		e.printStackTrace();
	}
}
public String processRequest(DialogDecisionInput input) {
		
		try {
			cfg.setClassForTemplateLoading(this.getClass(), "/");
			cfg.setObjectWrapper(new DefaultObjectWrapper());
			cfg.setNumberFormat("################");

			// Get and config the connection.
			HttpURLConnection conn;
			conn = (HttpURLConnection) webServiceUrl.openConnection();

			conn.setDoOutput(true);
			conn.setDoInput(true);
			conn.setRequestMethod("POST");
			conn.setUseCaches(false);
			conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
			conn.setRequestProperty("SOAPAction", "Corticon");
			

			Map root = new HashMap();
			root.put("model", input);			

			Template template = cfg.getTemplate("soapRequest.ftl");

			OutputStream os = conn.getOutputStream();
			Writer out = new BufferedWriter(new OutputStreamWriter(os, "utf-8"));

			template.process(root, out);

			out.flush();
			out.close();
			

			// Get the soap response.
			InputStream is = conn.getInputStream();
			String rc = IOUtils.toString(is);			
			return rc;
		} catch (TemplateException e) {
			StringWriter sw = new StringWriter();
			e.printStackTrace(new PrintWriter(sw));
			corticonlogger.error("[E00004]" + E00004 + "\n" + sw);
		} catch (IOException e1) {
			StringWriter sw = new StringWriter();
			e1.printStackTrace(new PrintWriter(sw));
			corticonlogger.error("[E00003]" + E00003 + "\n" + sw);
		}		
		return null;
	}

   呵呵,因为Freemarker的process默认是要写到一个文件当中.增加了IO的操作,比较慢,所以我的另外一篇文章也写了:

Freemarker输出字符串而不是文件

  或者参考如下的代码:

 

private String serviceAddress = "http://localhost:8080/axis/services/Corticon";
private URL webServiceUrl;
@PostConstruct
	private void init() {
		try {
			webServiceUrl = new URL(serviceAddress);
		} catch (MalformedURLException e) {
			e.printStackTrace();
		}
	}

	public DialogDecisionService() {
		// Get and config the connection.
		cfg.setClassForTemplateLoading(this.getClass(), "/");
		cfg.setObjectWrapper(new DefaultObjectWrapper());
		cfg.setNumberFormat("################");
		cfg.setCacheStorage(new freemarker.cache.MruCacheStorage(20, 250));
	}
public String processRequest(DialogDecisionInput input) {		
		try {			
			HttpURLConnection conn;
			conn = (HttpURLConnection) webServiceUrl.openConnection();

			conn.setDoOutput(true);
			conn.setDoInput(true);
			conn.setRequestMethod("POST");
			conn.setUseCaches(false);
			conn.setRequestProperty("Content-Type", "text/xml; charset=utf-8");
			conn.setRequestProperty("SOAPAction", "Corticon");			

			Map root = new HashMap();
			root.put("model", input);			

			Template template = cfg.getTemplate("soapRequest.ftl");
			/**
			 * StringWriter instead of Writer
			 * Class StringWriter contains a StringBuffer which can be rendered toString
			 * modify by heweiya
			 */
			OutputStream os = conn.getOutputStream();			
			BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "utf-8"));
			template.setEncoding("UTF-8");
			cfg.setDefaultEncoding("UTF-8");
			template.process(root, writer);			
			writer.flush();
			writer.close();			
			// Get the soap response.
			InputStream is = conn.getInputStream();
			String rc = IOUtils.toString(is);
			
			return rc;
		} catch (TemplateException e) {
			StringWriter sw = new StringWriter();
			e.printStackTrace(new PrintWriter(sw));
			corticonlogger.error("[E00004]" + E00004 + "\n" + sw);
		} catch (IOException e1) {
			StringWriter sw = new StringWriter();
			e1.printStackTrace(new PrintWriter(sw));
			corticonlogger.error("[E00003]" + E00003 + "\n" + sw);
		}
		corticonlogger.error("[E00004]" + E00004 + "\n");
		return null;
	}

 发送的XML文件格式如下:

<?xml version="1.0" encoding="UTF-8"?>

<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema">

  <SOAP-ENV:Body>

    <CorticonRequest xmlns="urn:Corticon" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" decisionServiceName="diabetes">

      <WorkDocuments>

        <D_diabetes id="D_diabetes_id_1">

          <currentPage>p_medInfo</currentPage>

          <dialogId>3</dialogId>

          <dialogInstanceId>771</dialogInstanceId>

          <displayTitle>Pediatric Diabetes Screening Tool</displayTitle>

          <function>screen</function>

				 <lastQuestionAnswered>q_sex</lastQuestionAnswered>

          <locale />

          <noOfChangedFlags>0</noOfChangedFlags>

          <productLine>Loan</productLine>

          <refId>D-00012</refId>

          <region>region 1</region>

          <sessionId xsi:nil="1" />

          <version>1</version>

	          

				           <p_medInfo id="P_medInfo_id_1">

				            <displayTitle>Diabetes Screening - Info</displayTitle>

				            <helpText></helpText>

				            <pageId>7</pageId>

				            <refId>D-00012</refId>

				            <version>1</version>

										            <q_sex id="Q_sex_id_1">										            	

										              <displayFlag>true</displayFlag>	              										              

										              <helpText></helpText>

										              <questionId>41</questionId>

										              <questionText>Sex</questionText>

										              <refId>D-00012</refId>

										              		<responseType>Custom</responseType>

										              		 <uiControl>Radio Button</uiControl>

										              <sequence>1.2</sequence>									             

										              <version>1</version>										              

										              <pageQuestionId>44</pageQuestionId>

										              		  	<response id="R_sex_id_13" Type="R_sex">												             

												              	<responseId>74</responseId>											               

												                <respEnabled xsi:nil="1" />

												                <respLabel>Female</respLabel>

												                <respSelected>false</respSelected>

												                <respSeq>3</respSeq>											                

												                <respValue>F</respValue>

												              </response>										              		  	

										              		  	<response id="R_sex_id_22" Type="R_sex">												             

												              	<responseId>73</responseId>											               

												                <respEnabled xsi:nil="1" />

												                <respLabel>Male</respLabel>

												                <respSelected>true</respSelected>

												                <respSeq>2</respSeq>											                

												                <respValue>M</respValue>

												              </response>										              		  	

										            </q_sex>										           

										            									            

										            								            

													        <q_medIntro id="Q_medIntro_id_7">												              

																  <displayFlag>true</displayFlag>																   

													              <helpText></helpText>

													              <questionId>39</questionId>

													              <questionText>We are asking a few extra questions in order to assess special risks in our new members.  I would like to get some additional information about your child.  This will just take a couple of minutes.</questionText>

													              <refId>D-00012</refId>

													              	 <responseType>No response</responseType>

													              

													              	 <uiControl xsi:nil="1" />

													              <version>1</version>

													              <sequence>1</sequence>

													              <pageQuestionId>40</pageQuestionId>

													              

															               <response id="R_medIntro_id_101" Type="R_medIntro">             

																			 <respEnabled xsi:nil="1" />

																			<respLabel xsi:nil="1" />

																			<respSelected xsi:nil="1" /><respValue></respValue>

															              </response>

													            </q_medIntro>													        

													        <q_age id="Q_age_id_8">												              

																  <displayFlag>true</displayFlag>																   

													              <helpText></helpText>

													              <questionId>40</questionId>

													              <questionText>Current Age</questionText>

													              <refId>D-00012</refId>

													              		<responseType>Custom</responseType>

													              

													              		 <uiControl>Text Box</uiControl>

													              <version>1</version>

													              <sequence>1.1</sequence>

													              <pageQuestionId>45</pageQuestionId>

													              

															               <response id="R_age_id_102" Type="R_age">           

																			 <respEnabled xsi:nil="1" />

																			<respLabel xsi:nil="1" />

																			<respSelected xsi:nil="1" /><respValue>0</respValue>

															              </response>

													            </q_age>													        

													        <q_weight id="Q_weight_id_9">												              

																  <displayFlag>true</displayFlag>																   

													              <helpText></helpText>

													              <questionId>42</questionId>

													              <questionText>Weight</questionText>

													              <refId>D-00012</refId>

													              		<responseType>Custom</responseType>

													              

													              		 <uiControl>Text Box</uiControl>

													              <version>1</version>

													              <sequence>1.3</sequence>

													              <pageQuestionId>43</pageQuestionId>

													              

															               <response id="R_weight_id_103" Type="R_weight">           

																			 <respEnabled xsi:nil="1" />

																			<respLabel xsi:nil="1" />

																			<respSelected xsi:nil="1" /><respValue>0</respValue>

															              </response>

													            </q_weight>													        

													        <q_heightFeet id="Q_heightFeet_id_10">												              

																  <displayFlag>true</displayFlag>																   

													              <helpText></helpText>

													              <questionId>43</questionId>

													              <questionText>Height - Feet</questionText>

													              <refId>D-00012</refId>

													              		<responseType>Custom</responseType>

													              

													              		 <uiControl>Text Box</uiControl>

													              <version>1</version>

													              <sequence>1.4</sequence>

													              <pageQuestionId>42</pageQuestionId>

													              

															               <response id="R_heightFeet_id_104" Type="R_heightFeet">           

																			 <respEnabled xsi:nil="1" />

																			<respLabel xsi:nil="1" />

																			<respSelected xsi:nil="1" /><respValue>0</respValue>

															              </response>

													            </q_heightFeet>													        

													       										              

																  <displayFlag>true</displayFlag>																   

													              <helpText></helpText>

													              <questionId>44</questionId>

													              <questionText>Height - Inches</questionText>

													              <refId>D-00012</refId>

													              		<responseType>Custom</responseType>

													              

													              		 <uiControl>Text Box</uiControl>

													              <version>1</version>

													              <sequence>1.5</sequence>

													              <pageQuestionId>41</pageQuestionId>

													              

															               <response id="R_heightInches_id_105" Type="R_heightInches">           

																			 <respEnabled xsi:nil="1" />

																			<respLabel xsi:nil="1" />

																			<respSelected xsi:nil="1" /><respValue>0</respValue>

															              </response>

													            </q_heightInches>													        

			          </p_medInfo>  

          

            <displayTitle></displayTitle>

            <helpText></helpText>

            <pageId>9</pageId>

            <refId>D-00012</refId>

            <version>1</version>

            <q_findingsIntro id="Q_findingsIntro_id_9">

           	  <displayFlag xsi:nil="1" />                                 

              <helpText></helpText>

              <questionId>50</questionId>

              <questionText>Recap:</questionText>

               <refId>D-00012</refId>

													              	 <responseType>No response</responseType>

													              

													              	 <uiControl xsi:nil="1" />

              <version>1</version>

              <sequence>1</sequence>

              <pageQuestionId>60</pageQuestionId>



	              <response id="R_findingsIntro_id_103" Type="R_findingsIntro">              

					 <respEnabled xsi:nil="1" />

					<respLabel xsi:nil="1" />

					<respSelected xsi:nil="1" />

	                <respValue></respValue>

	              </response>

            </q_findingsIntro>

            
          </p_findings>

        </D_diabetes>

      </WorkDocuments>

    </CorticonRequest>

  </SOAP-ENV:Body>

</SOAP-ENV:Envelope>
 

 

分享到:
评论

相关推荐

    c#动态调用Webservices 不用VS生成 简单快捷

    通过本文的探讨,我们不仅了解了在C#中动态调用WebServices的必要性和优势,还深入剖析了其实现的技术细节,包括CodeDom、WebClient、反射机制以及对XML/SOAP协议的基本理解。掌握了这些知识后,开发者将能够在更加...

    使用Soap消息调用Web Services

    使用 Soap 消息调用 Web Services SOAP(Simple Object Access Protocol)是一种简单的协议,用于在分布式环境中交换信息。它基于 XML 协议,包括四个部分:SOAP 封装、SOAP 编码规则、SOAP RPC 表示和 SOAP 绑定。...

    vc调用Webservices

    而Web服务(Web Services)则是一种通过互联网交换数据和实现功能的方式,它基于开放的XML(Extensible Markup Language)标准。当你需要在VC++应用中调用Web服务时,这通常涉及到SOAP(Simple Object Access ...

    用Java实现基于SOAP的XML文档网络传输及远程过程调用(RPC).

    Java作为一种广泛应用的编程语言,提供了丰富的库和支持来处理SOAP通信,其中最著名的是JAX-WS(Java API for XML Web Services)。 首先,理解SOAP消息结构至关重要。一个基本的SOAP消息由三部分组成:Envelope...

    Ajax调用webservices

    本文将深入探讨如何使用Ajax调用Web服务(Webservices),以实现客户端与服务器端的异步通信。 一、Ajax基础 Ajax的核心是JavaScript对象XMLHttpRequest,它提供了与服务器进行交互的能力。通过创建XMLHttpRequest...

    Qt下实现WebServer的调用之qtsoap

    首先,`qtsoap`是基于Qt框架的一个库,它允许开发者通过SOAP协议发送和接收XML数据,以调用远程Web服务。SOAP是一种轻量级的、基于XML的协议,用于交换结构化的和类型化的信息。在Qt中使用qtsoap,可以极大地简化与...

    拼接xml调用webservice

    本主题的核心是"拼接XML调用WebService",这通常指的是通过构建XML字符串来构造请求,然后发送该请求到一个Web Service接口以获取响应。以下是对这个过程的详细解释: 1. **XML基础**:XML是一种结构化标记语言,它...

    【Delphi】http post请求 webservices接口

    在调用Web服务时,Delphi开发者需要构建符合SOAP规范的XML消息。 在Delphi中,可以使用 Indy 或 WinHTTP 组件库来实现HTTP POST请求。这里以Indy为例,其TIdHTTP组件提供了一种简单的方式来发送HTTP请求。首先,...

    C++调用Web services的控制台应用程序

    本项目"**C++调用Web services的控制台应用程序**"正是这样一个示例,它展示了如何在C++环境下创建一个能调用Web服务的简单命令行应用。 首先,我们要理解Web服务的本质。Web服务是一种基于HTTP协议,使用XML(可...

    add_Webservice_C#调用webservices_c#webservice_webservice_

    Web服务通常基于简单对象访问协议(SOAP)进行通信,它是一种XML格式的消息交换协议,用于传输数据。而Web服务描述语言(WSDL)是SOAP服务的接口定义,描述了服务的地址、操作和消息格式。C#中的`System....

    PB调用WebServices的例子IP地址查询服务.rar_PB调用WebServices实例_pb_welle3k_服务

    WebServices返回的数据通常是以XML格式的SOAP响应。在PB中,我们需要解析这个响应来提取有用的信息。这可以通过使用PB的XML处理能力,如DOM(Document Object Model)或XPath(XML Path Language)来完成。例如,...

    基于 .NET, Java and MS SOAP Toolkit进行Web Services 的客户端调用程序例子

    在Java世界中,调用Web服务通常使用JAX-WS(Java API for XML Web Services)或者Apache Axis库。以下是基本流程: 1. **生成Stub类**:使用wsimport工具或Axis的wsdl2java命令,从WSDL文件生成服务的Stub类。 2. ...

    java调用soap接口案例

    Java调用SOAP(Simple Object Access Protocol)接口是Web服务交互中的常见操作,SOAP是一种基于XML的协议,用于在Web上交换结构化的和类型化的信息。本案例主要关注如何使用Java来实现SOAP请求并获取响应,具体我们...

    用java调用webservices的三种方式

    ### 用Java调用WebServices的三种方式 随着互联网技术的发展与成熟,WebServices作为一种标准的、跨平台的、基于XML的信息交换模式被广泛应用。在Java领域,调用WebServices通常涉及遵循一定的技术规范和标准。本文...

    使用Microsoft Visual C#开发XML Web Services和Server Components

    XML Web Services的核心在于SOAP(简单对象访问协议),它是一种轻量级的消息协议,用于在不同的应用程序之间传输数据。WSDL(Web服务描述语言)则用于定义服务的接口,而UDDI(统一描述、发现和集成)帮助服务发布...

    Qt 直接构建XML开发web services客户端

    在IT领域,Web服务是一种通过Internet进行通信的标准化方式,允许不同系统间的应用程序相互交互。在本主题中,我们将深入探讨如何使用Qt框架构建一个XML基础的Web服务客户端,特别是针对SOAP(简单对象访问协议)...

    java调用webservices

    通过上述代码分析,我们可以了解到使用Java调用Web服务的具体实现方式,包括基于Apache Axis的SOAP Web Service调用和使用SOAP协议直接构建调用的过程。这对于Java开发者来说是非常实用的知识点,可以帮助他们在实际...

    调用天气预报Web Services实例.rar

    SOAP(Simple Object Access Protocol)是Web Services中最常用的通信协议,它定义了消息结构和传输方式。 在这个实例中,我们可能会使用到SOAP请求来获取天气预报信息。SOAP消息通常包含三个主要部分:Envelope、...

    调用Webservices的两种方式

    调用Web服务通常有两种主要的方式:SOAP(Simple Object Access Protocol)和REST(Representational State Transfer)。这两种方式各有特点,适用于不同的场景。 ### SOAP(简单对象访问协议) SOAP是基于XML的...

    JAX-WS_Java API for XML Web Services

    **JAX-WS: Java API for XML Web Services** JAX-WS(Java API for XML Web Services)是Java平台上用于创建Web服务和Web服务客户端的核心API。这个标准由Java社区进程(JCP)制定,旨在简化面向服务架构(SOA)的...

Global site tag (gtag.js) - Google Analytics