`
nepenthe
  • 浏览: 21812 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

HttpURLConnection post方式发送xml

阅读更多

这两天上司让我编一个程序,读取数据库记录并远程调接口传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 '处理结果返回码描述';

 

分享到:
评论

相关推荐

    TestOaFileInterface

    HttpUrlConnection,通过post方式提交数据。通过报文(xml)方式提交数据,作为传输的载体,转换成json,赋值到map,传输数据。可以通过SoapUI进行测试。

    Android与Internet接轨案例源代码

    8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 8.10 ...

    ios-ARHttpRequest.zip

    1、提供简明的网络操作API,包括get / post / postJson / postXml / postSoapXml / postFormData / downloadFile / uploadFile等。 2、downloadFile支持断点续传。 3、默认网络操作都为异步方式,提供完成/...

    精通ANDROID 3(中文版)1/2

    11.1.7 使用HttpURLConnection  11.1.8 使用AndroidHttpClient  11.1.9 使用后台线程(AsyncTask)  11.1.10 使用AsyncTask处理配置更改  11.1.11 使用DownloadManager获取文件  11.2 使用Android服务  ...

    精通Android 3 (中文版)2/2

    11.1.7 使用HttpURLConnection  11.1.8 使用AndroidHttpClient  11.1.9 使用后台线程(AsyncTask)  11.1.10 使用AsyncTask处理配置更改  11.1.11 使用DownloadManager获取文件  11.2 使用Android服务  ...

    Google Android SDK开发范例大全(PDF高清完整版3)(4-3)

    8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 8.10 ...

    Google Android SDK开发范例大全(PDF完整版4)(4-4)

    8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 8.10 ...

    Google Android SDK开发范例大全(PDF高清完整版1)(4-1)

    8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 8.10 ...

    网络获取json解析json以及子线程显示

    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....

    Google Android SDK开发范例大全的目录

    8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 8.10 ...

    Google+Android+SDK开发范例大全

    8.11 将手机文件上传至网站服务器——模拟HTTPFORM的POSTACTION 8.12 移动博客发布器——以XML-RPC达成远程过程调用 8.13 移动RSS阅读器——利用SAXParser解析XML 8.14 远程下载安装Android程序——APKInstaller的...

    Google Android SDK开发范例大全(完整版附部分源码).pdf

    8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 ...

    Google Android sdk 开发范例大全 部分章节代码

    8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 8.10 ...

    Google Android SDK 开发范例大全01

    8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 8.10 ...

    Google Android SDK 开发范例大全02

    8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 8.10 ...

    Google Android SDK开发范例大全(完整版)

    8.7 手机气象局,实时卫星云图——HttpURLConnection与URLConnection和运行线程 8.8 通过网络播放MP3——Runnable存储FileOutputStream技巧 8.9 设置远程下载音乐为手机铃声——RingtoneManager与铃声存放路径 8.10 ...

    restful restful所需要的jar包

    * 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...

    Android典型技术模块开发详解

    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 内存...

Global site tag (gtag.js) - Google Analytics