收货照片
收货时拍下的照片,以十五分钟后过期的签名 URL 提供。
员工会给收到的东西拍照——一张标签、一个破损的托盘、一支抵着展示柜的探针。那些
照片就是 isCompliant 背后的证据,而这个端点把它们交给你。
它需要在路径里那家餐厅上同时持有 deliveries:read 和 delivery-images:read。
只有前者的密钥在这里得到 403,而收货记录本身照常返回。
列出一条收货记录的照片
GET /v1/restaurants/{restaurantId}/deliveries/{deliveryId}/images
{
"data": [
{
"id": "b4d81f0ac2e7",
"contentType": "image/jpeg",
"byteLength": 902450,
"uploadedAt": "1787932860000",
"url": "https://…/restaurants/restaurant-1/deliveries/8f2c…/b4d81f0ac2e7.jpg?X-Amz-Signature=…",
"urlExpiresAt": "1787933760000"
}
]
}
这里没有分页:一条收货记录最多带二十张照片,它们在一次响应里全部返回。
| 字段 | 类型 | 含义 |
|---|---|---|
id | string | 这张照片在该条收货记录内的稳定标识符。 |
contentType | string | image/jpeg、image/png 或 image/webp。别的都进不到这个 API 里来。 |
byteLength | integer | 对象的精确大小,最大 10 MB。 |
uploadedAt | string | 照片上传完成的时间,以字符串表示的 Unix 毫秒时间戳。 |
url | string | 一个指向字节内容的签名直链。 |
urlExpiresAt | string | 这个 URL 何时失效,以字符串表示的 Unix 毫秒时间戳。 |
这些 URL 是有意做成短命的
url 是一个预签名链接,有效期十五分钟,而且同一次响应里的每个 URL 共享同一个
过期时间,所以你可以把这一页当作一个整体来处理。它自带授权,因此取回字节内容不
需要 Authorization 请求头——这也意味着这个链接本身就是一份持有即可用的凭据。
这决定了你该怎么使用它:
- 现在就取,或者晚些再取一次。 趁响应还新鲜时把字节下载下来;不要把 URL 存 起来,明天再去访问它。再调用一次这个端点就能拿到新的链接——它很便宜,而且会 重新检查授权,这正是重点所在。
- 绝不要把这个 URL 放到它的用途结束之后还留着的地方。 不要放进邮件,不要放进 工单,不要放进一个 TTL 很长的客户端缓存。在这十五分钟里,任何拿到它的人都能读 那张照片。
- 如果你自己的产品里需要这张照片,存字节,不要存链接。 把
id一起存着,这样 你能判断自己是不是已经有它了。
只有已经上传完的照片会出现
一张照片在设备开始上传时就被登记,但只有在字节真正落地并通过校验之后才会在这里 可见。一张还在路上的照片——一部在上传中途离开了这栋楼的手机——是缺席,而不是坏掉。
这就是为什么收货记录上的 imageCount 有可能短暂地多于这个端点返回的数量。要知道
此刻存在什么,以这个端点为准;如果数量对你很重要,稍后再读一次那条收货记录。
把它们取下来
curl "https://api.backresto.com/v1/restaurants/$RESTAURANT_ID/deliveries/$DELIVERY_ID/images" \
-H "Authorization: Bearer $BACKRESTO_PARTNER_API_KEY" \
| jq -r '.data[] | "\(.id) \(.url)"' \
| while read -r id url; do
curl -sS "$url" -o "$id.jpg"
done
第一次调用带 Authorization 请求头,第二次不带:URL 里的签名才是授权这次下载的
东西。