今天,想在微信做一个公交查询的功能.到网上找了点资料,觉得爱帮挺好的于是注册了个帐号
api 页面
http://www.aibang.com/api/usage
公交线路查询
-
说明
公交线路查询,该接口根据关键字查询匹配的线路。
-
形式
http://openapi.aibang.com/bus/lines
参数说明
参数 类型 是否可选 意义 备注 city string 否 城市 q string 否 关键字 如:466、1路 with_xys int 是 是否包含坐标点信息 默认为0,不包含各个站点和路线的坐标信息,如果为1,则包含 -
返回内容
该API返回线路方案。
<?xml version="1.0" encoding="utf-8" ?> <root> <result_num>13</result_num> <web_url>http://bus.aibang.com</web_url> <wap_url>http://wap.aibang.com</wap_url> <lines> <line> <name>42路(东40条桥-广外甘石桥)</name> <info>1-599路; 东四十条桥5:30-23:00|广外甘石桥5:30-23:00; 无人售票线路,单一票制1元,不设找赎。 持卡乘车普通卡0.40元/次、学生卡0.20元/次。 </info> <stats>东四十条桥;张自忠路;宽街路口东;地安门东;北海北门;厂桥路口东;平安里路口南;西四路口西;白塔寺; 阜成门内;阜成门南;月坛体育场;北京儿童医院西门;礼士路南口;真武庙;天宁寺桥北;广安门北;广外关厢;达官营; 广外甘石桥 </stats> <stat_xys></stat_xys> <xys></xys> </line> ... </lines> </root>
字段 类型 意义 备注 result_num int 结果数量 web_url string 爱帮web站对应url wap_url string 爱帮wap站对应url name string 线路名称 info string 线路信息 包括线路类型、票价、首末班车时间等 stats string 沿途站点 半角分号;(英文分号)分隔 stat_xys string 途径站点经纬度 经度与纬度用半角逗号,(英文逗号)分隔;每组经纬度用半角分号;(英文分号)分隔 xys string 线路坐标 线路本身对应的各个坐标点,经度与纬度用半角逗号,(英文逗号)分隔;每组经纬度用半角分号;(英文分号)分隔 - 程序用java http 请求则返回对应xml 采用dom4j 解析xml 即可得到相应信息
附上部分代码
package com.xuyw.wx.util;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
/**
* Http工具类
*
* @author xuyw
* @email xyw10000@163.com
* @date 2014-05-04
*/
public class HttpUtil {
/**
* UTF-8编码
*
* @param source
* @return
*/
private static String urlEncodeUTF8(String source) {
String result = source;
try {
result = java.net.URLEncoder.encode(source, "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
/**
* 查找某个字符串是否存在
*
* @param str
* ,fstr
* @return
*/
public static boolean isexist(String str, String fstr) {
return str.indexOf(fstr) == -1 ? false : true;
}
/**
* URL追加参数
*
* @param url
* ,obj [a:1,b:2]
* @return
*/
public static String appendUrl(String url, String... obj) {
StringBuilder sbd = new StringBuilder(url);
if (obj != null && obj.length > 0) {
if (isexist(url, "?")) {// 存在?
sbd.append("&");
} else {
sbd.append("?");
}
for (int i = 0; i < obj.length; i++) {
String[] temp = obj[i].split(":");
sbd.append(temp[0]);
sbd.append("=");
sbd.append(urlEncodeUTF8(temp[1]));
sbd.append("&");
}
sbd.setLength(sbd.length() - 1);// 删掉最后一个
}
return sbd.toString();
}
/**
* 发送http请求取得返回的输入流
*
* @param requestUrl
* 请求地址
* @return InputStream
*/
public static InputStream httpRequest(String requestUrl) {
InputStream inputStream = null;
try {
URL url = new URL(requestUrl);
HttpURLConnection httpUrlConn = (HttpURLConnection) url
.openConnection();
httpUrlConn.setDoInput(true);
httpUrlConn.setRequestMethod("GET");
httpUrlConn.connect();
// 获得返回的输入流
inputStream = httpUrlConn.getInputStream();
} catch (Exception e) {
e.printStackTrace();
}
return inputStream;
}
}
package com.xuyw.wx.util;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;
import com.xuyw.wx.config.Config;
/**
* 爱帮工具类
*
* @author xuyw
* @email xyw10000@163.com
* @date 2014-05-04
*/
public class AiBangBusUtil {
private static final String BUSLINE = "http://openapi.aibang.com/bus/lines";// 公交线路url
/**
* 公交线路查询
*
* @return
* @throws Exception
*/
public static List getBusLine(String city, String q) throws Exception {
List list = new ArrayList();
// app_key爱帮key
// city城市
// q 如:466、1路
// with_xys可无 默认为0,不包含各个站点和路线的坐标信息,如果为1,则包含
String url = HttpUtil.appendUrl(BUSLINE,
"app_key:" + Config.AIBANG_KEY, "city:" + city, "q:" + q,"with_xys:"+"1");
// 使用dom4j解析xml字符串
SAXReader reader = new SAXReader();
InputStream inputStream = HttpUtil.httpRequest(url);
Document document = reader.read(inputStream);
// 得到xml根元素
Element root = document.getRootElement();
// result_num表示搜索到的公交路线数
String result_num = root.element("result_num").getText();
if (!"0".equals(result_num)) {
// 获取根节点下的子节点lines
Iterator lines = root.element("lines").elementIterator();
while(lines.hasNext()){
Element line = (Element) lines.next();
Map map = new HashMap();
map.put("name", line.elementText("name"));//线路名称
map.put("info", line.elementText("info"));//线路信息
map.put("stats", line.elementText("stats"));//沿途站点
map.put("stat_xys", line.elementText("stat_xys"));//途径站点经纬度
map.put("xys", line.elementText("xys"));//线路坐标
list.add(map);
}
}
return list;
}
public static void main(String[] args) throws Exception {
List list = AiBangBusUtil.getBusLine("南昌", "209");
for (int i = 0; i < list.size(); i++) {
Map<Object, Object> map = (Map<Object, Object>) list.get(i);
for (Map.Entry<Object, Object> entry : map.entrySet()) {
System.out.println(entry.getKey() + " : " + entry.getValue());
}
}
}
}
将返回xml解析添加到list中 测试使用控制台输出
ok 返回2条数据