主要难点在于参数的构造,hashmap以及treemap的顺序与插入的顺序不一致,所以只能用list或者用linkedHashmap,其次在于json的解析,尝试过google的gson,不好用,不过有一大优势,gson可以把对象序列化为json,或者从json中构建对象,最后用json解析实现的。
下面是12306get请求的一些参数,主要报告车站号,时间,以及是否是 adult
public static String book_init="https://kyfw.12306.cn/otn/leftTicket/init";
public static final String get_book="https://kyfw.12306.cn/otn/leftTicket/query";
public static final String train_date="leftTicketDTO.train_date";
public static final String from_station="leftTicketDTO.from_station";
public static final String to_station="leftTicketDTO.to_station";
public static final String purpose="purpose_codes";
public static final String audit="ADULT";
接下来则是get的URL的构造,get请求参数会在URL地址中体现出来,post的参数主要在BODY体中
public static String init_url(Map<String,String> params){
StringBuilder str=new StringBuilder("?");
//还有一个?号,哈哈
Set<Map.Entry<String, String>> set=params.entrySet();
//Entry en=null;
Iterator it=set.iterator();
Map.Entry entry;
boolean flag=true;
while(it.hasNext()){
entry=(Entry) it.next();
if(flag==false)
str.append("&");
flag=false;
str.append(entry.getKey()+"="+entry.getValue());
}
还有一步应为12306为https,所以需要加载证书文件,在Android下面证书文件只能为BKS,可以通过软件keystore 来显示转换
public void init() throws MalformedURLException{
myurl=new URL(url);
try {
//给跪了,java的keytool生成的bks证书也不行fuck
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
System.out.println(KeyStore.getDefaultType());
//密钥库的类型可以通过看keytool来查看
trustStore.load(in, "changeit".toCharArray());
//注册密匙库
System.out.println(trustStore.getType());
String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
tmf.init(trustStore);
// From https://www.washington.edu/itconnect/security/ca/load-der.crt
//InputStream caInput = new BufferedInputStream(new FileInputStream("load-der.crt"));
// Create an SSLContext that uses our TrustManager
SSLContext context = SSLContext.getInstance("TLS");
context.init(null, tmf.getTrustManagers(), null);
// Create an SSLContext that uses our TrustManager
//context=SSLContext.
context.init(null, tmf.getTrustManagers(), null);
//Sf.
https=(HttpsURLConnection )myurl.openConnection();
https.setSSLSocketFactory(context.getSocketFactory());
https.setRequestProperty("Accept-Language", "zh-CN");
//https.setRequestProperty("contentType", "GBK");
https.setRequestProperty("Charset", "utf-8");
if(https==null)
System.out.println("https null");
if(https.getResponseCode()==https.HTTP_OK){
is_ok=true;
}
else
is_ok=false;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (KeyStoreException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CertificateException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (KeyManagementException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public HttpsURLConnection gethttps(){
return https;
}
public boolean gethttp_status(){
return is_ok;
}
public class jsontest {
private String html;
public static String []query={"station_train_code","from_station_name","to_station_name"};
public jsontest(String response){
html=response;
}
public static void main(String []args) {
String date="2014-04-16";
String train_date="leftTicketDTO.train_date";
String from_station="leftTicketDTO.from_station";
//leftTicketDTO.train_date=2014-04-16&leftTicketDTO.
//from_station=HZH&leftTicketDTO.to_station=CSQ&purpose_codes=ADULT
// params.add(new NameValuePair("leftTicketDTO.train_date",data));
Map<String,String> params=new LinkedHashMap<String,String>();
//treemap,以及hashmap顺序不一定对的,与插入顺序无关
params.put(train_date,date);
params.put(from_station,"HZH");
params.put("leftTicketDTO.to_station", "CSQ");
params.put("purpose_codes", "ADULT");
getbook get=new getbook(bookInfo.get_book,params);
get.init();
String response=get.getreponse();
//json myjson=new json();
try {
JSONObject json=new JSONObject(response);
JSONArray data=json.getJSONArray("data");
//json比Google的gson好用一点
int num=data.length();
JSONObject train=null;
JSONObject temp=null;
String str=null;
for(int i=0;i<num;i++){
train=data.getJSONObject(i);
temp=train.getJSONObject("queryLeftNewDTO");
for(int j=0;j<3;j++){
str=temp.getString(query[j]);
System.out.println(query[j]+":"+str);
}
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//System.out.println(response);
}