开发者指南

cURL GET 请求:查询参数、编码与响应核对

用 cURL GET 正确编码查询参数,区分响应正文、响应头与状态码,并按任务 ID 查询 MIYAIP Crawler API 状态和结果。

下载示例文件
cURL GET 查询编码将 desk & lamp 中的 & 保留在单个搜索值内。

基本的 cURL GET 请求只需要 URL,例如 curl 'https://example.com/'。查询值使用 --get 配合 --data-urlencode,确保空格与保留字符仍属于预期值。随后检查状态与响应,不要将终端有输出等同于请求成功。

本指南使用报告所收查询值的本地回显端点。通过 python3 demo_server.py 启动附带服务。命令采用 Bash 语法,Windows 请使用 curl.exe 并遵循相应 Shell 的引号规则。

流程概览

  1. 1. 发送 GET 并检查查询参数

    本地结果包含:

  2. 2. 为完整 URL 加引号或分别编码值

    查询已经编码好的 URL,应对整个地址加引号:

  3. 3. 有意识地添加请求头与鉴权

    Accept 表达客户端能处理的响应格式,不会强制端点支持该格式。遵循真实服务的鉴权说明,分享示例命令时不包含真实凭据。

  4. 4. 分离正文、请求头和状态

    这会分别保存响应正文和响应头。希望将响应头与正文一起显示以便检查时使用 -i,但不要把混合输出存入应用预期只含 JSON 的文件。

  5. 5. 分别处理重定向和错误

    cURL 默认不跟随重定向。适合跟随时使用 --location;请求去往意外位置时检查最终 URL。

  6. 6. 使用 GET 查询已有 MIYAIP 任务

    MIYAIP Crawler API 通过 POST 创建任务,通过 GET 获取状态和结果。获得返回的任务 ID 后,按文档使用以下查询结构:

1. 发送 GET 并检查查询参数

curl --fail-with-body -sS --max-time 30 \
  --get \
  --data-urlencode 'query=desk & lamp' \
  --data-urlencode 'page=2' \
  'http://127.0.0.1:8766/echo'

本地结果包含:

{
  "method": "GET",
  "args": {
    "query": ["desk & lamp"],
    "page": ["2"]
  },
  "path": "/echo"
}

--get 告诉 cURL 将数据参数放入查询字符串。没有它时,数据选项可能选择 POST。-X GET 不能代替对参数位置的选择。

cURL GET 查询编码将 desk & lamp 中的 & 保留在单个搜索值内。
正确编码查询时,本地 GET 端点将 desk & lamp 接收为一个值。

2. 为完整 URL 加引号或分别编码值

查询已经编码好的 URL,应对整个地址加引号:

curl --fail-with-body -sS --max-time 30 \
  'http://127.0.0.1:8766/echo?category=office&page=2'

Bash 中未加引号的 & 具有 Shell 含义,命令可能看似运行,却已被拆成非预期操作。

值包含空格、& 或非 ASCII 文本时,优先使用 --data-urlencode,不要手工拼接编码。参数名必须与端点文档一致;发送 page=2 不能为实际需要游标的 API 实现分页。

3. 有意识地添加请求头与鉴权

curl --fail-with-body -sS --max-time 30 \
  -H 'Accept: application/json' \
  'http://127.0.0.1:8766/echo'

Accept 表达客户端能处理的响应格式,不会强制端点支持该格式。遵循真实服务的鉴权说明,分享示例命令时不包含真实凭据。

不要为了模仿 POST 示例给 GET 添加请求体。查询参数与正文位于请求的不同部分,目标服务可能不会按预期解释 GET 正文。

4. 分离正文、请求头和状态

curl --fail-with-body -sS --max-time 30 \
  --get --data-urlencode 'query=desk & lamp' \
  --dump-header response-headers.txt \
  --output response.json \
  --write-out 'HTTP %{http_code}\n' \
  'http://127.0.0.1:8766/echo'

这会分别保存响应正文和响应头。希望将响应头与正文一起显示以便检查时使用 -i,但不要把混合输出存入应用预期只含 JSON 的文件。

-I 发出 HEAD 请求,不能保证测试了完整 GET 的相同行为;一些服务对两种方法处理不同。

cURL 手册说明了输出和方法选项。检查 HTTP 状态后,还需检查 API 的成功字段:HTTP 200 也可能包含业务错误。

5. 分别处理重定向和错误

cURL 默认不跟随重定向。适合跟随时使用 --location;请求去往意外位置时检查最终 URL。

现象

检查内容

不要假设

301 或 302

Location 与预期目标

已经返回目标数据

400

查询名称、编码与类型

更换代理就能修复无效输入

401 或 403

鉴权、权限及服务响应

正文是完整公开结果

429

限流说明及存在时的 Retry-After

立即重复请求有帮助

网络超时

连接与响应耗时

请求从未到达服务

定期采集应记录来源 URL、采集时间与失败情况。保存的文件既可能包含预期数据,也可能只是错误页面。

6. 使用 GET 查询已有 MIYAIP 任务

MIYAIP Crawler API 通过 POST 创建任务,通过 GET 获取状态和结果。获得返回的任务 ID 后,按文档使用以下查询结构:

curl --fail-with-body -sS --max-time 30 --get \
  -H "Authorization: Bearer $MIYA_CONSOLE_TOKEN" \
  --data-urlencode "taskId=$MIYA_TASK_ID" \
  'https://miyaip.com/api/Crawler/TaskResult'

从自己的鉴权流程设置变量。检查业务数字码和 HTTP 状态,再检查任务状态。运行期间查询同一任务,不要创建新任务。Crawler API 文档说明了鉴权、轮询和积分记录。

常见问题

必须使用 -X GET 吗?

仅包含 URL 的基本 GET 不需要。数据参数要进入查询字符串时使用 --get;只指定方法字符串不会完成转换。

为什么包含 & 的值变成了两个参数?

检查 Shell 引号与 URL 编码。完整 URL 应加引号,构造查询时用 --data-urlencode 编码各个值。

相同命令可以保存 HTML 页面吗?

可以。通过 --output 使用合适文件名,并检查返回的 Content-Type 与正文。以 .json 结尾的文件名不会将 HTML 转成 JSON。

通过一个小请求确认查询参数和响应,然后使用文档规定的任务生命周期,或将已验证的请求接入自己的应用。

自动化前先验证请求