- 浏览: 21812 次
- 性别:
- 来自: 西安
最新评论
这两天上司让我编一个程序,读取数据库记录并远程调接口传xml报文,处理返回结果。
想想没啥难的,就二话不说的写起程序来了。结果竟然用了一天多时间才搞定,无比郁闷呐。还是记录下来方便自己查看,并且分享大家。jdk用的1.5.0_22版本。
期间用apache的httpclient也做过,也没有成功,对端一直给我返回个空指针异常,网上怎么查都查不出来个结果。
后来,反编译对端的class后,简直崩溃呀。。。原来对端获取报文方式是request.getParameter("$xml");
用到了两个jar包一起传上来,一个oracle驱动包,一个dom4j解析xml包。
在命令窗口运行,必须配置好环境变量.
直接在命令窗口配置当前命令窗口可用范围的classpath.
注意classpath等号后面的.;是必须要的
set classpath=.;C:\Program Files\java\jdk1.5.0_22\lib\dt.jar;C:\Program Files\java\jdk1.5.0_22\lib\tools.jar;C:\Program Files\java\jdk1.5.0_22\lib;C:\httpxml\oracle_jdbc.jar;C:\httpxml\dom4j.jar javac HttpURLConnectionTest.java java HttpURLConnectionTest http://远程接口地址:端口/接收报文类 数据库ip 数据库sid 数据库用户名 数据库密码
import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.StringReader; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; import java.net.URLDecoder; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; 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.dom4j.DocumentException; import org.dom4j.Element; import org.dom4j.io.SAXReader; /** * 远程调用接口发送报文 * 2012-03-14 * @author mapengwei * @version 1.0 */ public class HttpURLConnectionTest { //数据库连接对象 private Connection conn = null; /** * 查询数据库所有未处理记录 * @param dbip 数据库地址 * oid oracle数据库sid * username 数据库用户名 * password 数据库密码 * @throws ClassNotFoundException * SQLException * @return List 返回List结果集 */ @SuppressWarnings("unchecked") public List query(String dbIP,String oid,String userName,String passWord) throws ClassNotFoundException, SQLException { List list = new ArrayList(); //加载oracle数据库驱动 Class.forName("oracle.jdbc.driver.OracleDriver"); if(null==conn){ conn = DriverManager.getConnection("jdbc:oracle:thin:@"+dbIP+":1521:"+oid+"", userName,passWord); } //查询数据库flag为0的所有数据,只取ecid,ecname两列。 String sql = "select t.ecid,t.ecname from t_ec t where t.flag=0"; Statement stm = conn.createStatement(); ResultSet rs = stm.executeQuery(sql); //遍历结果集 while (rs.next()) { String[] arras = new String[2]; Map map = new HashMap(); String ecid = rs.getString(1); String ecname = rs.getString(2); arras[0] = ecid; arras[1] = ecname; map.put("ec", arras); list.add(map); } return list; } /** * 组装报文,因为报文只有两个节点是需要动态插入的,其他节点都一样,所以就只传入两个参数 * @param ecid * ecname * @return String 返回报文内容 */ public String packageMessage(String ecID, String ecName) { //格式化日期类型 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss"); //存放报文 StringBuffer xmlData = new StringBuffer(); xmlData.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"); xmlData.append("<ProvBOSS>"); xmlData.append("<BIPCode>"); xmlData.append("BIP4B728"); xmlData.append("</BIPCode>"); xmlData.append("<BIPVer>"); xmlData.append("0100"); xmlData.append("</BIPVer>"); xmlData.append("<ActivityCode>"); xmlData.append("T4101704"); xmlData.append("</ActivityCode>"); xmlData.append("<ActionCode>"); xmlData.append("0"); xmlData.append("</ActionCode>"); xmlData.append("<ProcID>"); xmlData.append("1000001"); xmlData.append("</ProcID>"); xmlData.append("<TransIDO>"); xmlData.append("123456"); xmlData.append("</TransIDO>"); xmlData.append("<ProcessTime>"); //动态构造当前系统时间 xmlData.append(sdf.format(new Date())); xmlData.append("</ProcessTime>"); xmlData.append("<TestFlag>"); xmlData.append("0"); xmlData.append("</TestFlag>"); xmlData.append("<MsgSender>"); xmlData.append("BOSS"); xmlData.append("</MsgSender>"); xmlData.append("<MsgReceiver>"); xmlData.append("PADC"); xmlData.append("</MsgReceiver>"); xmlData.append("<SvcConVer>"); xmlData.append("0100"); xmlData.append("</SvcConVer>"); xmlData.append("<SvcCont><![CDATA["); xmlData.append("<ECInfo><BaseInfo><ECID>"+ecID); xmlData.append("</ECID><ECName>"); xmlData.append(ecName); xmlData.append("</ECName><OprCode>01</OprCode><ECTel>13844444444</ECTel><ECManName>匿名</ECManName></BaseInfo></ECInfo>]]></SvcCont>"); xmlData.append("</ProvBOSS>"); //打印报文 System.out.println("send xml:"+xmlData.toString()); //返回报文 return xmlData.toString(); } /** * 需要动态输入5个参数,当然也可以在程序中写死 * 动态输入参数方便使用 * @param args[0] 远程接口地址 * args[1] 数据库ip * args[2] oracle数据库sid * args[3] oracle数据库用户名 * args[4] oracle数据库密码 */ public static void main(String[] args) { //接口地址 String url = args[0]; HttpURLConnectionTest at = new HttpURLConnectionTest(); List list = null; try { //获取查询的数据库结果集 list = at.query(args[1],args[2],args[3],args[4]); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } if (null == list) { return; } //遍历数据库结果集 for (int i = 0; i < list.size(); i++) { Map map = (Map) list.get(i); String[] arras = (String[]) map.get("ec"); try { String xmlData = at.packageMessage(arras[0], arras[1]); //取一条数据,就修改一下数据库的flag标示 at.updateDBRecord(arras[0],"","", "1"); //调用远程接口发送xml at.sendAndRecieveXmlData(xmlData,url,arras[0]); } catch (IOException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } //关闭数据库连接 at.closeConnection(); } /** * 解析远程接口返回的报文 * @param InputStream 输入流对象 * ecID 用于修改数据记录,数据库中唯一标识 * @throws IOException * SQLException * DocumentException */ public void parseRepXMl(InputStream inputStream, String ecID) throws IOException, SQLException, DocumentException{ //存放返回的报文 StringBuffer recieveData = new StringBuffer(); BufferedReader in = null; //BufferedReader读取返回报文 in = new BufferedReader(new InputStreamReader(inputStream,"utf-8")); for (String inputLine = null; (inputLine = in.readLine()) != null;){ recieveData.append(inputLine); } //打印接收到的报文 System.out.println("recieveData:"+recieveData.toString()); in.close(); String xmlData = URLDecoder.decode(recieveData.toString(),"utf-8"); Element root = null; //SAXReader解析报文 SAXReader saxReader = new SAXReader(); root = saxReader.read(new StringReader(xmlData)).getRootElement(); //获取报文中的response节点 Element rspElmt = root.element("Response"); //获取报文中response节点中的子节点值 String rspCode = rspElmt.elementTextTrim("RspCode"); String rspDesc = rspElmt.elementTextTrim("RspDesc"); //判断处理是否成功,并修改数据库内容,状态 if(null!=rspCode&&"0000".equals(rspCode)){ updateDBRecord(ecID, rspCode, rspDesc, "2"); }else{ updateDBRecord(ecID, rspCode, rspDesc, "3"); } } /** * 修改数据库内容、状态 * @param ecID * rspCode 返回报文中的返回码 * rspDesc 返回报文中的返回码描述 * flag 将记录修改为flag状态 * @throws SQLException */ public void updateDBRecord(String ecID,String rspCode,String rspDesc,String flag) throws SQLException{ //构造修改sql语句 String sql = "update t_ec t set t.flag ='"+flag+"', t.rspcode = '"+rspCode+"', t.rspdesc = '"+rspDesc+"' where t.ecid = '"+ecID+"'"; //打印sql语句 System.out.println("sql="+sql); PreparedStatement pstm = conn.prepareStatement(sql); int result = 0; result=pstm.executeUpdate(sql); pstm.close(); //判断执行数据库影响行数 if(0!=result){ System.out.println("更新ECID="+ecID+"的记录状态为"+flag+"成功."); }else{ System.out.println("更新ECID="+ecID+"的记录状态为"+flag+"失败."); } } /** * 发送报文 * @param xmlData 发送的报文 * ecID 传参,用于后面方法修改数据库记录 * @throws Exception */ private void sendAndRecieveXmlData(String xmlData, String url, String ecID) throws Exception { OutputStreamWriter osw; //获取http连接 HttpURLConnection con = getConnection(url); byte[] xmlByteData = xmlData.getBytes("utf-8"); try { //设置Context-Length con.setRequestProperty("Context-Length", String.valueOf(xmlByteData.length)); //获得输出流 OutputStream outputStream = con.getOutputStream(); BufferedOutputStream bos = new BufferedOutputStream(outputStream); osw = new OutputStreamWriter(bos, "UTF-8"); //写入 //整了一天多,就是因为这里的$xml,开始以为对方是直接读取传过去的报文,后来反编译对端class后发现,竟然是靠这个参数来接收的,崩溃的... osw.write((new StringBuilder()).append("$xml=").append(xmlData).toString()); //清空缓存 osw.flush(); osw.close(); //解析返回报文 parseRepXMl(con.getInputStream(), ecID); } catch (IOException ex) { throw new IOException(ex.getMessage()); } catch (IllegalArgumentException argumetEx) { throw new IllegalArgumentException(argumetEx.getMessage()); } catch (Exception ex) { throw new Exception(ex.getMessage()); } } /** * 得到一个有效的连接 * @param url 连接端口 * @return HttpURLConnection 一个有效的连接 */ private HttpURLConnection getConnection(String url) throws IOException { HttpURLConnection urlconnection = null; try { //得到url连接对象 URL urlcon = new URL(url); //获取到connection连接对象 urlconnection = (HttpURLConnection) urlcon.openConnection(); //设置头参数 // urlconnection.setRequestProperty("Content-Type", "text/xml;charset=UTF-8"); urlconnection.addRequestProperty("content-type", "application/x-www-form-urlencoded;charset=UTF-8"); // urlconnection.setRequestProperty("Accept", "text/xml"); urlconnection.setRequestProperty("version", "100"); urlconnection.setRequestMethod("POST"); urlconnection.setDoOutput(true); urlconnection.setDoInput(true); urlconnection.setUseCaches(false); } catch (java.net.ProtocolException proEx) { throw new IOException(proEx.getMessage()); } catch (MalformedURLException MaEx) { throw new IOException(MaEx.getMessage()); } catch (Exception ex) { throw new IOException(ex.getMessage()); } //返回连接 return urlconnection; } //关闭数据库连接 public void closeConnection(){ if(null!=conn){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
数据库脚本
create table T_EC ( ECID VARCHAR2(20), ECNAME VARCHAR2(50), FLAG INTEGER default 0, RSPCODE VARCHAR2(20), RSPDESC VARCHAR2(50) ); -- Add comments to the columns comment on column T_EC.FLAG is '0,表示未处理.1,表示正在处理.2.表示已处理.3,表示处理失败'; comment on column T_EC.RSPCODE is '处理结果返回码'; comment on column T_EC.RSPDESC is '处理结果返回码描述';
- dom4j.jar (475.1 KB)
- 下载次数: 4
- oracle_jdbc.jar (1.1 MB)
- 下载次数: 3
发表评论
-
jdk 无限制策略文件(jdk1.6 jdk1.7)
2013-04-02 15:21 1771java.lang.SecurityException ... -
nosql 数据库 redis 安装与使用
2013-03-24 15:13 1050使用的redis主机为linux系统。 1.在linux ... -
多台服务器共享一个数据库(oracle数据库),防止同时访问一批数据
2012-07-07 22:37 3476在处理数据时,经常会用定时任务间隔去跑一批数据。如果 ... -
很少用到的一个html标记
2009-06-15 17:53 128<strike></strike> ... -
用https方式做登录的提交
2009-06-15 17:42 1900String https="https"+ ... -
用程序创建zip或rar压缩包
2009-06-15 17:22 976public static void main1(String ... -
Java IO实现文件以及文件夹的复制
2009-06-15 17:16 1235public class FolderCopy { pub ... -
Set中存放数据不会重复
2009-06-15 17:04 111一直只是听说,今天试了下果然如此. public static ...
相关推荐
HttpUrlConnection,通过post方式提交数据。通过报文(xml)方式提交数据,作为传输的载体,转换成json,赋值到map,传输数据。可以通过SoapUI进行测试。
8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 8.10 ...
1、提供简明的网络操作API,包括get / post / postJson / postXml / postSoapXml / postFormData / downloadFile / uploadFile等。 2、downloadFile支持断点续传。 3、默认网络操作都为异步方式,提供完成/...
11.1.7 使用HttpURLConnection 11.1.8 使用AndroidHttpClient 11.1.9 使用后台线程(AsyncTask) 11.1.10 使用AsyncTask处理配置更改 11.1.11 使用DownloadManager获取文件 11.2 使用Android服务 ...
11.1.7 使用HttpURLConnection 11.1.8 使用AndroidHttpClient 11.1.9 使用后台线程(AsyncTask) 11.1.10 使用AsyncTask处理配置更改 11.1.11 使用DownloadManager获取文件 11.2 使用Android服务 ...
8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 8.10 ...
8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 8.10 ...
8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 8.10 ...
import org.xml.sax.InputSource; import org.xml.sax.XMLReader; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserFactory; import java.io.BufferedReader; import java.io....
8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 8.10 ...
8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...
8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 ...
8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 8.10 ...
8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 8.10 ...
8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 8.10 ...
8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 8.10 ...
* Tunneling service lets browsers issue any HTTP method (PUT, DELETE, MOVE, etc.) through a simple HTTP POST. This service is transparent for Restlet applications. Complete Web Server * Static file...
15.3.1 发送文件 15.3.2 接收文件 15.4 本章小结 第16章 程序优化 16.1 Java内存管理 16.1.1 垃圾回收 16.1.2 内存分配 16.2 Android优化 16.2.1 内存分配跟踪Allocation Tracker 16.2.2 内存监控Heap 16.2.3 内存...