AWS boto3 get_object 调用的 IfMatch 参数如何工作?

How does the IfMatch argument for the AWS boto3 get_object call work?

boto3 s3 get_object函数 文档(从 AWS 服务定义文件自动生成)将 IfMatch 参数描述为

Return the object only if its entity tag (ETag) is the same as the one specified, otherwise return a 412 (precondition failed).

然而,当我尝试使用 IfMatch 参数时,我无法让 S3 使用非 200 HTTP 状态代码或抛出异常进行响应。

这个示例代码

import boto3
import hashlib
import json

BUCKET = 'your-bucket-name-goes-here'
data = {'foo': 'bar', 'baz': 'buz'}
payload = json.dumps(data, sort_keys=True, indent=4).encode('UTF-8')
etag = hashlib.md5(payload).hexdigest()
print("Locally computed etag : {}".format(etag))
client = boto3.client('s3')
response = client.put_object(
    Body=payload,
    Bucket=BUCKET,
    ContentType='application/json',
    Key='/test.json')
etag_with_quotes = response['ETag']
print("Etag returned from put_object: {}".format(etag_with_quotes))

response = client.get_object(
  Bucket=BUCKET,
  Key='/test.json',
  IfMatch=etag
)
print("Etag returned from get_object: {}".format(response['ETag']))
print("HTTP status code : {}".format(response['ResponseMetadata']['HTTPStatusCode']))

response = client.get_object(
  Bucket=BUCKET,
  Key='/test.json',
  IfMatch=etag_with_quotes
)
print("Etag returned from get_object: {}".format(response['ETag']))
print("HTTP status code : {}".format(response['ResponseMetadata']['HTTPStatusCode']))

产生这个输出

Locally computed etag : d14e36174d57c305bd9d7c171e669ac8
Etag returned from put_object: "d14e36174d57c305bd9d7c171e669ac8"
Etag returned from get_object: "d14e36174d57c305bd9d7c171e669ac8"
HTTP status code : 200
Etag returned from get_object: "d14e36174d57c305bd9d7c171e669ac8"
HTTP status code : 200

如果本地副本相同,应该如何使用 IfMatch 参数来避免下载文件?

如果 ETag 匹配,

IfMatch 下载对象。要仅在不同时下载,请使用 IfNoneMatch.


另请注意,这仅适用于未使用分段上传上传的对象。多部分上传使用 different ETag algorithm 包含各个部分的二进制(非十六进制)md5 哈希的十六进制 md5 哈希,然后是 -,然后是部分的数量。这些你自己算也能成功,但是比较复杂