【问题标题】:Azure Rest Api List container : Parameter MarkerAzure Rest Api 列表容器:参数标记
【发布时间】:2017-06-16 07:31:30
【问题描述】:

大家好,我正在构建一个与 Azure Storage Rest API 交互的客户端。

我正在查看文档https://docs.microsoft.com/ru-ru/rest/api/storageservices/fileservices/list-containers2

并且不理解可以与 Azure 请求一起发送的参数前缀和标记的使用。

上面写着:

前缀

可选。过滤结果以仅返回其名称的容器 以指定的前缀开头。

标记

可选。一个字符串值,用于标识列表的一部分 容器将在下一个列表操作中返回。这 操作返回响应正文中的 NextMarker 值,如果 列名操作未返回所有待列名的容器 与当前页面。 NextMarker 值可以用作值 用于后续调用中的标记参数以请求下一页 列表项。

标记值对客户端是不透明的。

使用前缀,我认为:

如果我有目录结构:

file01.txt
images/image01.jpg
images/folder/image001.jpg
fightVideo/subFolder/current/video001.mpg
fightVideo/subFolder/current/video002.mpg

如果我将前缀容器名称命名为“战斗”。它应该返回 战斗视频。

但我不确定。

而对于 Marker,我不明白它的用途是什么?

有人可以通过示例解释前缀和标记的使用吗?

【问题讨论】:

    标签: azure azure-blob-storage


    【解决方案1】:

    在列出容器的上下文中,如果您指定prefix 参数,它将列出以该前缀值开头的容器名称。它与列出 blob 无关。

    List blobs 操作也支持此prefix 参数,当您指定此参数时,它将列出以该前缀值开头的 blob 名称。

    因此,您给出的示例是用于列出 blob,当您在此处指定 flight 作为前缀时,您将返回 fightVideo/subFolder/current/video001.mpgfightVideo/subFolder/current/video002.mpg 作为响应,但当您调用具有此前缀的列表容器时则不会。

    关于marker,Kalyan 的解释是正确的,但让我再补充一点。

    本质上,Azure 存储服务是一项共享服务,您根本无法要求它一次性返回所有结果(如果我们从 SQL 世界中进行类比,您根本无法做到 SELECT * FROM TABLE 之类的事物)。对服务的每个请求都分配了一个预定义的超时,并且响应将包括在该时间获取的项目 + 如果服务认为有更多可用数据,则可以选择一个令牌。此令牌称为continuation token。为了获得下一组项目,您需要在下一个请求的标记参数中传递此延续令牌。

    每次调用存储服务都将尝试返回预定义的最大项目数。对于列出 blob 容器/blob,此限制为 5000 个项目。对于列出表/实体,此限制为 1000 个项目。如果您的帐户中有更多项目,那么除了此数据存储服务之外,还会返回一个延续令牌,告诉您有更多可用数据。

    请注意,即使存在限制,但您不能总是假设您会获得这些记录数。根据许多条件,您很可能没有取回任何数据但仍会收到延续令牌。所以你的代码也需要处理这种情况。

    【讨论】:

    • 我有一个包含数百万个文件的 blob,我想检查最后 5,000 个 blob 名称和修改时间(由 LastModified 属性标识)。有没有什么方法可以做到这一点,而无需像我经常这样做(流式 IoT 输入)那样分页数以千计的延续令牌?我找到了条件标头If-Modified-Sincehere,但不确定是否可以解决。我不敢相信 REST 端点让这变得如此困难。
    • 不幸的是,你运气不好。除非您遵循某些 blob 命名约定,否则您将需要遍历列表并找到最后 5000 个 blob。 If-Modified-Since 条件标头也无济于事,因为它不适用于 blob 列表。一种可能的解决方案是在 Azure 搜索中导入此列表,然后在那里执行搜索。
    • 谢谢!不幸的是,重命名不是一种选择,因为这是一个对文件名有很多依赖的生产环境。我能想到的最后一个选择是将继续令牌存储在某处并始终从最后检索到的继续?来自this 的问题我认为令牌不应该改变?
    • 如果您打算缓存延续令牌,那就不要!它是一个不透明的属性,不应存储。
    • 请查看 Azure 搜索和 Blob 存储集成,尤其是元数据索引。我想不出比这更好的解决方案了。
    【解决方案2】:

    如果要列出的 blob 太多,则响应包含 NextMarker 元素。

    <?xml version="1.0" encoding="utf-8"?>  
    <EnumerationResults ServiceEndpoint="https://myaccount.blob.core.windows.net">  
      <Prefix>string-value</Prefix>  
      <Marker>string-value</Marker>  
      <MaxResults>int-value</MaxResults>  
      <Containers>  
        <Container>  
          <Name>container-name</Name>  
          <Properties>  
            <Last-Modified>date/time-value</Last-Modified>  
            <Etag>etag</Etag>  
            <LeaseStatus>locked | unlocked</LeaseStatus>  
            <LeaseState>available | leased | expired | breaking | broken</LeaseState>  
            <LeaseDuration>infinite | fixed</LeaseDuration> 
            <PublicAccess>container | blob</PublicAccess>       
          </Properties>  
          <Metadata>  
            <metadata-name>value</metadata-name>  
          </Metadata>  
        </Container>  
      </Containers>  
      <NextMarker>marker-value</NextMarker>  
    </EnumerationResults>
    

    REST API 文档提到标记值可用于后续调用以请求下一组列表项。

    你可以把标记想象成一个分页索引。

    【讨论】:

      猜你喜欢
      • 2015-09-26
      • 1970-01-01
      • 1970-01-01
      • 2018-02-09
      • 1970-01-01
      • 1970-01-01
      • 2020-12-26
      • 2019-02-03
      相关资源
      最近更新 更多