如何使用 Spring Boot 使用 HTTPS GET 服务

How to consume a HTTPS GET service with Spring Boot

我正在尝试使用来自 Yahoo Weather Service 的以下 HTTPS 端点:

Yahoo Weather Service API

我正在根据 API 进行一些特殊查询,以获取某个参数化位置的当前天气。

@Service("weatherConditionService")
public class WeatherConditionServiceImpl implements WeatherConditionService {

    private static final String URL = "http://query.yahooapis.com/v1/public/yql";

    public WeatherCondition getCurrentWeatherConditionsFor(Location location) {
        RestTemplate restTemplate = new RestTemplate();
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(URL);
        stringBuilder.append("?q=select%20item.condition%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22");
        // TODO: Validate YQL query injection
        stringBuilder.append(location.getName());
        stringBuilder.append("%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys");
        WeatherQuery weatherQuery = restTemplate.getForObject(stringBuilder.toString(), WeatherQuery.class);
        // TODO: Test Json mapping response
        Condition condition = weatherQuery.getQuery().getResults().getChannel().getItem().getCondition();
        return new WeatherCondition(condition.getDate(), Integer.parseInt(condition.getTemp()), condition.getText());
    }

Location 是一个 class,它提供属性 "name",该属性是位置的字符串描述,例如 "New York" 或 "Manila"。

条件另一个 classes 只是映射返回的对象。

执行时我得到以下 HTTP 响应:

org.springframework.web.client.HttpClientErrorException: 403 Forbidden

所以这意味着我无权访问我所理解的资源。

如果我只是将其复制并粘贴到网络浏览器中,URL 效果很好:

Yahoo Weather Query

我认为映射不是问题,因为我得到的不是“400”(错误请求)而是“403”(禁止)

一定是我使用RestTemplate对象的方式有问题。我正在研究,但找不到答案。

文档说您需要 api 密钥。但是当我这样打电话时:

fetch('https://query.yahooapis.com/v1/public/yql?q=select%20*%20from%20weather.forecast%20where%20woeid%20in%20(select%20woeid%20from%20geo.places(1)%20where%20text%3D%22nome%2C%20ak%22)&format=json&env=store%3A%2F%2Fdatatables.org%2Falltableswithkeys')
.then(resp=> resp.json())
.then((res)=>console.log(res.query.results))

https://repl.it/NeoM

没有它也能正常工作。也许您因为经常点击 api 而被列入黑名单。

您的代码似乎没问题。

我终于找到了答案。它最终 WAS 一个 Bad Request 因为我需要以不同的方式传递参数(不是 URL 的一部分)。

我找到了答案here。这是我的特定 Yahoo Weather API 调用 return 字符串的代码(我仍然需要做一些工作才能使用映射)。

   private static final String URL = "http://query.yahooapis.com/v1/public/yql";

   public String callYahooWeatherApi() {

        RestTemplate restTemplate = new RestTemplate();

        HttpHeaders headers = new HttpHeaders();
        headers.set("Accept", MediaType.APPLICATION_JSON_VALUE);

        UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(URL)
                .queryParam("q", "select wind from weather.forecast where woeid=2460286")
                .queryParam("format", "json");

        HttpEntity<?> entity = new HttpEntity<>(headers);

        HttpEntity<String> response = restTemplate.exchange(
                builder.build().encode().toUri(),
                HttpMethod.GET,
                entity,
                String.class);

        return response.getBody();

    }