最近做一个需求,其中有个节点涉及到需要在传统的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属性应指向你接口文件所在的路径(包)。
如有不对的地方,欢迎各位大佬指正。