从 openweathermAp 使用 RESTful Web 服务的问题?

Posted

技术标签:

【中文标题】从 openweathermAp 使用 RESTful Web 服务的问题?【英文标题】:issue with consuming restful webservice from openweather Api? 【发布时间】:2021-05-11 00:15:45 【问题描述】:

我试图从 openweathermap api 检索天气详细信息,有些我无法让它在以下错误中工作。任何帮助将不胜感激

控制器

@Controller
public class CurrentWeatherController 
 
    private final StubWeatherService stubWeatherService;
    private final LiveWeatherService liveWeatherService;
 
    public CurrentWeatherController(StubWeatherService stubWeatherService, LiveWeatherService liveWeatherService) 
        this.stubWeatherService = stubWeatherService;
        this.liveWeatherService = liveWeatherService;
    
 
    @GetMapping("/current-weather")
    public String getCurrentWeather(Model model) 
        model.addAttribute("currentWeather", liveWeatherService.getCurrentWeather("Detroit","us"));
        return "current-weather";
    

    public StubWeatherService getStubWeatherService() 
        return stubWeatherService;
    

服务代码

@Service
public class LiveWeatherService 

    private static final String WEATHER_URL = "http://api.openweathermap.org/data/2.5/weather?q=city,country&APPID=key&units=metric";

    private final String apiKey="526a647fcd4f3f465c0340c19d26ef3a";

    private final RestTemplate restTemplate;
    private final ObjectMapper objectMapper;

    public LiveWeatherService(RestTemplateBuilder restTemplateBuilder, ObjectMapper objectMapper) 
        this.restTemplate = restTemplateBuilder.build();
        this.objectMapper = objectMapper;
    

    public CurrentWeather getCurrentWeather(String city, String country) 
        URI url = new UriTemplate(WEATHER_URL).expand(city, country,this.apiKey);    // line 34 issue with accepting apikey 
        ResponseEntity<String> response = restTemplate.getForEntity(url, String.class);

        return convert(response);
    

    private CurrentWeather convert(ResponseEntity<String> response) 
        try 
            JsonNode root = objectMapper.readTree(response.getBody());
            return new CurrentWeather(root.path("weather").get(0).path("main").asText(),
                    BigDecimal.valueOf(root.path("main").path("temp").asDouble()),
                    BigDecimal.valueOf(root.path("main").path("feels_like").asDouble()),
                    BigDecimal.valueOf(root.path("wind").path("speed").asDouble()));
         catch (JsonProcessingException e) 
            throw new RuntimeException("Error parsing JSON", e);
        
    

错误

2-07 02:34:48.710 错误 43384 --- [nio-8080-exec-3] o.a.c.c.C.[.[.[/].[dispatcherServlet] :Servlet.service() for 带有路径 [] 的上下文中的 servlet [dispatcherServlet] 引发异常 [处理程序调度失败;嵌套异常是 java.lang.Error: 未解决的编译问题: 类型不匹配:无法从 UriTemplate 转换为 URI ] 有根本原因

java.lang.Error: Unresolved compilation problem: 
  Type mismatch: cannot convert from UriTemplate to URI

  at com.meshupProjekt.service.LiveWeatherService.getCurrentWeather(LiveWeatherService.java:34)

~[classes/:na] 在 com.meshupProjekt.controller.CurrentWeatherController.getCurrentWeather(CurrentWeatherController.java:36) 〜[类/:na] 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native 方法)~[na:na] 在 java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 〜[无:无] 在 java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 〜[无:无] 在 java.base/java.lang.reflect.Method.invoke(Method.java:567) ~[na:na] 在 org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:197) ~[spring-web-5.3.2.jar:5.3.2] 在 org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:141) ~[spring-web-5.3.2.jar:5.3.2] 在 org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:106) ~[spring-webmvc-5.3.2.jar:5.3.2] 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:894) ~[spring-webmvc-5.3.2.jar:5.3.2] 在 org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808) ~[spring-webmvc-5.3.2.jar:5.3.2] 在 org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) ~[spring-webmvc-5.3.2.jar:5.3.2] 在 org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1061) ~[spring-webmvc-5.3.2.jar:5.3.2] 在 org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:961) ~[spring-webmvc-5.3.2.jar:5.3.2] 在 org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006) ~[spring-webmvc-5.3.2.jar:5.3.2] 在 org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:898) ~[spring-webmvc-5.3.2.jar:5.3.2] 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:626) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] 在 org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883) ~[spring-webmvc-5.3.2.jar:5.3.2] 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:733) ~[tomcat-embed-core-9.0.41.jar:4.0.FR] 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) ~[tomcat-embed-core-9.0.41.jar:9.0.41] 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] 在 org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) ~[tomcat-embed-websocket-9.0.41.jar:9.0.41] 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] 在 org.springframework.web.servlet.resource.ResourceUrlEncodingFilter.doFilter(ResourceUrlEncodingFilter.java:67) ~[spring-webmvc-5.3.2.jar:5.3.2] 在 org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) ~[tomcat-embed-core-9.0.41.jar:9.0.41] 在 org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) ~[tomcat-embed-core-9.0.41.jar:9.0.41] 在 org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100) ~[春天-

【问题讨论】:

【参考方案1】:

对我来说,您的代码是这样工作的:

    String WEATHER_URL = "http://api.openweathermap.org/data/2.5/weather?q=city,country&APPID=key&units=metric";
    String apiKey = "526a647fcd4f3f465c0340c19d26ef3a";
    var x = new UriTemplate(WEATHER_URL).expand("Darmstadt", "Deutschland", apiKey);
    System.out.println(x);

我使用 var 而不是 URI,以便 Java 选择正确的类型。 您的编译错误可能是由于 URI 类的错误导入造成的。

【讨论】:

以上是关于从 openweathermAp 使用 RESTful Web 服务的问题?的主要内容,如果未能解决你的问题,请参考以下文章

尝试通过 JSON 查询从 openweathermap 获取数据时出现 FileNotFoundException

我想显示从这个天气 API(https://openweathermap.org/current)获取的结果,但是当我输入城市名称时,我没有得到任何响应

错误:对象无效作为React子级(Axios和openweathermap API)

JSON 不可转换为 void (Openweathermap API)

Openweathermap 不适用于某些国家/地区?

使用 OpenWeatherMap API 会出现 401 错误