环境:
Eclipse,Maven,Redis
框架:
SpringCloud,Feign
需求:
项目有Common公共模块和Weather天气模块,Common模块调用Weather模块中查询天气的功能,但是目前使用前台传入经纬度,经过百度逆地址编码获取所在城市,然后将城市作为参数传入天气接口获取天气情况,并返回天气JSON串,如:
{"city":"南京市","tmp":"28","cond_txt":"阴","wind_spd":"7"}
暂时有两个想法:
1.调用Weather模块方法时,将经纬度信息传递过去
2.获取到地址信息后将经纬度存入Redis,然后天气接口从Redis取,但是如何保证存入的数据是取出时想要的那条也是个问题
第一个方法:
从请求开始—>
前台js
$.ajax({
url : "getWeatherInfo",
data : {
lng : r.point.lng,
lat : r.point.lat
},
method : "get",
dataType : "json",
success : function(res){
document.getElementById("city").innerText = res.city;
document.getElementById("cond_txt").innerText = res.cond_txt;
document.getElementById("tmp").innerText = res.tmp;
},error : function(){
alert("地址上传失败");
}
});
Common模块为8004端口,此时在浏览器请求
http://localhost:8004/getWeatherInfo?lng=118.77807441&lat=32.0572355
调用方法如下
@Autowired
WeatherFeign weatherFeign;
@ResponseBody
@RequestMapping(value = "/getWeatherInfo",method = RequestMethod.GET)
public String locationTransform(@RequestParam("lng") String lng,@RequestParam("lat") String lat) throws IOException {
System.out.println("lng:"+lng+"lat:"+lat);
return weatherFeign.locationTransform(lng,lat);
}
其中使用了接口WeatherFeign,如下
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
@FeignClient(value = "damionew-weather")
public interface WeatherFeign {
@RequestMapping(value = "/weatherGetWeatherInfo",method=RequestMethod.GET)
public String locationTransform(@RequestParam("lng") String lng,@RequestParam("lat") String lat);
}
Weather模块下/weatherGetWeatherInfo请求处理方法
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.ApiOperation;
/**
* 通过前台获取经纬度转换为地址信息
* 通过地址信息向天气接口查询天气
* @author yinyunqi
*
*/
@Controller
public class WeatherController {
@ApiOperation(value = "获取天气信息",notes ="通过和风天气接口获取并处理天气信息")
@ResponseBody
@RequestMapping(value = "/weatherGetWeatherInfo",method = RequestMethod.GET)
public String locationTransform(@RequestParam("lng") String lng
,@RequestParam("lat") String lat) throws IOException {
// 经度
// String lng = request.getParameter("lng");
// 纬度
// String lat = request.getParameter("lat");
// String lng = "118.77807441";
// String lat = "32.0572355";
System.out.println("lng:"+lng+";lat:"+lat);
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
return weatherResult.toJSONString();
}
控制台打印出经纬信息说明传递成功,但此时遭遇另一个问题:
我想请求8004Common模块,但因为项目是通过8003安全验证模块登录的,所以导致所有的ajax和Css、js请求等都往8003发
顺手加了一个Zuul路由模块 史上最简单系列
然后尝试发现使用url使用绝对地址
$.ajax({
url : "http://localhost:8006/common/getWeatherInfo",
data : {
lng : r.point.lng,
lat : r.point.lat
},
method : "get",
dataType : "json",
success : function(res){
document.getElementById("city").innerText = res.city;
document.getElementById("cond_txt").innerText = res.cond_txt;
document.getElementById("tmp").innerText = res.tmp;
},error : function(){
alert("地址上传失败");
}
});
鹏总教导,URL暴露不安全,最好还是后台处理
于是
在8003安全模块后台处理该请求,然后通过Feign接口调用Weather模块直接处理,不再通过Common公共模块