好友
阅读权限10
听众
最后登录1970-1-1
|
原因一:缺少 API Key
你的代码中有一句 key = “”。
聚合数据(juhe.cn)的所有接口都必须携带有效的 AppKey 才能请求成功。如果 Key 为空或者错误,服务器不会返回天气数据,而是会返回一段类似这样的错误 JSON:
{"reason":"错误的请求KEY","result":null,"error_code":10001}
解决方法:你需要登录聚合数据官网,申请“简单天气”接口,获取你专属的 AppKey,并填入代码中,例如 key = “1234567890abcdef...”。
原因二:你的自定义 取JSON值 函数不支持“路径式”取值
这是你代码里最隐蔽的 Bug。
看你的 取JSON值 子程序,它的逻辑是:纯文本寻找。
当你调用 取JSON值 (返回文本, “result.realtime.info”) 时,你的子程序拼接出的搜索条件是:
"result.realtime.info":
但是,聚合数据返回的真实 JSON 结构是层级嵌套的,长这样:
JSON
{
"result": {
"realtime": {
"info": "晴",
"temperature": "20"
}
}
}
返回的文本里根本不存在 "result.realtime.info": 这一长串连续的字符串,所以 寻找文本 会返回 -1,最终导致你取到的内容全部是空文本。
临时补救方案(不推荐):直接传最底层的键名,比如 取JSON值 (返回文本, “info”)。
正确解决方案(强烈推荐):放弃用字符串查找来解析 JSON,改用精易模块中的 类_json。
原因三:URL 中的中文未编码 以及 编码转换问题
中文 URL 编码:你直接将中文城市名(如“北京”)拼接到 URL 中。标准的 HTTP 请求中,URL 包含中文极易导致请求失败,需要进行 URL 编码(URLEncode)。
UTF-8 转 ANSI:聚合数据的接口返回的文本是 UTF-8 编码,而易语言的组件(如编辑框内容)默认是 ANSI (GBK) 编码。如果不做转换,即使取到了数据,显示出来的也会是乱码。
写易语言处理网络请求和 JSON,强烈建议引入“精易模块”(目前易语言开发者的标配)。引入后,你的代码可以精简并完美运行。
这是为你重写的正确代码示例(需要你在易语言中引用精易模块):
代码段
.版本 2
.支持库 spec
.子程序 _获取天气_被单击
.局部变量 网址, 文本型
.局部变量 返回文本, 文本型
.局部变量 key, 文本型
.局部变量 区域, 文本型
.局部变量 区域编码, 文本型
.局部变量 json, 类_json
.局部变量 错误码, 整数型
key = “在此处填入你在聚合数据申请的真实Key” ' 【必须填写】
.如果真 (城市.内容 = “”)
信息框 (“错误:请输入查询地区”, 0, , )
返回 ()
.如果真结束
区域 = 城市.内容
' 1. 对中文城市进行URL编码 (精易模块命令)
区域编码 = 编码_URL编码 (区域, 真, 真)
网址 = “https://apis.juhe.cn/simpleWeather/query?key=” + key + “&city=” + 区域编码
调试输出 (“请求网址: ”, 网址)
' 2. 发送GET请求 (使用精易模块的 网页_访问_对象,它会自动处理UTF8转码)
返回文本 = 编码_utf8到gb2312 (到文本 (网页_访问_对象 (网址, 0, , , , , , , , , , , , , , , , , )))
调试输出 (“返回文本: ”, 返回文本)
' 3. 解析JSON (使用精易模块的 类_json)
.如果真 (json.解析 (返回文本) = 假)
信息框 (“JSON解析失败!”, 0, , )
返回 ()
.如果真结束
错误码 = json.取属性数值 (“error_code”)
.如果 (错误码 ≠ 0)
' 接口返回了错误,比如Key错误、超限制等
信息框 (“获取失败: ” + json.取通用属性 (“reason”), 0, , )
.否则
' 接口返回成功,按路径读取数据 (注意:聚合简单天气接口 realtime 里没有 date 字段,所以去掉了日期的读取)
地区.内容 = 区域 + “市”
气象.内容 = json.取通用属性 (“result.realtime.info”)
气温.内容 = json.取通用属性 (“result.realtime.temperature”) + “℃”
.如果结束 |
|