Spring AI学习:工具调用实践(基于和风天气api)
<h2>工具调用总体实现:</h2><h3>设计工具类:</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">@Component
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> WeatherInquiryTools {
@Autowired
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> WeatherService weatherService;
@Tool(description </span>= "根据城市名称查询城市LocationID"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">public</span> String getLocationId(@ToolParam(description = "城市名称"<span style="color: rgba(0, 0, 0, 1)">) String cityName){
</span><span style="color: rgba(0, 0, 255, 1)">return</span> weatherService.getLocationId(cityName).getLocation().get(0<span style="color: rgba(0, 0, 0, 1)">).getId();
}
@Tool(description </span>= "根据城市LocationID查询实时温度"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">public</span> String getWeather(@ToolParam(description = "城市LocationID"<span style="color: rgba(0, 0, 0, 1)">) String locationId){
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> weatherService.getWeather(locationId).getNow().getTemp();
}
}</span></pre>
</div>
<h3>将工具交给ai客户端:</h3>
<p><img src="https://img2024.cnblogs.com/blog/3291169/202601/3291169-20260123203112441-504854232.png"></p>
<h3> 对话测试:</h3>
<p><img src="https://img2024.cnblogs.com/blog/3291169/202601/3291169-20260123203215345-1510381793.png"></p>
<h2> 具体实现:</h2>
<h3>实体类:</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">@NoArgsConstructor
@AllArgsConstructor
@Data
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> WeatherResponse {
@JsonProperty(</span>"code"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String code;
@JsonProperty(</span>"updateTime"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String updateTime;
@JsonProperty(</span>"fxLink"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String fxLink;
@JsonProperty(</span>"now"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> NowData now;
@JsonProperty(</span>"refer"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Refer refer;
}</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">@Data
@AllArgsConstructor
@NoArgsConstructor
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> NowData {
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 观测时间</span>
@JsonProperty("obsTime"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String obsTime;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 温度,单位:摄氏度</span>
@JsonProperty("temp"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String temp;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 体感温度,单位:摄氏度</span>
@JsonProperty("feelsLike"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String feelsLike;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 天气图标代码</span>
@JsonProperty("icon"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String icon;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 天气描述</span>
@JsonProperty("text"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String text;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 风向360角度</span>
@JsonProperty("wind360"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String wind360;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 风向</span>
@JsonProperty("windDir"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String windDir;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 风力等级</span>
@JsonProperty("windScale"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String windScale;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 风速,单位:公里/小时</span>
@JsonProperty("windSpeed"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String windSpeed;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 相对湿度,单位:%</span>
@JsonProperty("humidity"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String humidity;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 降水量,单位:毫米</span>
@JsonProperty("precip"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String precip;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 大气压强,单位:百帕</span>
@JsonProperty("pressure"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String pressure;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 能见度,单位:公里</span>
@JsonProperty("vis"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String vis;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 云量,单位:%</span>
@JsonProperty("cloud"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String cloud;
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">露点温度,单位:摄氏度</span>
@JsonProperty("dew"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String dew;
}</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">@NoArgsConstructor
@AllArgsConstructor
@Data
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> LocationResponse {
@JsonProperty(</span>"code"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String code;
@JsonProperty(</span>"location"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span> List<Location><span style="color: rgba(0, 0, 0, 1)"> location;
@JsonProperty(</span>"refer"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> Refer refer;
}</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">@AllArgsConstructor
@NoArgsConstructor
@Data
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Location {
@JsonProperty(</span>"name"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String name;
@JsonProperty(</span>"id"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String id;
@JsonProperty(</span>"lat"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String lat;
@JsonProperty(</span>"lon"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String lon;
@JsonProperty(</span>"adm2"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String adm2;
@JsonProperty(</span>"adm1"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String adm1;
@JsonProperty(</span>"country"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String country;
@JsonProperty(</span>"tz"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String timezone;
@JsonProperty(</span>"utcOffset"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String utcOffset;
@JsonProperty(</span>"isDst"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String isDst;
@JsonProperty(</span>"type"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String type;
@JsonProperty(</span>"rank"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String rank;
@JsonProperty(</span>"fxLink"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String fxLink;
}</span></pre>
</div>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">@NoArgsConstructor
@AllArgsConstructor
@Data
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> Refer {
@JsonProperty(</span>"sources"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span> List<String><span style="color: rgba(0, 0, 0, 1)"> sources;
@JsonProperty(</span>"license"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">private</span> List<String><span style="color: rgba(0, 0, 0, 1)"> license;
}</span></pre>
</div>
<p>以上实体类基于 <strong>和风天气api</strong> 设计。</p>
<h3>配置类:</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">@Component
@Data
@ConfigurationProperties(prefix </span>= "frog.weather"<span style="color: rgba(0, 0, 0, 1)">)
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> WeatherProperties {
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String apiKey;
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> String apiHost;
}<br></span></pre>
</div>
<p>以上配置类基于 <strong>和风天气api</strong> 设计。</p>
<h3><strong>序列化与反序列化工具类:</strong></h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">@Component
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)"> JasonUtils {
</span><span style="color: rgba(0, 0, 255, 1)">private</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <span style="color: rgba(0, 0, 255, 1)">final</span> ObjectMapper mapper = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, </span><span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">)
.setSerializationInclusion(JsonInclude.Include.NON_NULL)
.registerModule(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> JavaTimeModule());
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span><span style="color: rgba(0, 0, 0, 1)"> String toJson(Object obj) {
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mapper.writeValueAsString(obj);
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (JsonProcessingException e) {
</span><span style="color: rgba(0, 0, 255, 1)">throw</span> <span style="color: rgba(0, 0, 255, 1)">new</span> RuntimeException("序列化失败"<span style="color: rgba(0, 0, 0, 1)">, e);
}
}
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">static</span> <T> T fromJson(String json, Class<T><span style="color: rgba(0, 0, 0, 1)"> clazz) {
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> mapper.readValue(json, clazz);
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (JsonProcessingException e) {
</span><span style="color: rgba(0, 0, 255, 1)">throw</span> <span style="color: rgba(0, 0, 255, 1)">new</span> RuntimeException("反序列化失败"<span style="color: rgba(0, 0, 0, 1)">, e);
}
}
}</span></pre>
</div>
<h3>查询功能具体实现:</h3>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">@Service
@Slf4j
</span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">class</span> WeatherServiceImpl <span style="color: rgba(0, 0, 255, 1)">implements</span><span style="color: rgba(0, 0, 0, 1)"> WeatherService {
@Autowired
</span><span style="color: rgba(0, 0, 255, 1)">private</span><span style="color: rgba(0, 0, 0, 1)"> WeatherProperties weatherProperties;
</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
* 根据城市LocationID查询实时天气状况
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> WeatherResponse getWeather(String locationId) {
HttpClient client </span>=<span style="color: rgba(0, 0, 0, 1)"> HttpClient.newHttpClient();
String apiUrl </span>= weatherProperties.getApiHost() + "/v7/weather/now?location=" +<span style="color: rgba(0, 0, 0, 1)"> locationId;
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
HttpRequest request </span>=<span style="color: rgba(0, 0, 0, 1)"> HttpRequest.newBuilder()
.uri(URI.create(apiUrl))
.header(</span>"X-QW-Api-Key"<span style="color: rgba(0, 0, 0, 1)">, weatherProperties.getApiKey())
.GET()
.build();
HttpResponse</span><<span style="color: rgba(0, 0, 255, 1)">byte</span>[]> response =<span style="color: rgba(0, 0, 0, 1)"> client.send(request, HttpResponse.BodyHandlers.ofByteArray());
</span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] compressedBody =<span style="color: rgba(0, 0, 0, 1)"> response.body();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 解压缩响应体</span>
String decompressedBody =<span style="color: rgba(0, 0, 0, 1)"> GzipDecompressor.decompressToString(compressedBody);
log.info(</span>"查询天气成功, locationId: {}"<span style="color: rgba(0, 0, 0, 1)">, locationId);
WeatherResponse weatherResponse </span>= JasonUtils.fromJson(decompressedBody, WeatherResponse.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> weatherResponse;
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
log.error(</span>"查询天气失败, locationId: {}"<span style="color: rgba(0, 0, 0, 1)">, locationId, e);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
}
}
</span><span style="color: rgba(0, 128, 0, 1)">/**</span><span style="color: rgba(0, 128, 0, 1)">
* 根据城市名称查询城市LocationID
</span><span style="color: rgba(0, 128, 0, 1)">*/</span><span style="color: rgba(0, 0, 0, 1)">
@Override
</span><span style="color: rgba(0, 0, 255, 1)">public</span><span style="color: rgba(0, 0, 0, 1)"> LocationResponse getLocationId(String cityName) {
HttpClient client </span>=<span style="color: rgba(0, 0, 0, 1)"> HttpClient.newHttpClient();
String apiUrl </span>= weatherProperties.getApiHost() + "/geo/v2/city/lookup?location=" +<span style="color: rgba(0, 0, 0, 1)"> cityName;
</span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
HttpRequest request </span>=<span style="color: rgba(0, 0, 0, 1)"> HttpRequest.newBuilder()
.uri(URI.create(apiUrl))
.header(</span>"X-QW-Api-Key"<span style="color: rgba(0, 0, 0, 1)">, weatherProperties.getApiKey())
.GET()
.build();
HttpResponse</span><<span style="color: rgba(0, 0, 255, 1)">byte</span>[]> response =<span style="color: rgba(0, 0, 0, 1)"> client.send(request, HttpResponse.BodyHandlers.ofByteArray());
</span><span style="color: rgba(0, 0, 255, 1)">byte</span>[] compressedBody =<span style="color: rgba(0, 0, 0, 1)"> response.body();
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)"> 解压缩响应体</span>
String decompressedBody =<span style="color: rgba(0, 0, 0, 1)"> GzipDecompressor.decompressToString(compressedBody);
log.info(</span>"查询城市LocationID成功, cityName: {}"<span style="color: rgba(0, 0, 0, 1)">, cityName);
LocationResponse locationResponse </span>= JasonUtils.fromJson(decompressedBody, LocationResponse.<span style="color: rgba(0, 0, 255, 1)">class</span><span style="color: rgba(0, 0, 0, 1)">);
</span><span style="color: rgba(0, 0, 255, 1)">return</span><span style="color: rgba(0, 0, 0, 1)"> locationResponse;
} </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (Exception e) {
log.error(</span>"查询城市LocationID失败, cityName: {}"<span style="color: rgba(0, 0, 0, 1)">, cityName, e);
</span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">null</span><span style="color: rgba(0, 0, 0, 1)">;
}
}
}</span></pre>
</div>
<p>目前实现的tool查询功能局限温度查询,但根据工具需求可拓展(service返回了所有查询所得,tool内对数据重新整理可以产生丰富功能)。</p><br><br>
来源:https://www.cnblogs.com/syf0824/p/19523990
頁:
[1]