这次直接观察一个真实页面
打开本站资源库,搜索“JSON”,你将找到浏览器发出的资源请求,看懂请求参数和返回列表。然后自己构造同样的地址,理解“网页显示异常”究竟发生在请求、响应还是渲染阶段。
只观察公开资源查询,不需要登录、密钥或调用付费模型。不要复制包含 Cookie 或 Authorization 的整套请求分享给别人。
第一步:找到网络请求
在桌面浏览器按 F12,进入 Network / 网络面板,选择 Fetch/XHR,清空旧记录。回到资源库输入 JSON 并执行搜索。点击新出现的资源列表请求;如果初次页面数据由服务器渲染,尝试切换筛选或直接打开下一节公开地址。
先看四项:Request URL、Request Method、Status Code、Response。URL 说明请求到哪里,方法说明操作类型,状态码说明 HTTP 结果,响应体才是返回内容。
第二步:直接打开公开查询
在地址栏打开本站的资源查询样例。这个 GET 查询只读取公开资料。返回的 JSON 中,items 是本页列表,total 是匹配数量;列表中的每项有 id、title 等字段。
把 page 改成 2 再看。第二页为空不必然是接口故障,也可能只有一页结果。先看 total 和实际分页大小,再下结论。
页面标题不更新,但响应 title 已变,问题更可能在缓存或渲染;响应本身就是旧值,则继续检查服务端数据。不要在尚未看到响应前反复重装前端。
中文和特殊字符为什么要编码
搜索词“AI & JSON”如果直接拼在 URL 后,& 可能被理解为另一个参数的分隔符。用 URL 编码函数生成查询,不手工替换中文或空格。
把下面保存为 query_url.py,运行 python query_url.py。它只构造地址并解析,不发送网络请求:
from urllib.parse import urlencode, urlsplit, parse_qs
query = {"q": "AI & JSON", "page": 1}
url = "/api/v1/resources?" + urlencode(query)
print(url)
decoded = parse_qs(urlsplit(url).query)
assert decoded["q"] == ["AI & JSON"]
assert decoded["page"] == ["1"]
print("搜索词完整往返")
编码后地址看起来不那么直观,但服务端能恢复原搜索词。urllib.parse 编码说明。
看状态码时别跳过响应体
| 状态 | 本次先看什么 |
|---|---|
| 200 | JSON 是否完整,items 是否符合当前筛选 |
| 401 | 是否调用了需要登录的接口,当前会话是否存在 |
| 403 | 是否有权限或请求来源限制 |
| 404 | URL 路径与资源 ID 是否正确 |
| 422 | 参数是否违反这个应用的校验规则 |
| 429 | 是否限流,响应是否说明等待方式 |
| 5xx | 保存请求标识与时间,查看服务端错误 |
状态码是线索,不保证每个系统错误体相同。HTTP 状态参考。不要把 429 一律当成“每秒重试一次”。
给 AI 一个能定位的问题报告
若你自己做的搜索页面出错,可以这样提供材料:
在390像素宽的资源页搜索“AI & JSON”。
期望搜索词作为完整q参数传入;实际请求被拆成多个参数。
相关代码是直接字符串拼接 query。
请改为标准URL参数编码,保留分页参数。
给一个包含中文、空格和&的测试;不要修改接口返回结构。
附上脱敏的 URL 与必要响应片段即可,不必附登录 Cookie。问题描述包括操作、期望、实际和相关代码,比一句“接口挂了”更有用。
自测与答案
请求 200,但页面没有结果,就能说数据库坏了吗?不能。可能筛选确实无匹配、分页超出,或页面没读取正确字段。