如何使用 Spring Boot 使用 HTTPS GET 服务
How to consume a HTTPS GET service with Spring Boot
我正在尝试使用来自 Yahoo Weather Service 的以下 HTTPS 端点:
我正在根据 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 效果很好:
我认为映射不是问题,因为我得到的不是“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))
没有它也能正常工作。也许您因为经常点击 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();
}
我正在尝试使用来自 Yahoo Weather Service 的以下 HTTPS 端点:
我正在根据 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 效果很好:
我认为映射不是问题,因为我得到的不是“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))
没有它也能正常工作。也许您因为经常点击 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();
}