嗨大家我正在构建一个与Azure Storage Rest API交互的客户端。
我正在浏览文档https://docs.microsoft.com/ru-ru/rest/api/storageservices/fileservices/list-containers2:
并且不理解可以与Azure请求一起发送的参数前缀和标记的使用。
它说:
前缀
可选。过滤结果以仅返回其名称的容器 以指定的前缀开头。
标记
可选。一个字符串值,用于标识列表的部分 使用下一个列表操作返回的容器。该 如果操作返回响应正文中的NextMarker值 列表操作未返回剩余要列出的所有容器 与当前页面。 NextMarker值可用作值 用于后续调用中的marker参数以请求下一页 列表项目。
标记值对客户端不透明。
使用Prefix,我认为:
如果我有dir结构:
file01.txt
images/image01.jpg
images/folder/image001.jpg
fightVideo/subFolder/current/video001.mpg
fightVideo/subFolder/current/video002.mpg
如果我将前缀容器名称设为“fight”。它应该回来 fightVideo。
但我不确定。
对于Marker,我不明白它的用途是什么?
有人可以通过示例解释前缀和标记的使用吗?
答案 0 :(得分:3)
在列出容器的上下文中,如果指定constructor(platform: Platform,public myapp: IonicApp) {
this.pltform=platform;
this.app=myapp;
platform.ready().then(() => {
StatusBar.styleDefault();
Splashscreen.hide();
platform.registerBackButtonAction(function(event){
window.alert("back button pressed");
let nav = this.app.getActiveNav();
if (nav.canGoBack()){ //Can we go back?
nav.pop();
}else{
this.platform.exitApp(); //Exit from app
}
});
}
}
参数,它将列出以该前缀值开头的容器名称。它与列出blob无关。
List blobs
操作也支持此prefix
参数,当您指定此参数时,它将列出以该前缀值开头的blob名称。
因此,您给出的示例是列出blob,当您在其中指定prefix
作为前缀时,您将返回flight
和fightVideo/subFolder/current/video001.mpg
作为响应,但不会在您调用列表容器时用这个前缀。
关于fightVideo/subFolder/current/video002.mpg
,Kalyan的解释是正确的,但让我再补充一点。
本质上Azure存储服务是一种共享服务,您根本无法要求它一次性返回所有结果(如果我们从SQL世界中进行类比,则根本无法做marker
之类的事情)。对服务的每个请求都分配了预定义的超时,响应将包括在该时间内获取的项目+如果服务认为有更多可用数据,则可选择包括令牌。此令牌称为SELECT * FROM TABLE
。为了获得下一组项目,您需要在下一个请求中的marker参数中传递此延续令牌。
每次调用存储服务都会尝试返回预定义的最大项目数。对于列出blob容器/ blob,此限制为5000项。对于列出表/实体,此限制为1000个项目。如果您的帐户中有更多项目,那么除了此数据存储服务之外,还会返回一个延续令牌,告知您有更多可用数据。
请注意,即使有限制,但您不能总是假设您将获得这些数量的记录。根据许多条件,您很可能无法获取任何数据但仍会收到延续令牌。所以你的代码也需要处理这个条件。
答案 1 :(得分:1)
如果要列出的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文档提到标记值可以在后续调用中用于请求下一组列表项。
您可以将标记视为paginatator索引。