精华内容
下载资源
问答
  • 联网获取天气信息并保存到本地数据库

    自启动定时请求天气信息类,请求到的天气数据存储在本地数据库 

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.net.URLConnection;
    import java.text.SimpleDateFormat;
    import java.util.Date;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    import javax.annotation.Resource;
    import javax.ejb.EJB;
    import javax.ejb.Singleton;
    import javax.ejb.Startup;
    import javax.ejb.Timeout;
    import javax.ejb.Timer;
    import javax.ejb.TimerConfig;
    import javax.ejb.TimerService;
    
    import org.apache.commons.lang.StringUtils;
    import org.apache.commons.lang3.ArrayUtils;
    import org.apache.http.HttpStatus;
    import org.json.JSONArray;
    import org.json.JSONObject;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import com.taiji.apps.base.utility.DateUtil;
    import com.taiji.apps.base.weather.domain.WeatherInfo;
    import com.taiji.apps.base.weather.service.WeatherService;
    
    /**
    * @ClassName:WeatherTimer定时请求天气信息类
    * @Description:自启动定时请求天气信息类,请求到的天气数据存储在本地数据库
    * @date:2017年5月27日
    */
    @Singleton
    @Startup
    public class WeatherTimer {
    	
    	@Resource
        TimerService timerService;
    	
    	@EJB
    	public WeatherService weatherService;	//存储到本地数据库,获取本地数据库数据 服务接口
    	
    	private Date lastProgrammaticTimeout;	//最后一次请求天气信息的时间
    	
    	private Logger logger = LoggerFactory.getLogger(this.getClass());	//日志输出
    	
    	
    	/** 
    	* @Description: @PostConstruct注解自启动
    	* @date: 2017年5月27日 上午10:45:59
    	*/
    	@PostConstruct
        public void init() {
        	setTimer((long)60*60*1000); //设置定时执行频率:1小时
        }
    	
        /** 
        * @Description: 调用定时器,启动定时器
        * @param intervalDuration:定时执行频率
        * @date: 2017年5月27日 上午10:47:26
        */
        public void setTimer(long intervalDuration) {
        	logger.info("Setting a programmatic timeout for " + intervalDuration + " milliseconds from now.");
        	TimerConfig timerConfig = new TimerConfig();
            timerConfig.setPersistent(false);
            this.timerService.createIntervalTimer(5000, intervalDuration, timerConfig);
        }
    	
        @Timeout
        public void programmaticTimeout(Timer timer) {
        	logger.info("获取天气信息定时器已启动");
            this.setLastProgrammaticTimeout(new Date());
    		if (tryConnection()) {
    			getCurrentData();
    			getForecastData();
    			getAQIData();
    		}
        }
        
    	/** 
    	* @Description: 通过url获取天气json
    	* @param url 接口地址
    	* @return:天气json串
    	* @date: 2017年5月27日 上午10:55:07
    	*/
    	private String getWeatherJson(String url) {
    		try {
    			URLConnection uc = new URL(url).openConnection();
    			BufferedReader reader =
    					new BufferedReader(new InputStreamReader(uc.getInputStream(), "utf-8"));
    			StringBuffer jsonBuffer = new StringBuffer();
    			String line = null;
    			while (null != (line = reader.readLine())) {
    				jsonBuffer.append(line);
    			}
    			return jsonBuffer.toString();
    		} catch (IOException e) {
    			this.logger.error("通过" + url + "获取天气信息失败,原因如下:>>>>>>>>>>"+ e.getMessage());
    			return null;
    		}
    	}
        
    	/** 
    	* @Description: 尝试连接URL指定网站
    	* @return:连接成功/失败
    	* @date: 2017年5月27日 上午10:57:05
    	*/
    	public boolean tryConnection() {
    		boolean flag = false;
    		try {
    			URL url = new URL("http://api.k780.com:88/");
    			HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    			connection.setRequestMethod("GET");
    			connection.setReadTimeout(1000);
    			connection.setConnectTimeout(1000);
    			if (HttpStatus.SC_OK == connection.getResponseCode()) {
    				flag = true;
    			}
    		} catch (IOException e) {
    			this.logger.error("天气信息接口http://api.k780.com:88/连接失败,原因如下:>>>>>>>>>>"+ e.getMessage());
    		}
    		return flag;
    	}
        
    	/** 
    	* @Description: 获取当前天气
    	* @date: 2017年5月27日 上午11:00:05
    	*/
    	private void getCurrentData() {
    		String url = "http://api.k780.com:88/?app=weather.today&weaid=101030600"
    				+ "&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json";
    		String jsonStr = getWeatherJson(url);
    		if (StringUtils.isNotBlank(jsonStr)) {
    			JSONObject jsonObj = new JSONObject(jsonStr);
    			String success = jsonObj.getString("success");
    			if ("1".equals(success)) {
    				JSONObject result = jsonObj.getJSONObject("result");
    				SimpleDateFormat myFmt = new SimpleDateFormat("yyyy-MM-dd");
    				String todayStr = myFmt.format(new Date());
    				WeatherInfo tempWeather = this.weatherService.getWeatherInfoByDays(todayStr);
    				if (null == tempWeather) {
    					WeatherInfo weatherInfo = new WeatherInfo();
    					setCurrData(result, weatherInfo);
    				} else {
    					setCurrData(result, tempWeather);
    				}
    			}
    		}
    	}
        
    
        /** 
        * @Description: 入库当前天气数据
        * @param jsonObj jsonObj 当前天气的json对象
        * @param weatherInfo: weatherInfo 天气对象
        * @date: 2017年5月27日 上午11:01:16
        */
        private void setCurrData(JSONObject jsonObj, WeatherInfo weatherInfo) {
        	if(StringUtils.isNotBlank(jsonObj.getString("days"))) {
        		weatherInfo.setDays(jsonObj.getString("days"));
        	}
        	if(StringUtils.isNotBlank(jsonObj.getString("week"))) {
        		weatherInfo.setWeek(jsonObj.getString("week"));
        	}
        	if(StringUtils.isNotBlank(jsonObj.getString("temperature_curr"))) {
        		weatherInfo.setTemperatureCurr(jsonObj.getString("temperature_curr"));
        	}
        	if(StringUtils.isNotBlank(jsonObj.getString("weather_curr")) && (StringUtils.isNotBlank(jsonObj.getString("weather_icon")) || StringUtils.isNotBlank(jsonObj.getString("weather_icon1")))) {
        		weatherInfo.setWeatherCurr(jsonObj.getString("weather_curr"));
        		if(StringUtils.isNotBlank(jsonObj.getString("weather_icon"))) {
            		weatherInfo.setWeatherIconCurr((jsonObj.getString("weather_icon")));
            	} else if(StringUtils.isNotBlank(jsonObj.getString("weather_icon1"))) {
            		weatherInfo.setWeatherIconCurr(jsonObj.getString("weather_icon1"));
            	}
        	}
        	if(StringUtils.isNotBlank(jsonObj.getString("wind"))) {
        		weatherInfo.setWindCurr(jsonObj.getString("wind"));
        	}
        	if(StringUtils.isNotBlank(jsonObj.getString("winp"))) {
        		weatherInfo.setWinpCurr(jsonObj.getString("winp"));
        	}
        	weatherInfo.setUpdateTime(new Date());
    		this.weatherService.saveWeatherInfo(weatherInfo);
        }
        
    	/** 
    	* @Description: 获取未来七天天气
    	* @date: 2017年5月27日 上午11:01:47
    	*/
    	private void getForecastData() {
    		String url = "http://api.k780.com:88/?app=weather.future&weaid=101030600"
    				+ "&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json";
    		String jsonStr = getWeatherJson(url);
    		if (StringUtils.isNotBlank(jsonStr)) {
    			JSONObject jsonObj = new JSONObject(jsonStr);
    			String success = jsonObj.getString("success");
    			if ("1".equals(success)) {
    				JSONArray jsonArr = jsonObj.getJSONArray("result");
    				Date today = new Date();
    				String todayStr = DateUtil.format(today, DateUtil.datePattern);
    				String tomorrowStr = DateUtil.format(DateUtil.getAfterDate(1),
    						DateUtil.datePattern);
    				String thirdStr = DateUtil.format(DateUtil.getAfterDate(2),
    						DateUtil.datePattern);
    				String fourthStr = DateUtil.format(DateUtil.getAfterDate(3),
    						DateUtil.datePattern);
    				String fifthStr = DateUtil.format(DateUtil.getAfterDate(4),
    						DateUtil.datePattern);
    				String sixthStr = DateUtil.format(DateUtil.getAfterDate(5),
    						DateUtil.datePattern);
    				String seventhStr = DateUtil.format(DateUtil.getAfterDate(6),
    						DateUtil.datePattern);
    				// 未来七天的日期字符串数组
    				String[] sevenDays = new String[] { todayStr, tomorrowStr,
    						thirdStr, fourthStr, fifthStr, sixthStr, seventhStr };
    
    				for (int i = 0; i < jsonArr.length(); i++) {
    					JSONObject tempJson = jsonArr.getJSONObject(i);
    					// 解析并入库未来七天的天气
    					String days = tempJson.getString("days");
    					if (ArrayUtils.contains(sevenDays, days)) {
    						setForecast(days, tempJson);
    					}
    				}
    			}
    		} 
    	}
        
        /** 
        * @Description: 设置未来七天天气数据
        * @param dayStr未来一天的日期串
        * @param jsonObj:未来一天天气的json对象
        * @date: 2017年5月27日 上午11:02:50
        */
        private void setForecast(String dayStr, JSONObject jsonObj) {
        	WeatherInfo tempWeather = this.weatherService.getWeatherInfoByDays(dayStr);
    		if(null==tempWeather) {
    			WeatherInfo weatherInfo = new WeatherInfo();
    			setForData(jsonObj, weatherInfo);
    		} else {
    			setForData(jsonObj, tempWeather);
    		}
        }
    
        /** 
        * @Description: 入库未来七天天气数据
        * @param jsonObj未来一天天气的json对象
        * @param weatherInfo:天气对象
        * @date: 2017年5月27日 上午11:03:41
        */
        private void setForData(JSONObject jsonObj, WeatherInfo weatherInfo) {
        	if(StringUtils.isNotBlank(jsonObj.getString("days"))) {
        		weatherInfo.setDays(jsonObj.getString("days"));
        	}
        	if(StringUtils.isNotBlank(jsonObj.getString("week"))) {
        		weatherInfo.setWeek(jsonObj.getString("week"));
        	}
        	if(StringUtils.isNotBlank(jsonObj.getString("temperature"))) {
        		weatherInfo.setTemperature(jsonObj.getString("temperature"));
        	}
        	if(StringUtils.isNotBlank(jsonObj.getString("weather"))
        			&& (StringUtils.isNotBlank(jsonObj.getString("weather_icon"))
        					|| StringUtils.isNotBlank(jsonObj.getString("weather_icon1")))) {
        		weatherInfo.setWeather(jsonObj.getString("weather"));
        		if(StringUtils.isNotBlank(jsonObj.getString("weather_icon"))) {
        			weatherInfo.setWeatherIconD(jsonObj.getString("weather_icon"));
        		}
        		if(StringUtils.isNotBlank(jsonObj.getString("weather_icon1"))) {
        			weatherInfo.setWeatherIconN(jsonObj.getString("weather_icon1"));
        		}
        	}
        	if(StringUtils.isNotBlank(jsonObj.getString("wind"))) {
        		weatherInfo.setWind(jsonObj.getString("wind"));
        	}
        	if(StringUtils.isNotBlank(jsonObj.getString("winp"))) {
        		weatherInfo.setWinp(jsonObj.getString("winp"));
        	}
        	weatherInfo.setUpdateTime(new Date());
    		this.weatherService.saveWeatherInfo(weatherInfo);
        }
        
        /**
         * 获取当前空气指数AQI
         */
    	private void getAQIData() {
    		String url = "http://api.k780.com:88/?app=weather.pm25&weaid=101030100"
    				+ "&appkey=10003&sign=b59bc3ef6191eb9f747dd4e83c99f2a4&format=json";
    		String jsonStr = getWeatherJson(url);
    		if (StringUtils.isNotBlank(jsonStr)) {
    			JSONObject jsonObj = new JSONObject(jsonStr);
    			String success = jsonObj.getString("success");
    			if ("1".equals(success)) {
    				JSONObject result = jsonObj.getJSONObject("result");
    				SimpleDateFormat myFmt = new SimpleDateFormat("yyyy-MM-dd");
    				String todayStr = myFmt.format(new Date());
    				WeatherInfo tempWeather = this.weatherService
    						.getWeatherInfoByDays(todayStr);
    				if (null == tempWeather) {
    					WeatherInfo weatherInfo = new WeatherInfo();
    					setAQIData(todayStr, result, weatherInfo);
    				} else {
    					setAQIData(todayStr, result, tempWeather);
    				}
    			}
    		}
    	}
        
        /**
         * 入库当前空气指数
         * @param todayStr 今天日期串
         * @param jsonObj 当前天气的json对象
         * @param weatherInfo 天气对象
         */
        private void setAQIData(String todayStr, JSONObject jsonObj, WeatherInfo weatherInfo) {
        	if(StringUtils.isBlank(weatherInfo.getDays())) {
        		weatherInfo.setDays(todayStr);
        	}
        	if(StringUtils.isNotBlank(jsonObj.getString("aqi"))) {
        		weatherInfo.setAqi(jsonObj.getString("aqi"));
            	if(StringUtils.isNotBlank(jsonObj.getString("aqi_scope"))) {
            		weatherInfo.setAqiScope(jsonObj.getString("aqi_scope"));
            	}
            	if(StringUtils.isNotBlank(jsonObj.getString("aqi_levid"))) {
            		weatherInfo.setAqiLevid(jsonObj.getString("aqi_levid"));
            	}
            	if(StringUtils.isNotBlank(jsonObj.getString("aqi_levnm"))) {
            		weatherInfo.setAqiLevnm(jsonObj.getString("aqi_levnm"));
            	}
            	if(StringUtils.isNotBlank(jsonObj.getString("aqi_remark"))) {
            		weatherInfo.setAqiRemark(jsonObj.getString("aqi_remark"));
            	}
        	}
        	weatherInfo.setUpdateTime(new Date());
    		this.weatherService.saveWeatherInfo(weatherInfo);
        }
      
        @PreDestroy
    	private void destroy() {
    	}
        
        public String getLastProgrammaticTimeout() {
            if (lastProgrammaticTimeout != null) {
                return lastProgrammaticTimeout.toString();
            } else {
                return "never";
            }
            
        }
    
        public void setLastProgrammaticTimeout(Date lastTimeout) {
            this.lastProgrammaticTimeout = lastTimeout;
        }
    
    }

    天气对象实体类,存储在数据库中

    import java.io.Serializable;
    import java.util.Date;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.Table;
    import javax.persistence.Temporal;
    import javax.persistence.TemporalType;
    
    import lombok.Getter;
    import lombok.Setter;
    
    import org.hibernate.annotations.GenericGenerator;
    
    import com.taiji.framework.api.base.domain.BaseModel;
    
    /**
    * @ClassName:WeatherInfo 天气对象实体类
    * @Description:天气对象实体类,存储在数据库中
    * @date:2017年5月27日
    */
    @Entity
    @Table(name = "ES_WEATHER_INFO")
    public class WeatherInfo extends BaseModel implements Serializable {
    
    	private static final long serialVersionUID = 1L;
    
        @Getter @Setter
        @Id
        @GeneratedValue(generator = "generator")
        @GenericGenerator(name = "generator", strategy = "uuid2")
        private String id;
        
        @Getter @Setter
        private String days; //日期 yyyy-MM-dd
    
        @Getter @Setter
        private String week; //星期
        
        @Getter @Setter
        private String temperature; //气温
        
        @Getter @Setter
        @Column(name = "TEMPERATURE_CURR")
        private String temperatureCurr; //当前气温
        
        @Getter @Setter
        private String weather; //天气
        
        @Getter @Setter
        @Column(name = "WEATHER_CURR")
        private String weatherCurr; //当前天气
        
        @Getter @Setter
        @Column(name = "WEATHER_ICON_D")
        private String weatherIconD; //白天图标
        
        @Getter @Setter
        @Column(name = "WEATHER_ICON_N")
        private String weatherIconN; //夜间图标
        
        @Getter @Setter
        @Column(name = "WEATHER_ICON_CURR")
        private String weatherIconCurr; //当前图标
        
        @Getter @Setter
        private String wind; //风向
        
        @Getter @Setter
        @Column(name = "WIND_CURR")
        private String windCurr; //当前风向
        
        @Getter @Setter
        private String winp; //风力
        
        @Getter @Setter
        @Column(name = "WINP_CURR")
        private String winpCurr; //当前风力
        
        @Getter @Setter
        private String aqi; //空气指数
        
        @Getter @Setter
        @Column(name = "AQI_SCOPE")
        private String aqiScope; //指数范围
        
        @Getter @Setter
        @Column(name = "AQI_LEVID")
        private String aqiLevid; //级别编号
        
        @Getter @Setter
        @Column(name = "AQI_LEVNM")
        private String aqiLevnm; //级别
        
        @Getter @Setter
        @Column(name = "AQI_REMARK")
        private String aqiRemark; //注意事项
    
        @Getter @Setter
        @Column(name = "UPDATE_TIME")
        @Temporal(TemporalType.TIMESTAMP)
        private Date updateTime; //更新时间
    
        public WeatherInfo(){
        }
        
        @Override
        public Object retrieveId() {
            return this.id;
        }
    	
    }
    


    参考:http://blog.csdn.net/daydayupzzc/article/details/38866489  http://blog.csdn.net/u012204058/article/details/71034047


    展开全文
  • 调用第三方接口获取数据写入数据库

    万次阅读 热门讨论 2018-10-17 11:48:10
    系统框架:springboot(和框架没有什么太大关系,...第三方接口:http://xx.xxx.com:9905/api/list?transtime=20181017105600&token=abcdefghijklmn 请求参数:{"data":"{\"xxx\":\"\",\"xx\":\"\",\"xxxx\":\...

     

     

    前言:关于调用第三方接口获取数据,我在后面的日子中写过一篇简易版的带图的博文https://blog.csdn.net/myme95/article/details/89359677,建议先看这个简易版的。

    本篇博文是我当时第一次做【调用第三方接口获取数据】时写的文章,当时主要还是当做学习笔记记录,方便自己日后回顾。而且这篇博文主要是围绕我自己当时在做的公司的一个项目,所以在步骤方面的解释也很省(毕竟是我自己做的项目,我自己知道流程,所以就没写很清楚,比如介绍哪一步是在干什么),再加上这里面涉及的一些实体都是我们公司自己封装的,例如那个输出类Output,所以从总体上来看这篇文章对于很多人来说可能读起来有点费劲。

    简易版的博文,我是围绕一个京东开放接口写的,当时是在写一个自己的小项目,不涉及泄露商业代码之类的,所以从头到尾能写多详细就写多详细。但可能由于我写的太详细了,所以可能读起来更像一团乱麻???可总体来说我觉得比这篇应该更好接受吧。另外,如果大家看我那篇简易版的,可以去找到我当时作为案例的那个京东的接口,然后跟着我的步骤一步一步写,我觉得一路跟下来的话应该没什么问题吧?

    【2021-2-24补充】demo地址(简易版):https://github.com/ibfang/learning-examples.git

     

    ——————————————正文————————————————

    系统框架:springboot(和框架没有什么太大关系,仅记录一下)

    调用路径:controller→service

    第三方接口:http://xx.xxx.com:9905/api/list?transtime=20181017105600&token=abcdefghijklmn

    请求参数:{"data":"{\"xxx\":\"\",\"xx\":\"\",\"xxxx\":\"\",\"pageindex\":1}"}

    (注:因为有些公司的后台是用.net写的,所以java给它传数据要像上面那么传,即包两层,json里面套json,且有斜杠;如果不是.net的话,就不用这么封装,具体请求方法看对方的要求)

    一  controller层

    @ApiOperation("数据抓取")
    @ApiImplicitParam(name = "ImportListInput",value = "输入参数",required = true,dataType = "ImportListInput")
    @PostMapping("interface")
    @ResponseBody
    @PreAuthorize("isAuthenticated()")
    public Output getQualityLevel(@Valid @RequestBody ImportListInput importListInput)throws Exception {
        return mdmElianImportListService.getImportList(importListInput);
    }

    importListInput 为向第三方接口传送的请求参数,该接口的请求方式为POST,故,后面需要将我们输入的值转为json数据包传送

    二 service层

    public static final String ESB_ElIAN_XXX_EXCHANGE = "elian.xxx.exchange";//下面同步用到。我的需求里有同步。这和调用第三方接口无关。不用看
    private static final Logger logger = LoggerFactory.getLogger(xxxService.class);
    public Output getImportList(ImportListInput importListInput) throws IOException, YaolingException, ParseException {
    
        //获取token (获取token也是调用第三方提供的接口获取的,方法与下面记录的类似,不作赘述)
        String str = mdmElianGetTokenService.getToken();
        JSONObject oj = new JSONObject(str.toString());
        String errorcode = oj.get("errorcode").toString();
        if (ObjectUtils.isEmpty(errorcode)) {
    
            //单起一个线程 (当第三方的数据量过大时,需要起一个线程,以防止超时而造成的数据获取不全,应该有更好的优化方法,如线程       
    //池之类的,暂不会;线程的使用代码用粉色标出)
            Thread ts =   new Thread(new Runnable() {
                @Override
                public void run() {
                    JSONObject oj1 = new JSONObject(str.toString());
                    String data = oj1.get("data").toString();
                    JSONObject oj2 = new JSONObject(data.toString());
                    String token = oj2.get("token").toString();
                    int pageindex;
                    if ((Integer) mdmElianImportListInput.getPageindex() == null||mdmElianImportListInput.getPageindex() ==0) {
                        pageindex = 1;  
                    } else {
                        pageindex = mdmElianImportListInput.getPageindex();
                    }
                    //得到long类型当前时间
                    long l = System.currentTimeMillis();
                    //new日期对象
                    Date date = new Date(l);
                    //转换提日期输出格式
                    SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");  
                    SimpleDateFormat dateFormat1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                    SimpleDateFormat dateFormat2 = new SimpleDateFormat("yyyyMMdd");
                    String time = dateFormat.format(date);//按要求生成请求url中的第一个参数transtime并与格式化为url示例中的样子            
                    while (true) {
    
    
                        《--完整的请求示例从这里开始--》
    
    
                        //new一个JSONObject格式的参数inner将我们传入的参数转为json格式
                        JSONObject inner = new JSONObject();
                       //把我们传进来的参数分别赋值给inner中的各个参数,
    //这些参数名要和请求包的参数名一致,毕竟这是传给对方的数据,如果和对方要求的
    //参数名不一致,那么我们也拿不到数据
                        inner.put("xxx", importListInput.getDrugname());
                        inner.put("xx", importListInput.getCompanysceng());
                        inner.put("xxxx", importListInput.getEndTime());
                        inner.put("pageindex", pageindex);
                        // 这里参数是包装了两层的
    //再new一个JSonObject类型的参数param,把上面的inner放到param中,实现两层包装,因为对方后台用的.net,所以包两层。具体包装几层,看接口要求,有的可能只一层就好了
                        JSONObject param = new JSONObject();
                        param.put("data", inner.toString());
                      //拼接请求的url,把url+transtime+token拼接在一起
                        String url = "http://xx.xxx.com:9905/api/importlist?transtime=" + time + "&token=".concat(token);
                     //定义一个JSONObject类型的rets用于接收返回的JSON数据
                        JSONObject rets = null;
                        try {
                     //调用第三方接口,并传参数给对方,jsonPost方法在最后面附上
                            rets = DataDownloadUtil.jsonPost(url, param.toString()); 
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
    //如果返回结果中errorcode为空,即请求成功(具体看对方怎么标识错误信息,有的可能不用errorcode,所以不可直接生搬硬套此代码)
                        String errorCode = (String) rets.get("errorcode")
                        if (ObjectUtils.isEmpty(errorCode)) {
                            //调用成功
                            JSONArray jsonArray = rets.getJSONArray("data");
    //用一个集合接收返回的json数据中的data的值,遍历集合,取出数据
                            for (int i = 0, len = jsonArray.length(); i < len; i++) {
                                JSONObject jsonObject2 = (JSONObject) jsonArray.get(i);
                               //定义一个接受类importList,将接收的数据写进数据库
                                ImportList importList = new ImportList();
    //jsonObject2.get("x_x").toString()中的“x_x”要和实际返回的json数据中的字段名一致,否则可能会出现找不到字段的错误提示
                                importList.setXx(jsonObject2.get("x_x").toString());
                                importList.setXxx(jsonObject2.get("x_xx").toString());
                                importList.setXxxx(jsonObject2.get("x_xxx").toString());
                                importList.setDrugnameeng(jsonObject2.get("drugnameeng").toString());
    //如果存在时间类的数据,且自己的数据库中设计时将时间字段的类型设置为了datetime,那么在接收时要进行转换,将string型的数据转为date型的数据存入数据库
                                SimpleDateFormat sdfs = new SimpleDateFormat("yyyy-MM-dd");
                                try {
                                    importList.setLisencecodedate(sdfs.parse(jsonObject2.get("date").toString()));
                                } catch (ParseException e) {
                                    e.printStackTrace();
                                }
                                //保存此条数据,框架是springboot,所以有Repository。不要生搬硬套代码
                               importListRepository.save(importList);
                                // }
    
                         //     同步到xxxx平台,用不到就不用写了
         rabbitTemplate.convertAndSend(CommonConstant.ESB_ElIAN_XXX_EXCHANGE,CommonConstant.UPDATE, importList);
    
                            }
                      
                        } else {
                            try {
                                throw new YaolingException(errorCode);
                            } catch (YaolingException e) {
                                e.printStackTrace();
                            }
                        }
                        logger.debug("传过去的pageindex值:[{}]", pageindex);  //控制台做监控,看是否数据正确翻页
                  //json数据中的null和一般的null不同,判断的时候要注意,不能用==null之类的
                        if (rets.isNull("nextpage")) {
                            logger.debug("返回的nextpage值为null,抓取结束");
                            break;
                        }
                        logger.debug("返回的nextpage值:[{}]", (Integer) rets.get("nextpage"));
    //请求数据时,我们要告诉对方要第几页的数据,所以会传一个pageindex值过去,对方返回给我们数据时,会给我们一个nextpage值,如果这个值不为null或者“ ”就说明下一页还有数据,我们要把nextpage值赋值给pageindex继续传过去获取下一页的值,写进数据库,循环往复直至nextpage为null或者“”,这也就是上面为什么要用while循环的原因
                        pageindex = (Integer) rets.get("nextpage");
                        logger.debug("下一次要传的pageindex值:[{}]", pageindex); 
    //至此,一条数据的获取、存入结束
                    } //while
            
    
    
    
               《--一个完整的请求及获取数据到写入数据库到此结束--》
                     
    
    
    
                }//线程
            });//线程
            ts.start();  //启动线程
    
        } else {
            throw new YaolingException(errorcode);
        }
        return new Output();
    }
    

    (请求的代码是用“《-- --》《-- --》”包起来的部分,上面获取token之后,蓝色之前的代码都是为了蓝色代码中的url中的token做服务的,所以不用太在意。)

    jsonPost方法

    protected JSONObject jsonPost(String urls, String text) throws IOException {
        //创建一个HttpClient最新版的实现类CloseableHttpClient
        CloseableHttpClient httpClient = HttpClients.createDefault();
        //创建post方法请求对象,并把拼接好的地址url赋值给它的请求参数urls
        HttpPost httpPost = new HttpPost(urls);
       //设置报文头为Content-Type。具体格式看实际需求,我只知道如果请求的数据包为raw时,用Content-Type
        httpPost.setHeader("Content-Type", "application/json");
       //设置参数到请求对象中 
        httpPost.setEntity(new StringEntity(text));
       //执行请求操作,并拿到结果(同步阻塞)。(括号里的同步阻塞我也不知道什么意思,之后知道了再补上)
        CloseableHttpResponse response = httpClient.execute(httpPost);
       //获取结果实体
        HttpEntity entity = response.getEntity();
       //看返回状态是否正常,正常则把获取到的json字符串返回给调用者
        int statue = response.getStatusLine().getStatusCode();
        if (statue != HttpStatus.SC_OK) {
            logger.error("http connect fail:{}", response.getStatusLine());
        }
        //返回结果
        String result = EntityUtils.toString(entity, "utf-8");
        return new JSONObject(result);
    }

    之前做了颜色标记的,不知道为什么发布以后就变成了一个个大黑块,都不知道重点在哪了,第一次做这种,凑合看吧。 

    展开全文
  • 手头有一个接口说明文档和jar包,包里面有运行示例,但不知道该怎么通过api数据接口调用数据呢,具体步骤?执行main方法就运行得到了如下数据,可是该如何获取这些数据呢?(java)![图片说明]...
  • jqgrid获取数据库数据

    千次阅读 2019-01-08 19:21:10
    jqgrid获取数据有两种方法,一种是获取本地(即html中写入的固定的数据),另一种是获取后台数据库中的数据。 不过,不论是哪种方法,我这里采用的,都是基于local的数据获取方式,后台数据库数据,也是通过Django...

    jqgrid获取数据库数据

    jqgrid获取数据有两种方法,一种是获取本地(即html中写入的固定的数据),另一种是获取后台数据库中的数据。
    不过,不论是哪种方法,我这里采用的,都是基于local的数据获取方式,后台数据库的数据,也是通过Django与JavaScript之间的数据传递,将后台数据传给html中的js内的变量,然后以local 的方式显示在网页jqgrid中。

    1.写入固定的数据

    首先,先放上代码:

    <script type="text/javascript">
            $(".grid").jqGrid({
                datatype: "local",
                height: 250,
                colNames: ['title', 'key_word', 'url_address', 'text_content'],
                colModel: [
                    {name: 'title', index: 'title', width: 60},
                    {name: 'key_word', index: 'key_word', width: 90},
                    {name: 'url_address', index: 'url_address', width: 100},
                    {name: 'text_content', index: 'text_content', width: 100},
                ],
                caption: "討厭鬼grid"
            });
            var gameDate = [
                {"title":"2","key_word":"333","url_address":"還可以", "text_content":"sfdsfdsf"},
                {"title":"3","key_word":"Lineage","url_address":"死外掛", "text_content":"sfdsfdsf"},
                {"title":"4","key_word":"RO","url_address":"不想玩", "text_content":"sfdsfdsf"}
             ];
            for(var i=0;i<=gameDate.length;i++){
                $(".grid").jqGrid('addRowData',i+1,gameDate[i]);
            }
    </script>
    

    这种方法是写入固定的数据,后期无法更改,也不能动态显示。可以作为前期对jqgrid的一种实现,先把表格展现出来再说。我这里引用的jqgrid版本,如下所示:(包括对应的css样式文件)

    <link href="/static/css/ui.jqgrid.css" rel="stylesheet" type="text/css"/>
    <link href="/static/css/jquery-ui.css" rel="stylesheet" type="text/css"/>
    <script type="text/javascript" src="/static/js/jquery-1.11.0.min.js"></script>
    <script type="text/javascript" src="/static/js/jquery.jqGrid.min.js"></script>
    <script type="text/javascript" src="/static/js/grid.locale-cn.js"></script>
    

    2.获取数据库中的数据

    获取数据库中的数据,便涉及到Django与JavaScript的数据传递机制,这里直接搬运一下“Django自强学堂” 关于这一块儿的教学(又是基础知识!应该打牢才是!!
    Django自强学堂
    更详细的Django知识,可以戳传送门,去Django自强学堂学习了解:Django自强学堂网站。
    到这里,我们解决了通过Django传送数据给js的问题,那么还有两个问题:

    1. 在Django后台,如何获取数据库的数据,并改为jqgrid要求的格式?
    2. 在js前端,如何将数据显示在jqgrid中?

    先来看第一个问题,在Django中,获取数据库中的数据,我们可以编写如下的辅助函数:

    def read_data_from_database():
        # 读数据到表格
        datas= Board.objects.values_list('title', 'key_word', 'url_address', 'text_content')
        orders = list(datas)
        data = []
        datain = []
        # 对数据进行预处理
        for tr in orders:
            for zr in tr:
                datain.append(zr)
            data.append(datain)
            datain = []
        Dict = []
        # 将数据变为jqgrid要求的格式,即对应的键值对
        for i in data:
            dict_in = {"title": i[0], "key_word": i[1], "url_address": i[2], "text_content": i[3]}
            Dict.append(dict_in)
        data = json.dumps(Dict)
        return data
    

    接着,在views.py中,调用上面的函数,然后渲染到html中,代码如下:

    def show_form(request):
        data = readorderfromdatabase()
        return render(request, 'form.html', {'Dict':data})
    

    至此,我们就解决了第一个问题,把数据按照要求,顺利地传到了前端,在html中可以获取到数据,那么,接下来如何在js中处理数据,并调用jqgrid相关接口,将数据显示到表格中去呢?
    首先,我们先来看代码,如下所示:

    <script type="text/javascript">
        	var Dict = {{ Dict|safe }};
            $(".grid").jqGrid({
                datatype: "local",
                height: 250,
                colNames: ['title', 'key_word', 'url_address', 'text_content'],
                colModel: [
                    {name: 'title', index: 'title', width: 60},
                    {name: 'key_word', index: 'key_word', width: 90},
                    {name: 'url_address', index: 'url_address', width: 100},
                    {name: 'text_content', index: 'text_content', width: 100},
                ],
                caption: "这里是表格的总标题"
            });
            var gameDate = Dict;
            for(var i=0;i<=gameDate.length;i++){
                $(".grid").jqGrid('addRowData',i+1,gameDate[i]);
            }
    </script>
    

    正如前面强调的,这里,要加上safe过滤器,否则无法正常接收数据。数据格式也很重要。其实就相当于第一种方法里的固定数据传送,只不过这里的数据不是写在html中的固定数据,而是来自于后台Django传递来的数据,数据格式和固定数据的格式应该保持一致,否则jqgrid无法显示的。

    至此,基本上就解决了后台Django数据传送到js端并通过jqgrid显示的问题。这个问题困扰了我将近两天的时间,百度Google了大量资料,看得我都快自闭了,最后在Django基础知识里找到了答案……这更加说明了基础知识的重要性!另一方面,自己查资料的方向也出错了,之前一直在查jQuery、jqgrid等纯前端方面的知识,所以查到了各种自己不懂得东西,什么ajax、php、jqgrid里的url、json服务器传值等等……最后就查了一次Django,就找到问题所在了。

    不过,目前实现的jqgrid虽然可以显示数据库中的值了,但是依然存在一些问题需要处理,比如通过表单提交新的值后,需要重新刷新页面才能更新,这是因为自己写的jQuery代码没有包含刷新的函数,所以只是在页面加载的第一次进行了显示。
    还有一些功能没有完善,比如增、删、改、查以及排序、筛选等等,需要后面继续深入了解。
    ————————更新分割线————————————
    已经解决,当页面重载时,数据更新问题。
    解决方法,见该链接:https://blog.csdn.net/u012746051/article/details/52949353
    其中的核心代码复制粘贴如下:

    <script>
    $("#jqGrid_ds").jqGrid('clearGridData');  //清空表格
    $("#jqGrid_ds").jqGrid('setGridParam',{  // 重新加载数据
          datatype:'local',
          data : newdata,   //  newdata 是符合格式要求的需要重新加载的数据 
          page:1
    }).trigger("reloadGrid");
    </script>
    

    我的个人博客

    欢迎大家访问我搭建的个人博客哦,通过github Page搭建的,基于hexo,用了next主题。有什么问题都可以互相交流。博客地址:我的个人博客:CodeSausage的博客

    展开全文
  • 定时将接口提供的时间同步别的数据库 2. 编写接口 2.1 controller层 2.2 service 层 2.2.1 接口 2.2.2 实现类 2.3 mapper 2.3.1 接口 2.3.2 映射文件 ...

    1. 效果

    定时将接口提供的时间同步到别的数据库

    2. 编写接口

    2.1 controller层

    b247bbf87b746a325392ddf5fbb66b31325.jpg

    2.2 service 层

    2.2.1  接口

    356e501cb094915ba55f4aad84e5b48a086.jpg

    2.2.2 实现类

    f13ea246f32b5549056a727671141832668.jpg

    2.3 mapper

    2.3.1 接口

    1bd4f25fa044c2bfa8f2cb2954f4398b79a.jpg

    2.3.2 映射文件

    147f926c4109ba967b71f3bac721797ef52.jpg

    2.4 测试

    ce4e4e44571474282e17c4aa91daf782666.jpg

    3. 客户端 调用接口 处理数据

    3.1 调用 接口

    3.1.1 实体类

    df55dcc910c18538b7a2eecdc34d58d180e.jpg

    3.1.2 controller

    7f9df365f9bf1d17535264f6916006ae003.jpg

    3.1.3service

    3.1.3.1 接口

    6b113c1309fa8c6fa43591bb00871f3795c.jpg

    3.1.3.2 实现类

    8083278f918c2dcbdd85397edd67a2bfedc.jpg

    3.1.4 mapper

    3.1.4.1 接口

    1f0214fec5964ba38309aa1ffc96c05e53b.jpg

    3.1.4.2 映射文件

    604fed246440833d770a925ee782e626f8c.jpg

     

     

     

    转载于:https://my.oschina.net/springMVCAndspring/blog/1828187

    展开全文
  • python爬取股票数据并存到数据库

    千次阅读 2021-03-27 01:37:49
    Python 用Tushare接口获取股票数据并存储Sqlite数据库 使用技术介绍: 关于接口 由于tushare旧版本即将不能用了,所以我们这里使用的是tushare pro 接口。 关于数据库 使用了Sqlite轻量级数据库适合本地使用。 ...
  • 现在有一个需求,从数据库tieba_info表查出rank小于某个值的username和count(*),然后把所有查出来的username和count(*)作为参数值,用于下一个接口。 (数据库连接配置,请参考我的另外一篇博文jmeter测试mysql...
  • Springboot+MySQL 实现从数据库获取数据展示前端

    万次阅读 多人点赞 2020-06-26 18:07:47
    Springboot+MySQL 实现从数据库获取数据展示前端1.运行效果2.创建数据库表3.新建SpringBoot项目4.运行SpringBoot5.配置application.properties6.导入依赖7.开始写项目8.编写Mapper9.编写Controller10. 创建前端...
  • 本地硬盘中的文本数据读取mysql的数据库表中。 1. 文件保存在本地目录下,按照固定的格式保存,每一行对应着数据库中的一条记录,属性用空格隔开。 2. 创建数据库表,字段需要和文本文件的数据逐列对应。 3. ...
  • 之前的文章里面已经详细写过像云数据库里面插入数据的方法,现在用在实际项目里面再写一遍。 1:使用数据库的时候,首先要进行初始化 云开发数据库文档: ...2:打开云开发控制台 老规矩,创...
  • 这里的例子是C# 客户端访问JAVA 接口获取Json 数据。 首先部署了一个可以访问的接口,通过这个URL 可以正常的访问到数据库。,如下图(这是我随意部署个人服务器上的代码,各位也可以在本地部署) 然后...
  • 一般是前端先制作静态页面,同时服务器端创建数据库,搭建服务器端框架,写接口;当接口写完之后,前端或者后端才能嵌套页面。但是如果前端页面制作好了,后端接口还没有写好呢?或者如何让前端、后端各自做各自的...
  • 今天给大家带来的文章为通过Gson解析json数据并快速保存至数据库的文章。我们要保存是json对象数组,本文中的json数组并非从后台获取,为了演示,直接手动构造。 需要保存到数据库的是手机的品牌和型号。所以,我们...
  • 总体思路如下:先建立数据库,再建立webservice,最后通过winform的按钮来调用服务,达到操作数据库的目的。
  • 引言:我写博客的习惯基本上都是: 使用 Typora 或者 haroopad 这样支持 Markdown 语法的实时...所以,此时假设我们写完了一篇博客,即有一个 .md 的文件,要如何将其自动录入到数据库中?多个 .md 文件如何一次录入?
  • 获取或设置要对数据源执行的 Transact-SQL 语句、表名或存储过程! (2)CommandType: 设置你执行的SQL语句是存储过程还是T-SQL(是一个枚举)! ● Text:SQL文本命令(默认) ● StoredProcedure:存储过程名称   ...
  • 如何使用Node.js搭建本地服务器连接本地数据库

    千次阅读 多人点赞 2019-03-18 16:15:07
    好了,服务器搭完了,现在让我们来连接本地数据库吧, 这里只简单介绍get和post请求,首先安装MySQL $npm install mysql 在server.js中加入这两行代码 var mysql = require ( 'mysql' ) ; var ...
  • 数据库常用接口封装类: 先将头文件贴上 class DataBaseUtil { public:  DataBaseUtil();  virtual ~DataBaseUtil();  /**  * @brief loadDataBase 加载数据库  * @param database 数据库操作对象  * @param ...
  • 前言上一节已经讲述了嵌入式目标平台上安装sqlCE,本章将介绍如何在目标平台上创建本地数据库sdf文件。备注:博客中所有关于Wince MFC OLE DB SQLCE数据库访问技术的文章都是基于SQL Server 2005 Compact Edition即...
  • HarmonyOS 关系型数据库基于 SQLite 组件提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查接口,也可以直接运行用户输入的 SQL 语句来满足复杂的场景需要。HarmonyOS 提供的关系型...
  • 通过接口实现操作数据库的方法实例 添加、修改供新手使用
  • android:缓存服务器数据到本地

    千次阅读 2015-05-06 14:04:36
    实现想法 简单实现的一些简化做法两个开源代码也足够用了,没必要...实现想法也就是将接口的字符串缓存到本地而已;不一定是网络缓存,可以指定任何想要的字符串保存,如果愿意可以用数据库等等,看需要咯 在保证接口正常
  • 如何通过Spring Boot配置动态数据源访问多个数据库

    万次阅读 多人点赞 2018-03-18 14:59:52
    之前写过一篇博客《Spring+Mybatis+Mysql搭建分布式数据库访问框架》描述如何通过Spring+Mybatis配置动态数据源访问多个数据库。但是之前的方案有一些限制(原博客中也描述了):只适用于数据库数量不多且固定的情况。...
  • 这里以官方的Microsoft SQL Server 2012 Express LocalDB加以说明,VS从2012开始应该都集成了此功能。 Microsoft SQL Server 2012 ... LocalDB 安装将复制启动 SQL Server 数据库引擎 所需的最少的文件集。 安装 L...
  • 使用SQLite API执行数据库迁移总有一种是在拆弹的感觉-仿佛一不小心就会让app在用户手中爆炸...而如果你更新了version但是没有提供迁移,数据库的表就会drop掉,用户将丢失数据数据库迁移背后的原理 SQLite A...
  • 文章目录1. 前言2. 使用腾讯云短信接口发送短信3. java连接数据库4....前面两篇分别使用html写了前端网页和使用java写后端响应代码,实现了前端与后端的数据交互,今天这篇将介绍如何将数据写入数据库,并且实
  • Python操作数据库完成接口测试

    千次阅读 多人点赞 2021-08-23 15:37:55
    数据库的操作在测试工作中也是经常使用的,通过一些一些工具来操作数据库的方法大家都应该了解,那么Python操作数据库的大家了解吗? 今天测试君通过本篇文章介绍下如何通过Python来操作mysql数据库。 pymysql ...
  • 数据持久化之SQLite数据库(SQLite.swift使用) 一、简介 SQLite是一款轻型的嵌入式数据库,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就足够了。它的处理速度比Mysql、PostgreSQL这两款著名的...
  • 数据库

    千次阅读 2017-03-25 18:08:20
    关系完整性是为保证数据库数据的正确性和相容性,对关系模型提出的某种约束条件或规则。完整性包括: 1、域完整性: 域完整性是保证数据库字段取值的合理性。包括限制类型(数据类型),格式(通过检查约束和规则),...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 115,945
精华内容 46,378
关键字:

获取接口数据添加到本地数据库