这些天在项目上领导要我写一个工具完成的功能大概就是调用别人服务的一个接口取得数据,然后保存到自己的表中。
通过访问接口我们得到的是一个xml格式的文件,所以我们要做的事情就是可以分为3个部分来进行。
第一:调用接口。
第二:取得返回的xml文件。
第三:解析xml文件,把数据保存。
调用接口我发现一般有两大类,http post/ get方式调用和webservice调用。
通过接口的url我发现。他采用的是http的方式。所以我悬着了使用http get方式的调用方式。
urlpath = "http://xxx.xxx.xxx/service/AddrCode/cmd? commandType=0&IsAccurate=false&AddrType=AllType&Start=0&Nums=1&encode=gbk&AddrName=" + URLEncoder.encode(addr, "GBK");
URL url = new URL(urlpath);
InputStream iStream = null;
String result = "";
// 打开连接
URLConnection con = url.openConnection();
con.setRequestProperty("Content-type", "application/x-java-serialized-object");
con.setDoOutput(true);
con.connect();
iStream = con.getInputStream();
result = processServerResponse((HttpURLConnection) con, iStream);
首先呢我们定义了一个url,接着我们用URLConnection打开连接,声明输入流进行读取返回的数据。
private static String processServerResponse(HttpURLConnection http,
InputStream iStrm) throws IOException {
if (http.getResponseCode() == HttpURLConnection.HTTP_OK) {
int length = http.getContentLength();
String str;
if (length != -1) {
byte servletData[] = new byte[length];
iStrm.read(servletData);
str = new String(servletData);
} else {
ByteArrayOutputStream bStrm = new ByteArrayOutputStream();
int ch;
while ((ch = iStrm.read()) != -1)
bStrm.write(ch);
str = new String(bStrm.toByteArray());
bStrm.close();
}
return str;
}
return null;
}
这个时候我们取得了返回的文件了,现在要做的就是解析这个文件把我们需要的数据保存起来。
readStringXML(result, ztid, ztmc,addr);
通过这个类我们解析它。
// 解析根据地址获得的xml文件
public void readStringXML(String xml, String ztid, String ztmc,String addr)
throws Exception {
Map map = new HashMap();
Document doc = null;
String x = "";
String y = "";
String address = addr;
String objid = ztid;
String objname = ztmc;
doc = DocumentHelper.parseText(xml);
Element root = doc.getRootElement();
List list = root.elements("row");
for (Iterator i = list.iterator(); i.hasNext();) {
Element row = (Element) i.next();
x = row.element("X0").getText();
y = row.element("Y0").getText();
//addr = row.element("地址标准名称").getText();
// 这里应该执行一条insert into 语句
String sql = "insert into gis(gisid,objid,objname,lon,lat,addr) values (sys_guid(),?,?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, objid);
ps.setString(2, objname);
ps.setString(3, x);
ps.setString(4, y);
ps.setString(5, address);
ps.executeUpdate();
}
}
通过这样的几个步骤之后我们就完成了。
但是在测试的过程中出现了些问题,我列举了出来。
第一:在接口的url后面的参数中由于是get请求方式会有包括中文的特殊字符,如果特殊字符没能解析出来后台会报一个505的错误。
这个时候我们就需要对特殊的字符进行一个编码转换。如URLEncoder.encode(addr, "GBK");这样机器就都能解析了。
第二:判断参数的非空。
通过访问接口我们得到的是一个xml格式的文件,所以我们要做的事情就是可以分为3个部分来进行。
第一:调用接口。
第二:取得返回的xml文件。
第三:解析xml文件,把数据保存。
调用接口我发现一般有两大类,http post/ get方式调用和webservice调用。
通过接口的url我发现。他采用的是http的方式。所以我悬着了使用http get方式的调用方式。
urlpath = "http://xxx.xxx.xxx/service/AddrCode/cmd? commandType=0&IsAccurate=false&AddrType=AllType&Start=0&Nums=1&encode=gbk&AddrName=" + URLEncoder.encode(addr, "GBK");
URL url = new URL(urlpath);
InputStream iStream = null;
String result = "";
// 打开连接
URLConnection con = url.openConnection();
con.setRequestProperty("Content-type", "application/x-java-serialized-object");
con.setDoOutput(true);
con.connect();
iStream = con.getInputStream();
result = processServerResponse((HttpURLConnection) con, iStream);
首先呢我们定义了一个url,接着我们用URLConnection打开连接,声明输入流进行读取返回的数据。
private static String processServerResponse(HttpURLConnection http,
InputStream iStrm) throws IOException {
if (http.getResponseCode() == HttpURLConnection.HTTP_OK) {
int length = http.getContentLength();
String str;
if (length != -1) {
byte servletData[] = new byte[length];
iStrm.read(servletData);
str = new String(servletData);
} else {
ByteArrayOutputStream bStrm = new ByteArrayOutputStream();
int ch;
while ((ch = iStrm.read()) != -1)
bStrm.write(ch);
str = new String(bStrm.toByteArray());
bStrm.close();
}
return str;
}
return null;
}
这个时候我们取得了返回的文件了,现在要做的就是解析这个文件把我们需要的数据保存起来。
readStringXML(result, ztid, ztmc,addr);
通过这个类我们解析它。
// 解析根据地址获得的xml文件
public void readStringXML(String xml, String ztid, String ztmc,String addr)
throws Exception {
Map map = new HashMap();
Document doc = null;
String x = "";
String y = "";
String address = addr;
String objid = ztid;
String objname = ztmc;
doc = DocumentHelper.parseText(xml);
Element root = doc.getRootElement();
List list = root.elements("row");
for (Iterator i = list.iterator(); i.hasNext();) {
Element row = (Element) i.next();
x = row.element("X0").getText();
y = row.element("Y0").getText();
//addr = row.element("地址标准名称").getText();
// 这里应该执行一条insert into 语句
String sql = "insert into gis(gisid,objid,objname,lon,lat,addr) values (sys_guid(),?,?,?,?,?)";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, objid);
ps.setString(2, objname);
ps.setString(3, x);
ps.setString(4, y);
ps.setString(5, address);
ps.executeUpdate();
}
}
通过这样的几个步骤之后我们就完成了。
但是在测试的过程中出现了些问题,我列举了出来。
第一:在接口的url后面的参数中由于是get请求方式会有包括中文的特殊字符,如果特殊字符没能解析出来后台会报一个505的错误。
这个时候我们就需要对特殊的字符进行一个编码转换。如URLEncoder.encode(addr, "GBK");这样机器就都能解析了。
第二:判断参数的非空。