在原有的SSH项目上开发RESTful风格的HTTP接口

最近做一个需求,其中有个节点涉及到需要在传统的SSH项目中开发RESTful风格的HTTP接口,供请求方访问,获取结果,响应处理结果,其开发风格与spring cloud中控制器(controller)开发风格相类似,通过使用标签来开发,处理请求,获取xml报文,响应xml报文结果,在这里分享自己在实际项目中的开发经历。共勉。

首先来看主体的代码:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.io.InputStreamReader;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.XMLWriter;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * 程序功能:接口(基于RESTful)-HTTP接口,返回接收结果
 * @author 只吃两个荞麦馒头
 * @date 2019-06-17
 *
 */
@Controller
@RequestMapping("/RemoteApplyPayBackService")
public class OnlinePayResultBackService {
			
	 @RequestMapping(value = "/callBackNotify",method = RequestMethod.POST, produces = "text/xml;charset=UTF-8")
	 public void getResultOfRemoteApplyPay(HttpServletRequest request, HttpServletResponse response){
		 try{
			 System.out.println("=============进入接口==========");
			
			// 获取HTTP请求的输入流
			 BufferedReader br = new BufferedReader(new InputStreamReader(
	                 request.getInputStream(), "UTF-8"));

	         String buffer = null;
	         // 存放请求内容
	         StringBuffer xml = new StringBuffer();
	         while ((buffer = br.readLine()) != null) {
	             // 在页面中显示读取到的请求参数
	             xml.append(buffer);
	         } 
	         	         
	         /*接收返回的参数进行业务逻辑的处理 -start */
	         
             //获取支付回调结果:将请求的xml报文转换成对象
	         OnlinePayBackParam param1 = (OnlinePayBackParam) XmlUtil.convertXmlStrToObject(OnlinePayBackParam.class, xml.toString());
	         
	         String orderNo   = param1.getOrderId();
	         String payStatus = param1.getReturnResult();
	         .......          	         
	         /*接收返回的参数进行业务逻辑的处理  -end */

             /*将处理结果告知请求方,返回xml报文 -start*/	         
	         /*返回参数:01-成功,00-失败*/
	         String return_code = "01";
	         returnXML(return_code,"",response);
	         /*将处理结果告知请求方,返回xml报文 -end*/	 
	         br.close();
	         
		 }catch(Exception e){
			 String return_code = "00";
			 String return_msg = "接收失败";
			 
			 returnXML(return_code,return_msg,response);
			 e.printStackTrace();
		 }
		 

		 
	 }
	 /**
	  * 程序功能:返回xml报文 
	  * add 只吃两个荞麦馒头 2019-06-17
	  * @param return_code
	  * @param return_msg
	  */
	 public void returnXML(String return_code,String return_msg,HttpServletResponse response){
		 try {
			 /*返回参数实体类*/
			 ReturnParam returnParam =  new ReturnParam();
			 returnParam.setReturn_code(return_code);
			 returnParam.setReturn_msg(return_msg);
			 String returnXML = XmlUtil.convertToXml(returnParam);
			 
			 OutputFormat format = OutputFormat.createCompactFormat();
			 format.setEncoding("UTF-8");
			 
			 XMLWriter writer = new XMLWriter(response.getOutputStream());
			 //控制xml中特殊字符转义问题,设为false
			 writer.setEscapeText(false);
			 writer.write(returnXML);
			 writer.flush();
			 writer.close();
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 
	 }
		

}

注:这里的业务逻辑处理看实际中项目的业务需求,需要进行什么操作。这里还涉及到xml报文与成Java bean对象相互转换。

两者之间具体怎么转换可参考下这位博主的博客:https://blog.csdn.net/songdeitao/article/details/17304395
这是我找了很久,对比之下,细节写的很详细、很全面的博客。我就不贴出自己的代码,大家可以根据自己需求参考上面这位博主的博客编写代码。

接下来讲一下,在原有的SSH项目上开发RESTful风格的HTTP接口,还需要的配置:

web.xml文件中添加如下配置:

<servlet>
        <servlet-name>rest-servlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
        <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:rest-servlet.xml</param-value>
        </init-param>
        <load-on-startup>100</load-on-startup>
</servlet>
<servlet-mapping>  
        <servlet-name>rest-servlet</servlet-name>
        <url-pattern>/RemoteApplyPayBackService/callBackNotify</url-pattern>  
</servlet-mapping>

注:注意原有的项目中是否已经配置DispatcherServlet,不然就会有冲突。

还需在项目路径:WEB-INF/classes/下创建文件:rest-servlet.xml,配置如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:context="http://www.springframework.org/schema/context"
           xsi:schemaLocation="http://www.springframework.org/schema/beans
           http://www.springframework.org/schema/beans/spring-beans.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context.xsd">
     <context:component-scan base-package="com.sinosoft.lis.pos.wxpay" />
    	<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping" />  
    	<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter" />

</beans>

注:如果是在本地测试,rest-servlet.xml放到项目src路径下即可,编译的时候,就会出现在WEB-INF/classes/下,如需发布,则需放到WEB-INF/classes/下。
上面配置文件中base-package属性应指向你接口文件所在的路径(包)。

如有不对的地方,欢迎各位大佬指正。

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值