对于简单的WebAPI调用步骤主要有:
举个例子:
在中国气象数据网 http://data.cma.cn/ 中,有API接口服务:
注册成功后有7天免费接口使用:
下面有详细的接口调用说明:
URL为:
http://api.data.cma.cn:8090/api?userId=<帐号>&pwd=<密码>&dataFormat=json&
interfaceId=getSurfEleByTimeRangeAndStaID&dataCode=SURF_CHN_MUL_HOR&
timeRange=<时间范围>&staIDs=<台站列表>&elements=Station_Id_C,Year,Mon,Day,Hour,<要素列表>
其中
userId,pwd:分配给您的帐号和密码,从订单中获取
dataFormat:返回的数据格式,目前仅支持json格式
interfaceId:此数据的接口ID,值为getSurfEleByTimeRangeAndStaID
dataCode:此数据的编码,中国地面气象站逐小时观测资料的编码为SURF_CHN_MUL_HOR
timeRange:时间范围,支持最近7天的数据访问,格式为“[YYYYMMDDHHMISS,YYYYMMDDHHMISS]”
staIDs:站号,支持1-30个站点,多个站点之间以“,”分隔,参见中国地面气象站点清单文档
elements:返回数据字段,多个字段之间使用“,”分隔,其中:Station_Id_C, Year,Mon,Day,Hour为默认字段,Station_Id_C为站号,Year为资料时间的年,Mon为资料时间的月,Day为资料时间的日,Hour为资料时间的时,<要素列表>为您订单中订制的要素
只要把想要获取的信息按照相应的参数要求填入URL中的<>即可,例如我要获取时间范围为2019年6月4日0点到23点,台站序号为10000的温度信息,则相应的URL片段为/api.data.cma.cn:8090/api?userId=<帐号>&pwd=<密码>&dataFormat=json&interfaceId=getSurfEleByTimeRangeAndStaID&dataCode=SURF_CHN_MUL_HOR&timeRange=[20190604000000,20190604230000]&staIDs=10000&elements=Station_Id_C,Year,Mon,Day,Hour,TEM
具体参数网站上会有详细文档给出
由于调用WebAPI返回的为JSON格式数据,需要利用JAVA相应的工具类对其进行解析,需要的包有:
链接: https://pan.baidu.com/s/18kKis8ayoiCo8_tGRXyj6g 提取码: 589e
程序逻辑如下:用户先输入站点序号,再输入所需要查询的时间区间,便能以小时为单位显示相应的温度信息。由于只是示例,我只进行了对温度、单个站点、一个时间段的一次性查询,读者可在此进行循环多个天气参数、城市、时间段的查询以及界面化延伸
代码说明:输入站点序号,再输入所需要查询的时间区间,便能以小时为单位显示相应的温度信息
注意:JSON格式数据反序列化为对象时对类的属性首字母大小写貌似有要求,如果遇到错误可参考相应解决办法,若无则忽略。。。
package API;
public class Weather {
private String STATION_Id_C;
private String YEAR;
private String MON;
private String DAY;
private String HOUR;
private double TEM;
public String getStation_Id_C() {
return STATION_Id_C;
}
public void setStation_Id_C(String station_Id_C) {
STATION_Id_C = station_Id_C;
}
public String getYear() {
return YEAR;
}
public void setYear(String year) {
YEAR = year;
}
public String getMon() {
return MON;
}
public void setMon(String mon) {
MON = mon;
}
public String getDay() {
return DAY;
}
public void setDay(String day) {
DAY = day;
}
public double getTEM() {
return TEM;
}
public void setTEM(double tEM) {
TEM = tEM;
}
public String getHOUR() {
return HOUR;
}
public void setHOUR(String hOUR) {
HOUR = hOUR;
}
}
package API;
import com.sun.org.apache.xerces.internal.impl.dv.util.Base64;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Scanner;
import net.sf.json.JSONObject;
import net.sf.json.JSONArray;
public class demo1 {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
String STATION_Id_C;
Scanner input = new Scanner(System.in);
STATION_Id_C = input.nextLine();
String startTime;
System.out.println("输入时间:(格式为:YYYYMMDD)");
startTime = input.nextLine();
String urlStr = "http://api.data.cma.cn:8090/api?userId=******&pwd=******&dataFormat=json&interfaceId=getSurfEleByTimeRangeAndStaID&dataCode=SURF_CHN_MUL_HOR&timeRange=["+startTime+"000000,"+startTime+"230000]&staIDs="+STATION_Id_C+"&elements=Station_Id_C,Year,Mon,Day,Hour,TEM";//用户id和密码自行填写
URL url = new URL(urlStr);
StringBuffer document = new StringBuffer();
URLConnection conn = url.openConnection();//URL请求
BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream(),"utf-8"));//获取数据流
String line = null;
while ((line = reader.readLine()) != null){
document.append(line);
}
reader.close();
JSONObject json =JSONObject.fromObject(document.toString());
JSONArray ja = JSONArray.fromObject(json.get("DS"));//“DS”即为中国气象数据网返回JSON数据相应的天气参数段,读者可自行验证
Map<String,Class<Weather>> map = new HashMap<String,Class<Weather>>();
map.put("list",Weather.class);
List<Weather> list = JSONArray.toList(ja,Weather.class,map);//反序列化为对象数组
int i=0;
System.out.println("站点号"+" "+"小时"+" "+"温度");
for(Weather w:list) {
System.out.println(STATION_Id_C+" "+i+":00"+" "+w.getTEM());
i++;
}
}
}