基于Java的简单WebAPI调用(中国气象数据网)

一、介绍

对于简单的WebAPI调用步骤主要有:

  1. 找到要调用的API接口并得知相应参数
  2. 为URL添加参数发送相应请求
  3. 返回相应信息
  4. 对返回的JSON文件(一般是JSON)进行处理

举个例子:
在中国气象数据网 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格式数据反序列化为对象时对类的属性首字母大小写貌似有要求,如果遇到错误可参考相应解决办法,若无则忽略。。。

  • 创建的Weather类:
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++;
		}
	}
}

三、效果

  • 输入站点时间段
    在这里插入图片描述
  • 输出每个小时温度
    在这里插入图片描述
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐