servlet接口,报文格式

使用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的方式。而且使用报文的方式,数据清晰明白,也是第一次接触使用。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值