使用servlet的方式作为接口服务端,以报文的格式传递数据。
【1】首先写一个servlet
package ***; import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map; import javax.servlet.ServletException;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier; public class InvoiceProgressServer extends HttpServlet { @Autowired(required=false) @Qualifier("queryProgressServiceImpl") private QueryProgressService queryProgressService; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //设置响应编码 response.setCharacterEncoding("GBK"); PrintWriter pw = null; ServletInputStream is = null; String requestXmlStr = ""; try { pw = response.getWriter(); is = request.getInputStream(); requestXmlStr = IOUtils.toString(is, "UTF-8"); queryProgressService = (QueryProgressService) SpringContextHolder.getBean("queryProgressServiceImpl"); Map params = queryProgressService.valiXmlStr(requestXmlStr); String responseXmlStr = new String(params.get("backXml").toString().getBytes("GBK"), "GBK"); pw.write(responseXmlStr); } catch (Exception e) { e.printStackTrace(); }finally{ if(pw != null){ pw.close(); } if(is != null){ is.close(); } } }
}
在web.xml里面进行配置:
<servlet> <servlet-name>invoiceProgressServer</servlet-name> <servlet-class>com.tt.InvoiceProgressServer</servlet-class>
</servlet>
<servlet-mapping> <servlet-name>invoiceProgressServer</servlet-name> <url-pattern>/invoiceProgressServer</url-pattern>
</servlet-mapping>
【2】接下来写service,主要对于接受的报文数据进行校验,并调用dao然后进行数据查询。
package *; import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import org.jsoup.select.Evaluator.IsEmpty;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Service; @Service("queryProgressServiceImpl")
public class QueryProgressServiceImpl extends BasicService implements QueryProgressService { @Autowired(required=false) @Qualifier("queryProgressDaoImpl") private QueryProgressDao queryProgressDao; /** * 验证报文是否合法 * @param XmlStr * @return */ @Override public Map valiXmlStr(String XmlStr) { Map map = new HashMap(); String systemcode = ""; String reqtime = ""; String jkjjlx = ""; String pch = ""; String zbs = ""; String cxfs = ""; StringBuffer sbf = new StringBuffer(); sbf.append("<?xml version=\"1.0\" encoding=\"GBK\"?><PACKET><HEAD>"); try { //系统来源 systemcode = XmlUtil.getIntervalValue(XmlStr, "<SYSTEMCODE>", "</SYSTEMCODE>"); int num = XmlUtil.NumberOfStatisticalStrings(XmlStr, "<REQINFO>"); //验证系统来源 if("".equals(systemcode)){ sbf.append("<JSZTBS>400</JSZTBS>"); sbf.append("<JSCGBS>0</JSCGBS>"); sbf.append("<JSSBBS>0</JSSBBS></HEAD>"); sbf.append("<BODY><BASIC><SBFPQQLSH></SBFPQQLSH>" + "<ERRORCODE>9999</ERRORCODE>" + "<ERRORMSG>系统来源不能为空</ERRORMSG>" + "</BASIC></BODY></PACKET>"); map.put("backXml", sbf); return map; } //请求时间 reqtime = XmlUtil.getIntervalValue(XmlStr, "<REQTIME>", "</REQTIME>"); if("".equals(reqtime)){ sbf.append("<JSZTBS>400</JSZTBS>"); sbf.append("<JSCGBS>0</JSCGBS>"); sbf.append("<JSSBBS>0</JSSBBS></HEAD>"); sbf.append("<BODY><BASIC><SBFPQQLSH></SBFPQQLSH>" + "<ERRORCODE>9999</ERRORCODE>" + "<ERRORMSG>请求时间不能为空</ERRORMSG>" + "</BASIC></BODY></PACKET>"); map.put("backXml", sbf); return map; } if(!DateUtil.isFormatDate(reqtime,"yyyy-MM-dd HH:mm:ss")){ sbf.append("<JSZTBS>400</JSZTBS>"); sbf.append("<JSCGBS>0</JSCGBS>"); sbf.append("<JSSBBS>0</JSSBBS></HEAD>"); sbf.append("<BODY><BASIC><SBFPQQLSH></SBFPQQLSH>" + "<ERRORCODE>9999</ERRORCODE>" + "<ERRORMSG>请求时间格式错误</ERRORMSG>" + "</BASIC></BODY></PACKET>"); map.put("backXml", sbf); return map; } //接口交易类型 jkjjlx = XmlUtil.getIntervalValue(XmlStr, "<JKJYLX>", "</JKJYLX>"); if(!"123456".equals(jkjjlx)){ sbf.append("<JSZTBS>400</JSZTBS>"); sbf.append("<JSCGBS>0</JSCGBS>"); sbf.append("<JSSBBS>0</JSSBBS></HEAD>"); sbf.append("<BODY><BASIC><SBFPQQLSH></SBFPQQLSH>" + "<ERRORCODE>9999</ERRORCODE>"); if("".equals(jkjjlx)){ sbf.append("<ERRORMSG>接口交易类型不能为空</ERRORMSG></BASIC></BODY></PACKET>"); }else{ sbf.append("<ERRORMSG>接口交易类型错误</ERRORMSG></BASIC></BODY></PACKET>"); } map.put("backXml", sbf); return map; } pch = XmlUtil.getIntervalValue(XmlStr, "<PCH>", "</PCH>"); if("".equals(pch)){ sbf.append("<JSZTBS>400</JSZTBS>"); sbf.append("<JSCGBS>0</JSCGBS>"); sbf.append("<JSSBBS>0</JSSBBS></HEAD>"); sbf.append("<BODY><BASIC><SBFPQQLSH></SBFPQQLSH>" + "<ERRORCODE>9999</ERRORCODE>" + "<ERRORMSG>批次号不能为空</ERRORMSG>" + "</BASIC></BODY></PACKET>"); map.put("backXml", sbf); return map; } zbs = XmlUtil.getIntervalValue(XmlStr, "<ZBS>", "</ZBS>"); if("".equals(zbs)){ sbf.append("<JSZTBS>400</JSZTBS>"); sbf.append("<JSCGBS>0</JSCGBS>"); sbf.append("<JSSBBS>0</JSSBBS></HEAD>"); sbf.append("<BODY><BASIC><SBFPQQLSH></SBFPQQLSH>" + "<ERRORCODE>9999</ERRORCODE>"); sbf.append("<ERRORMSG>总笔数不能为空</ERRORMSG></BASIC></BODY></PACKET>"); map.put("backXml", sbf); return map; }else if(!zbs.equals(num+"")){ sbf.append("<JSZTBS>400</JSZTBS>"); sbf.append("<JSCGBS>0</JSCGBS>"); sbf.append("<JSSBBS>0</JSSBBS></HEAD>"); sbf.append("<BODY><BASIC><SBFPQQLSH></SBFPQQLSH>" + "<ERRORCODE>9999</ERRORCODE>"); sbf.append("<ERRORMSG>总笔数与实际笔数不符</ERRORMSG></BASIC></BODY></PACKET>"); map.put("backXml", sbf); return map; } cxfs = XmlUtil.getIntervalValue(XmlStr, "<CXFS>", "</CXFS>"); if("".equals(cxfs)){ sbf.append("<JSZTBS>400</JSZTBS>"); sbf.append("<JSCGBS>0</JSCGBS>"); sbf.append("<JSSBBS>0</JSSBBS></HEAD>"); sbf.append("<BODY><BASIC><SBFPQQLSH></SBFPQQLSH>" + "<ERRORCODE>9999</ERRORCODE>"); sbf.append("<ERRORMSG>查询方式不能为空</ERRORMSG></BASIC></BODY></PACKET>"); map.put("backXml", sbf); return map; }else if(!"1".equals(cxfs)&&"2".equals(cxfs)&&"3".equals(cxfs)&&"4".equals(cxfs)){ sbf.append("<JSZTBS>400</JSZTBS>"); sbf.append("<JSCGBS>0</JSCGBS>"); sbf.append("<JSSBBS>0</JSSBBS></HEAD>"); sbf.append("<BODY><BASIC><SBFPQQLSH></SBFPQQLSH>" + "<ERRORCODE>9999</ERRORCODE>"); sbf.append("<ERRORMSG>查询方式输入错误</ERRORMSG></BASIC></BODY></PACKET>"); map.put("backXml", sbf); return map;</span><pre name="code" class="java"><span style="font-size: 18px;">}
之后大量的业务逻辑给省略了································
接收的报文数据校验之后,再将查询所需的字段从报文中解析出来。
【3】dao层大部分是sql语句,代码不贴了。
【4】测试类test:
package **; import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException; import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.methods.PostMethod; public class TestInvoiceProgress { public static void main(String[] args) { TestInvoiceProgress t = new TestInvoiceProgress(); String ip = "http://127.0.0.1:8888/my/invoiceProgressServer"; HttpClient client = new HttpClient(); String xml = t.buildXml(); StringBuffer sbf = new StringBuffer(); BufferedReader br = null; InputStream stream = null; try { PostMethod method = new PostMethod(ip); method.setRequestHeader("Content-Type", "application/xml;charset=GBK"); method.setRequestBody(xml); client.executeMethod(method); String requestEncoding = EncodingTest.getEncoding(xml); System.out.println("请求的编码为 :"+requestEncoding); // 打印返回的信息 stream = (InputStream) method.getResponseBodyAsStream(); br = new BufferedReader(new InputStreamReader( stream, "GBK")); String line; while(null!= (line = br.readLine())){ sbf.append(line).append("\n"); } method.releaseConnection(); //String responseXml = new String(sbf.toString().getBytes("GBK"),"UTF-8"); //String sbfs = new String(sbf.toString().getBytes("GBK"),"GBK"); System.out.println("返回来的编码为 :"+EncodingTest.getEncoding(sbf.toString())); System.out.println(sbf.toString()); } catch (Exception e) { e.printStackTrace(); }finally{ try { if(br != null){ br.close(); } if(stream != null){ stream.close(); } } catch (IOException e) { e.printStackTrace(); } } } public String buildXml(){ StringBuilder xml = new StringBuilder(); xml.append("<?xml version=\"1.0\" encoding=\"GBK\"?>"); xml.append("<PACKET>"); xml.append("<HEAD><SYSTEMCODE>12321</SYSTEMCODE>" + "<REQTIME>2017-06-14 12:22:33</REQTIME><JKJYLX>0000</JKJYLX><PCH>22</PCH>" + "<ZBS>10</ZBS><CXFS>4</CXFS></HEAD>"); xml.append("<BODY><REQINFOS><REQINFO><FPQQLSH>123124123</FPQQLSH><FPDM>124124125</FPDM><FPHM>123124</FPHM>" + "<KPRQ>2017-06-20 11:31:15</KPRQ><JSHJ>1.28</JSHJ></REQINFO>"); xml.append("</REQINFOS></BODY></PACKET>"); System.out.println(xml); return xml.toString(); } }
【5】请求报文数据格式示例
<?xml version="1.0" encoding="GBK"?>
<PACKET> <HEAD> <SYSTEMCODE></SYSTEMCODE> <REQTIME></REQTIME> <JKJYLX></JKJYLX> <PCH></PCH> <ZBS>1</ZBS> <CXFS>2</CXFS>//查询方式 </HEAD> <BODY> <REQINFOS count=> ···· </REQINFOS> </BODY>
</PACKET>
【6】返回报文数据格式示例
<?xml version="1.0" encoding="GBK"?>
<PACKET>
<HEAD> <JSZTBS>接收状态标识</JSZTBS> <JSCGBS>接收成功笔数</JSCGBS> <JSSBBS>接收失败笔数</JSSBBS>
</HEAD>
<BODY>
<BASICS> <BASIC> <SBFPQQLSH></SBFPQQLSH> <ERRORCODE></ERRORCODE> <ERRORMSG></ERRORMSG>
</BASIC>
<BASIC>...</BASIC>
</BASICS> <RESPINFOS count="1"> <RESPINFO> .... </RESPINFO> </RESPINFOS> </BODY>
</PACKET>
总结:之前一直碰到了接口响应报文中文乱码的问题。寻求了很多解决办法,都没解决,后来发现只要在servlet里面加上一句代码就OK了。设置他的响应编码就行了。
第一次做一个接口服务,之前查资料发现也可以用webService的方式,但是那是没怎么使用过的方式,便还是采用了自己熟悉的servlet的方式。而且使用报文的方式,数据清晰明白,也是第一次接触使用。