我正在嘗試創建一個 Spring MVC Web 應用程式,該應用程式通過從“https://api.weather.gov/points/{latitude},{longitude}”呼叫外部 API 來檢查當前天氣。緯度和經度需要是您從 html 表單獲取的用戶輸入,將其傳遞到您的控制器,然后在您進行外部呼叫時使用該緯度和經度。來自 api 呼叫的 json 包含網格點,這又是進行另一個外部 API 呼叫“https://api.weather.gov/gridpoints/{gridX},{gridY}/forecast”然后提取結果并顯示它所必需的前端。
我的 html 表單看起來像這樣。(homepage.html)
<div class="call-logs-info" id="call-logs-id">
<div class="logs-container" id="logs-container-id">
<form id="my-form" action="/getLatitude" method="post">
<div class="date-content">
<h1>Weather Checker</h1>
<div class="columns">
<div class="col col-1">
<p>Latitude:</p>
<input type="text" class="inputbox" name="latitude" id="lat" />
</div>
<div class="col col-2">
<p>Longitude:</p>
<input type="text" class="inputbox" name="longitude" id="lon" />
</div>
</div>
<div class="columns">
<div class="col col-2">
<button class="btn btn-primary" type="submit">Submit</button>
</div>
</div>
</div>
</form>
</div>
</div>
我有一個看起來像這樣的模型類。(Paths.java)
@Data
public class Paths {
@SerializedName("latitude")
public double latitude;
@SerializedName("longitude")
public double longitude;
}
我呼叫@RestController 類以呼叫外部API 的@Controller 類看起來像這樣。我使用@ModelAttribute 從此類中提取了緯度和經度,并嘗試將其傳遞給getGridPoints() 方法。( APIFetchController.java )
@Log4j2
@Controller
public class APIFetcherController {
@Autowired
private ExternalApiFetchController externalApiFetchController;
@GetMapping("/home")
public String showHomePage(){
return "homepage";
}
@PostMapping("/getLatitude")
public void formSubmit(@ModelAttribute Paths paths){
Double latitude = paths.getLatitude();
Double longitude = paths.getLongitude();
log.info("Latitude: {}", latitude);
log.info("Longitude: {}", longitude);
externalApiFetchController.getGridPoints(latitude,longitude);
}
}
最后但并非最不重要的一點是,我嘗試呼叫外部 API 的 @RestController 類看起來像這樣。我曾嘗試使用 restTempelate 來做到這一點。(ExternalApiFetchController.java)
@Log4j2
@RestController
public class ExternalApiFetchController {
@GetMapping("/grids")
@JsonFormat(with = JsonFormat.Feature.ACCEPT_SINGLE_VALUE_AS_ARRAY)
public List<Object> getGridPoints(Double latitude, Double longitude) {
log.info("Lat :{}", latitude);
log.info("Long :{}", longitude);
String url = "https://api.weather.gov/points/" latitude "," longitude;
log.info("URL: {}", url);
RestTemplate restTemplate = new RestTemplate();
Object[] grids = restTemplate.getForObject(url, Object[].class);
return Arrays.asList(grids);
}
出于某種原因,這會在嘗試檢查 Postman 時引發錯誤,上面寫著
“無法[Ljava.lang.Object;從物件值(令牌JsonToken.START_OBJECT)反序列化型別值”和其他一些錯誤。
當我檢查日志時,由于某種原因,從 Postman 訪問 API 后的緯度和經度值變為空。
我知道這可以通過 soley frontEnd 完成,但我手頭的任務是通過 springMVC 完成,我不知道這是否是完成任務的正確方法。現在任何幫助都將如此寶貴。
uj5u.com熱心網友回復:
天氣 API 回傳一個 json 物件作為結果。您正在告訴 spring 將其轉換為物件陣列。該錯誤指出您不能這樣做,因為它期望 json 回應是一個 json objects 陣列。
代替
Object[] grids = restTemplate.getForObject(url, Object[].class);
和
Object grid = restTemplate.getForObject(url, Object.class);
(https://www.weather.gov/documentation/services-web-api#/default/point)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/431240.html
上一篇:在視圖模型中觀察變數不起作用
