精华内容
下载资源
问答
  • rest服务发布原理: 首先是注解@Controller、@RestController、@RequestMapping,启动的时候,spring 会自动加载解析相关的bean以及bean的方法,然后包装成HttpMthod对象,存储在AbstactMappingHandler抽象类里面的...

    rest服务发布原理:

    1. 首先是注解@Controller、@RestController、@RequestMapping,启动的时候,spring 会自动加载解析相关的bean以及bean的方法,然后包装成HttpMthod对象,存储在AbstactMappingHandler抽象类里面的一个MappingRegistery对象里面,该对象以map的对象维持着所有的HttpMethod . (这一块的加载原理还需要看下). AbstactMappingHandler实现了MappingHandler接口,真正的核心实现类是:RequestMappingHandlerMapping

    2.http请求接入的时候,首先走的是tomcat提供的servlet接口,然后在DispatchServlet里面完成寻找
    首先是解析请求,这里会对请求进行warp操作,以及判断是否是mulit请求
    然后根据请求从MappingRegistery查找httpMethod
    根据httpMethod构建HandleExecutionChain,其内部包含了拦截器HandleInterceptor
    然后根据定义的参数类型找到合适的ArgumentResovler,由ArgumentResovler来完成参数的解析和转换,ArgumentResovler持有做HttpMessageConverter,然后根据不同的类型进行转换
    ArgumentResovler的入口实现累是ArgumentResovlerCompise,组合了所有的Resovler,每一个注解都有对应的Resolver,@RequestBody的Resovler的注册器是RequestMappingBodyProcessoer

    展开全文
  • F5-python 添加了一个 rest api 和 tmsh 解析器来管理 F5 bigip 负载均衡器。 编写它是为了解析 ansible-openstack f5-config.py 程序的输出。 f5-5-5.py f5-5-5.py 程序是 10.x RPC 版本的 f5-config.py 脚本的一...
  • <code>{ "data": [ { "nums": [ "23", "45", "89" ], "numsUnit": "人" } ] }</code></pre> <p> </p>
  • ElasticSearch Rest/RPC 接口解析

    千次阅读 2016-02-25 11:11:45
    解析ElasticSearch的接口层,也就是Rest/RPC接口相关。我们会描述一个请求从http接口到最后被处理都经过了哪些环节。 一些基础知识早先ES的HTTP协议支持还是依赖Jetty的,现在不管是Rest还是RPC都是直接基于Netty了。...

    ElasticSearch 的体系结构比较复杂,层次也比较深,源码注释相比其他的开源项目要少。这是ElasticSearch 系列的第一篇。解析ElasticSearch的接口层,也就是Rest/RPC接口相关。我们会描述一个请求从http接口到最后被处理都经过了哪些环节。

    一些基础知识

    早先ES的HTTP协议支持还是依赖Jetty的,现在不管是Rest还是RPC都是直接基于Netty了。

    另外值得一提的是,ES 是使用Google的Guice 进行模块管理,所以了解Guice的基本使用方式有助于你了解ES的代码组织。

    ES 的启动类是 org.elasticsearch.bootstrap.Bootstrap。在这里进行一些配置和环境初始化后会启动org.elasticsearch.node.Node。Node 的概念还是蛮重要的,节点的意思,也就是一个ES实例。RPC 和 Http的对应的监听启动都由在该类完成。

    Node 属性里有一个很重要的对象,叫client,类型是 NodeClient,我们知道ES是一个集群,所以每个Node都需要和其他的Nodes 进行交互,这些交互则依赖于NodeClient来完成。所以这个对象会在大部分对象中传递,完成相关的交互。

    先简要说下:

    • NettyTransport 对应RPC 协议支持
    • NettyHttpServerTransport 则对应HTTP协议支持

    Rest 模块解析

    首先,NettyHttpServerTransport 会负责进行监听Http请求。通过配置http.netty.http.blocking_server 你可以选择是Nio还是传统的阻塞式服务。默认是NIO。该类在配置pipeline的时候,最后添加了HttpRequestHandler,所以具体的接受到请求后的处理逻辑就由该类来完成了。

    pipeline.addLast("handler", requestHandler);

    HttpRequestHandler 实现了标准的 messageReceived(ChannelHandlerContext ctx, MessageEvent e) 方法,在该方法中,HttpRequestHandler 会回调NettyHttpServerTransport.dispatchRequest方法,而该方法会调用HttpServerAdapter.dispatchRequest,接着又会调用HttpServer.internalDispatchRequest方法(额,好吧,我承认嵌套挺深有点深):

    public void internalDispatchRequest(final HttpRequest request, final HttpChannel channel) {
            String rawPath = request.rawPath();
            if (rawPath.startsWith("/_plugin/")) {
                RestFilterChain filterChain = restController.filterChain(pluginSiteFilter);
                filterChain.continueProcessing(request, channel);
                return;
            } else if (rawPath.equals("/favicon.ico")) {
                handleFavicon(request, channel);
                return;
            }
            restController.dispatchRequest(request, channel);
        }

    这个方法里我们看到了plugin等被有限处理。最后请求又被转发给 RestController。

    RestController 大概类似一个微型的Controller层框架,实现了:

    1. 存储了 Method + Path -> Controller 的关系
    2. 提供了注册关系的方法
    3. 执行Controller的功能。

    那么各个Controller(Action) 是怎么注册到RestController中的呢?

    在ES中,Rest*Action 命名的类的都是提供http服务的,他们会在RestActionModule 中被初始化,对应的构造方法会注入RestController实例,接着在构造方法中,这些Action会调用controller.registerHandler 将自己注册到RestController。典型的样子是这样的:

    @Inject
        public RestSearchAction(Settings settings, RestController controller, Client client) {
            super(settings, controller, client);
            controller.registerHandler(GET, "/_search", this);
            controller.registerHandler(POST, "/_search", this);
            controller.registerHandler(GET, "/{index}/_search", this);

    每个Rest*Action 都会实现一个handleRequest方法。该方法接入实际的逻辑处理。

    @Override
        public void handleRequest(final RestRequest request, final RestChannel channel, final Client client) {
            SearchRequest searchRequest;
            searchRequest = RestSearchAction.parseSearchRequest(request, parseFieldMatcher);
            client.search(searchRequest, new RestStatusToXContentListener<SearchResponse>(channel));
        }

    首先是会把 请求封装成一个SearchRequest对象,然后交给 NodeClient 执行。

    如果用过ES的NodeClient Java API,你会发现,其实上面这些东西就是为了暴露NodeClient API 的功能,使得你可以通过HTTP的方式调用。

    Transport*Action,两层映射关系解析

    我们先跑个题,在ES中,Transport*Action 是比较核心的类集合。这里至少有两组映射关系。

    • Action -> Transport*Action
    • Transport*Action -> *TransportHandler

    第一层映射关系由类似下面的代码在ActionModule中完成:

     registerAction(PutMappingAction.INSTANCE,  TransportPutMappingAction.class);
    

    第二层映射则在类似 SearchServiceTransportAction 中维护。目前看来,第二层映射只有在查询相关的功能才有,如下:

    transportService.registerRequestHandler(FREE_CONTEXT_SCROLL_ACTION_NAME, ScrollFreeContextRequest.class, ThreadPool.Names.SAME, new FreeContextTransportHandler<>());

    SearchServiceTransportAction 可以看做是SearchService进一步封装。其他的Transport*Action 则只调用对应的Service 来完成实际的操作。

    对应的功能是,可以通过Action 找到对应的Transport*Action,这些Transport*Action 如果是query类,则会调用SearchServiceTransportAction,并且通过第二层映射找到对应的Handler,否则可能就直接通过对应的Service完成操作。

    下面关于RPC调用解析这块,我们会以查询为例。

    RPC 模块解析

    前面我们提到,Rest接口最后会调用NodeClient来完成后续的请求。对应的代码为:

    public <Request extends ActionRequest, Response extends ActionResponse, RequestBuilder extends ActionRequestBuilder<Request, Response, RequestBuilder>> void doExecute(Action<Request, Response, RequestBuilder> action, Request request, ActionListener<Response> listener) {
            TransportAction<Request, Response> transportAction = actions.get(action);
            if (transportAction == null) {
                throw new IllegalStateException("failed to find action [" + action + "] to execute");
            }
            transportAction.execute(request, listener);
        }

    这里的action 就是我们提到的第一层映射,找到Transport*Action.如果是查询,则会找到TransportSearchAction。调用对应的doExecute 方法,接着根据searchRequest.searchType找到要执行的实际代码。下面是默认的:

    else if (searchRequest.searchType() == SearchType.QUERY_THEN_FETCH) {    queryThenFetchAction.execute(searchRequest, listener);}

    我们看到Transport*Action 是可以嵌套的,这里调用了TransportSearchQueryThenFetchAction.doExecute

    @Overrideprotected void doExecute(SearchRequest searchRequest, ActionListener<SearchResponse> listener) {   
     new AsyncAction(searchRequest, listener).start();
    }

    在AsyncAction中完成三个步骤:

    1. query
    2. fetch
    3. merge

    为了分析方便,我们只分析第一个步骤。

    @Overrideprotected void sendExecuteFirstPhase(
    DiscoveryNode node, 
    ShardSearchTransportRequest request, 
    ActionListener<QuerySearchResultProvider> listener) {   
         searchService.sendExecuteQuery(node, request, listener);
    }

    这是AsyncAction 中执行query的代码。我们知道ES是一个集群,所以query 必然要发到多个节点去,如何知道某个索引对应的Shard 所在的节点呢?这个是在AsyncAction的父类中完成,该父类分析完后会回调子类中的对应的方法来完成,譬如上面的sendExecuteFirstPhase 方法。

    说这个是因为需要让你知道,上面贴出来的代码只是针对一个节点的查询结果,但其实最终多个节点都会通过相同的方式进行调用。所以才会有第三个环节 merge操作,合并多个节点返回的结果。

    searchService.sendExecuteQuery(node, request, listener);

    其实会调用transportService的sendRequest方法。大概值得分析的地方有两个:

    if (node.equals(localNode)) {
                    sendLocalRequest(requestId, action, request);
                } else {
                    transport.sendRequest(node, requestId, action, request, options);
                }

    我们先分析,如果是本地的节点,则sendLocalRequest是怎么执行的。如果你跑到senLocalRequest里去看,很简单,其实就是:

    reg.getHandler().messageReceived(request, channel);

    reg 其实就是前面我们提到的第二个映射,不过这个映射其实还包含了使用什么线程池等信息,我们在前面没有说明。

    这里 reg.getHandler == SearchServiceTransportAction.SearchQueryTransportHandler,所以messageReceived 方法对应的逻辑是:

    QuerySearchResultProvider result = searchService.executeQueryPhase(request);
    channel.sendResponse(result);

    这里,我们终于看到searchService。 在searchService里,就是整儿八景的Lucene相关查询了。这个我们后面的系列文章会做详细分析。

    如果不是本地节点,则会由NettyTransport.sendRequest 发出远程请求。
    假设当前请求的节点是A,被请求的节点是B,则B的入口为MessageChannelHandler.messageReceived。在NettyTransport中你可以看到最后添加的pipeline里就有MessageChannelHandler。我们跑进去messageReceived 看看,你会发现基本就是一些协议解析,核心方法是handleRequest,接着就和本地差不多了,我提取了关键的几行代码:

    final RequestHandlerRegistry reg = transportServiceAdapter.getRequestHandler(action);
    threadPool.executor(reg.getExecutor()).execute(new RequestHandler(reg, request, transportChannel));

    这里被RequestHandler包了一层,其实内部执行的就是本地的那个。RequestHandler 的run方法是这样的:

    protected void doRun() throws Exception {     reg.getHandler().messageReceived(request, transportChannel);
    }

    这个就和前面的sendLocalRequest里的一模一样了。

    展开全文
  • 主要介绍了Django rest framework分页接口实现原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • 主要介绍了Java基于rest assured实现接口测试过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • RestTemplate调用rest接口

    2021-06-08 18:16:35
    RestTemplate调用rest接口 应用层:HTTP 传输层:TCP(传输控制协议) 保证通信数据有序可靠 端口号:80 网络层:IP地址 DNS域名服务器解析域名 数据链路层&物理层:完成数据传输 一次http请求的过程: 1,域名...

    RestTemplate调用rest接口

    应用层:HTTP
    传输层:TCP(传输控制协议) 保证通信数据有序可靠 端口号:80
    网络层:IP地址 DNS域名服务器解析域名
    数据链路层&物理层:完成数据传输

    一次http请求的过程:
    1,域名解析为ip地址
    2,向服务器ip+端口号建立TCP连接 连接成功
    3,发送http请求,并得到响应
    4,浏览器渲染并展示HTML

    URL的组成http://www.example.com/
    http: schema协议 可以省略(浏览器默认的)
    域名后面可以跟端口号,默认80可以省略。
    最后的斜杠表示服务器根路径下的资源。

    报文含义参考RFC文档。

    RestTemplate调用rest接口

    首先需要注入resttemplate,建立一个config文件:
    1:Apache HttpComponents (httpclient)
    2:Netty(网络通信库)
    3:OkHttp

    //通过构造方法更换底层的执行引擎。
    return new RestTemplate();//默认是jdk的HttpUrlConnection;
    return new RestTemplate(new HttpComponentsClientHttpRequestFactory());//这个是httpclient,需要导入依赖。
    
    @Configuration
    public class RestTemplateConfig {
    
            @Autowired
            private RestTemplateBuilder restTemplateBuilder;
    
            @Bean
            public RestTemplate restTemplate() {
    
                return restTemplateBuilder.setConnectTimeout(Duration.ofSeconds(120000))
                        .setReadTimeout(Duration.ofSeconds(150000)).build();
                
            }
    }
    

    1:采用restTemplate.postForEntity直接处理string格式的json字符串:

    public void sendMailByCM01(){
        String data = "{\n" +
                "    \"receivers\":\"10256056\",\n" +
                "    \"subject\":\"测试配置平台邮件\",\n" +
                "    \"mailMsg\":\"三月二十九日天气晴朗。\",\n" +
                "    \"mailType\": \"text\"\n" +
                "}";
                
        String url = "http://10.7.224.163:8888/mail";
        ResponseEntity<String> objectResponseEntity = restTemplate.postForEntity(url, data, String.class);
        System.out.println(objectResponseEntity.getBody());
    

    2:restTemplate.postForEntity采用实体bean传参:(方便书写代码可以将set方法的返回值设置为实例本身。)

    @Data
    @Accessors(chain=true)
    public class MailBean {
        private String receivers;
        private String subject;
        private String mailMsg;
        private String mailType;
    }
    
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setContentType(MediaType.APPLICATION_JSON);
    MailBean mailBean = new MailBean();
    mailBean.setReceivers("10256056")
            .setSubject("测试传入参数为bean")
            .setMailMsg("1sfsefscvdsvsdcvsdvcsdcvsdvdfvd小巷")
            .setMailType("text");
    
    HttpEntity<MailBean> httpEntity = new HttpEntity<>(mailBean,httpHeaders);
    String url = "http://10.7.224.163:8888/mail";
    ResponseEntity<String> objectResponseEntity = restTemplate.postForEntity(url, httpEntity, String.class);
    System.out.println(objectResponseEntity.getBody());
    

    3:restTemplate.exchange采用实体bean传参:(方便书写代码可以将set方法的返回值设置为实例本身。)
    如果不带httpheaders的话,httpentity的构造参数可以只带mailBean,相当于包装了下mailBean。
    HttpEntity httpEntity = new HttpEntity<>(mailBean);

    ResponseEntity<String> objectResponseEntity = restTemplate.exchange(url, HttpMethod.POST, httpEntity, String.class);
    System.out.println(objectResponseEntity.getBody());
    

    其他几个get接口:(全链接)

    String url = "http://syste****ail";
    ResponseEntity<String> forObject = restTemplate.getForEntity(url, String.class);
    log.info("rest template get: {}", forObject.getBody());
    return forObject.getBody();
    

    分链接1(拼接url的方式,使用getForObject)
    @param uriVariables the variables to expand the template

    String url = "http://sy******es?changeId={changeId}&project={project}&branch={branch}&detail";
    String forObject = restTemplate.getForObject(url, String.class, "Ifd84*****f8100c", "***spa", "Cv");
    log.info("rest template get: {}", forObject);
    return forObject;
    

    分链接2(拼接url的方式,使用getForObject)返回string

    String url = "http://syses?changeId={1}&project={2}&branch={3}&detail";
    String forObject = restTemplate.getForObject(url, String.class, "Ifd**c", "5**spa", "Dev");
    log.info("rest template get: {}", forObject);
    return forObject;
    

    分链接2(拼接url的方式,使用getForObject)返回jsonobject

    String url = "http://sys****s?changeId={1}&project={2}&branch={3}&detail";
    JSONObject forObject = restTemplate.getForObject(url, JSONObject.class, "If**0c", "**spa", "**ev");
    log.info("rest template get: {}", forObject);
    return forObject.toString();
    

    使用url:

    try {
        String url = "http://syst**s?detail";
        URI uri = new URIBuilder(url)
                .addParameter("changeId", "If**0c")
                .addParameter("project", "5*pa")
                .addParameter("branch", "C**Dev")
                .build();
        ResponseEntity<JSONObject> forObject = restTemplate.exchange(uri, HttpMethod.GET, null, JSONObject.class);
        log.info("rest template get: {}", forObject.getBody().toString());
        return forObject.getBody().toString();
    } catch (Exception e) {
        e.printStackTrace();
        return "error";
    }
    

    使用url与RequestEntity

    try {
        String url = "http:***es?detail";
        URI uri = new URIBuilder(url)
                .addParameter("changeId", "If**0c")
                .addParameter("project", "5**spa")
                .addParameter("branch", "Dev")
                .build();
        RequestEntity requestEntity = new RequestEntity(HttpMethod.GET, uri);
        ResponseEntity<JSONObject> forObject = restTemplate.exchange(requestEntity, JSONObject.class);
        log.info("rest template get: {}", forObject.getBody().toString());
        return forObject.getBody().toString();
    } catch (Exception e) {
        e.printStackTrace();
        return "error";
    }
    

    上传与下载文件

    /**
     * 上传文件
     */
    public String uploadFile(MultipartFile file, String uuid) throws IOException {
        String fileName = file.getOriginalFilename();
        log.info("开始上传文件,文件名称:{},路径:{}", fileName, uuid);
        HttpHeaders headers = new HttpHeaders();
        headers.set("X-JFrog-Art-Api", "artFactoryConfiguration.getToken()");
        headers.setContentType(MediaType.MULTIPART_FORM_DATA);
        HttpEntity httpEntity = new HttpEntity(file.getBytes(), headers);
    
        String url = "artFactoryConfiguration.getUrl()" + "/" + uuid + "/" + fileName;
        ResponseEntity<JSONObject> exchange = restTemplate.exchange(url, HttpMethod.PUT, httpEntity, JSONObject.class);
        if (exchange.getStatusCode().is2xxSuccessful() && exchange.getBody().getString("createdBy").equals("wxxalte")) {
            log.info("文件上传成功,文件名称:{},路径:{}", fileName, uuid);
            return "success";
        }
        log.info("文件上传失败,文件名称:{},路径:{}", fileName, uuid);
        return "fail";
    }
    
    /**
     * 下载文件
     */
    public void downloadFile(String keyCode, String fileName, HttpServletResponse resp) throws IOException {
        log.info("开始下载文件,文件名称:{},路径:{}", fileName, keyCode);
        HttpHeaders headers = new HttpHeaders();
        headers.set("X-JFrog-Art-Api", "");
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        HttpEntity httpEntity = new HttpEntity(null, headers);
    
        String url = "" + "/" + keyCode + "/" + fileName;
        ResponseEntity<byte[]> responseEntity = restTemplate.exchange(url, HttpMethod.GET, httpEntity, byte[].class);
        log.info("response content length: " + responseEntity.getHeaders().getContentLength());
        log.info("response content type: " + responseEntity.getHeaders().getContentType());
    
        // 设置下载后的文件名以及header
        resp.setHeader("content-type", "application/octet-stream");
        resp.setContentType("application/octet-stream");
        resp.setHeader("Content-disposition", "attachment;filename=" + fileName);
    
        // 对大文件进行下载
        StreamUtils.copy(responseEntity.getBody(), resp.getOutputStream());
        log.info("下载文件结束,文件名称:{},路径:{}", fileName, keyCode);
    }
    
    展开全文
  • 本文档将介绍 SequoiaS3 支持的 Rest 接口。 GET Service 查询用户创建的所有存储桶 请求语法 GET / HTTP/1.1 Host: ip:port Date: date Authorization: authorization string 结果解析 查询结果以 XML 形式在响应...

    本文档将介绍 SequoiaS3 支持的 Rest 接口。

    GET Service

    查询用户创建的所有存储桶

    请求语法

    GET / HTTP/1.1
    Host: ip:port
    Date: date
    Authorization: authorization string
    

    结果解析

    查询结果以 XML 形式在响应消息体中显示。

    元素 说明
    ListAllMyBucketsResult 包含 Owner 和 Buckets
    Owner 存储桶所有者,包含 ID 和 DisplayName,属于 ListAllMyBucketsResult
    ID 存储桶所有者的 ID,属于 ListAllMyBucketsResult.Owner
    DisplayName 存储桶所有者的名称,属于 ListAllMyBucketsResult.Owner
    Buckets 桶列表,包含若干 Bucket,属于 ListAllMyBucketsResult
    Bucket 存储桶,包含 Name 和 CreationDate,属于 ListAllMyBucketsResult.Buckets
    Name 存储桶名称,属于 ListAllMyBucketsResult.Buckets.Bucket
    CreationDate 存储桶创建时间,属于 ListAllMyBucketsResult.Buckets.Bucket

    ###示例###

    响应结果如下:

    <ListAllMyBucketsResult>
      <Owner>
        <DisplayName>username</DisplayName>
        <ID>34455</ID>
      </Owner>
      <Buckets>
        <Bucket>
          <Name>mybucket</Name>
          <CreationDate>2019-02-03T16:45:09.000Z</CreationDate>
        </Bucket>
        <Bucket>
          <Name>samples</Name>
          <CreationDate>2019-02-03T16:41:58.000Z</CreationDate>
        </Bucket>
      </Buckets>
    </ListAllMyBucketsResult>
    

    PUT Bucket

    创建存储桶

    Note:

    存储桶名需在整个系统内唯一,长度在 3~63 之间。

    请求语法

    PUT /bucketname HTTP/1.1
    Host: ip:port
    Content-Length: length
    Date: date
    Authorization: authorization string
    
    <CreateBucketConfiguration>
      <LocationConstraint>Region</LocationConstraint>
    </CreateBucketConfiguration>
    

    请求元素

    用户需要在请求消息体中使用 XML 形式指定存储桶创建的区域,如果不指定则存储桶创建在默认的区域上。

    元素 说明
    CreateBucketConfiguration 包含 LocationConstraint
    LocationConstraint 指定创建存储桶的区域,类型为 String

    示例

    响应结果如下:

    HTTP/1.1 200 OK
    Location: /bucketName
    Content-Length: 0
    Date: Fri, 16 Aug 2019 11:11:53 GMT
    

    DELETE Bucket

    删除存储桶

    请求语法

    DELETE /bucketname HTTP/1.1
    Host: ip:port
    Date: date
    Authorization: authorization string
    

    示例

    响应结果如下:

    HTTP/1.1 204 No Content
    Date: Fri, 16 Aug 2019 10:11:53 GMT
    

    HEAD Bucket

    检查一个存储桶是否存在

    请求语法

    HEAD /bucketname HTTP/1.1
    Date: date
    Authorization: authorization string
    Host: ip:port
    

    示例

    响应结果如下:

    HTTP/1.1 200 OK
    Date: Fri, 16 Aug 2019 10:10:53 GMT
    

    PUT Bucket versioning

    修改存储桶的版本控制状态

    请求语法

    PUT /bucketname?versioning HTTP/1.1
    Host: ip:port
    Content-Length: length
    Date: date
    Authorization: authorization string
    
    <VersioningConfiguration>
      <Status>VersioningState</Status>
    </VersioningConfiguration>
    

    参数说明

    参数名 说明
    versioning 表示该请求为修改存储桶的版本控制状态

    请求元素

    在请求消息体中使用 XML 形式指定存储桶的版本控制状态。

    元素 说明
    VersioningConfiguration 包含 Status
    Status 版本控制状态,有效值为 Suspended

    示例

    响应结果如下:

    HTTP/1.1 200 OK
    Date: Wed, 01 Mar  2006 12:00:00 GMT
    

    GET Bucket versioning

    查询桶的版本控制状态

    请求语法

    GET /bucketname?versioning HTTP/1.1
    Host: ip:port
    Content-Length: length
    Date: date
    Authorization: authorization string
    

    结果解析

    查询结果以 XML 形式在响应消息头中显示。

    元素 说明
    VersioningConfiguration 包含 Status
    Status 版本控制状态,有效值为 Suspended

    示例

    • 打开版本控制开关,查询结果如下:

      <VersioningConfiguration>
        <Status>Enabled</Status>
      </VersioningConfiguration>
      
    • 禁用版本控制,查询结果如下:

      <VersioningConfiguration>
        <Status>Suspended</Status>
      </VersioningConfiguration>
      
    • 从未开启或禁用过版本控制,查询结果如下:

      <VersioningConfiguration/>
      

    GET Bucket location

    查询桶所在的区域

    请求语法

    GET /bucketname?location HTTP/1.1
    Host: ip:port
    Date: date
    Authorization: authorization string
    

    结果解析

    查询结果以 XML 格式在响应消息体中显示。

    元素 说明
    LocationConstraint 桶所在的区域

    示例

    • 已经配置了区域的存储桶,查询结果如下:

      <LocationConstraint>region</LocationConstraint>
      
    • 未配置区域的存储桶,查询结果如下:

      <LocationConstraint/>
      

    GET Bucket (List Objects) Version 1

    查询存储桶内对象列表

    请求语法

    GET /bucketname HTTP/1.1
    Host: ip:port
    Date: date
    Authorization: authorization string
    

    请求参数

    参数名 说明
    prefix 前缀,返回具有前缀的对象列表,类型为 String
    delimiter 分隔符,如果指定 prefix,则 prefix 后第一次出现的分隔符之间包含相同字符串的所有键都被分组在一个 CommonPrefixes;如果未指定 prefix 参数,则子字符串从对象名称的开头开始;该参数类型为 String
    marker 指定在存储桶中列出对象要开始的键,返回对象键按照 UTF-8 二进制顺序从该标记后的键开始按顺序排列,类型为 String
    max-keys 设置响应中返回的最大键数,默认值为 1000,如果要查询返回数量少于 1000,可以填写其他值,填写超过 1000 的值,仍然按照 1000 条返回,该参数类型为 String
    encoding-type 响应结果编码类型,只支持 url,由于对象名称可以包含任意字符,但是XML对某些特别的字符无法解析,所以需要对响应中的对象名称进行编码

    结果解析

    查询结果以 XML 形式在响应消息体中显示。

    元素 说明
    ListBucketResult 包含存储桶信息、查询条件和查询的对象信息
    Name 存储桶名称
    Prefix 查询的 prefix 条件
    Delimiter 查询的 delimiter 条件
    Marker 查询的 marker 条件
    MaxKeys 查询的 maxKeys 条件
    Encoding-Type 查询的 encoding-type 条件
    IsTruncated 如果该字段为 true,说明由于条数限制,本次没有查询完所有符合条件的结果,可以使用 NextMarker 作为下一次查询的 Marker 条件继续查询剩余内容
    NextMarker 当 IsTruncated 为 true 时,该字段返回的是本次查询的最后一条的记录
    CommonPrefixes 当查询条件指定了 Delimter 时,Prefix 后面第一次出现 Delimiter 的位置(包括 Delimiter)之前的内容作为 CommonPrefix,当有多个对象具有相同的 CommonPrefix 时,只返回一条 CommonPrefix,计数一次,对象信息不返回
    Prefix CommonPrefix 包含的前缀,属于 ListBucketResult.CommonPrefixes
    Contents 包含对象的元数据
    Key 对象的名称,属于 ListBucketResult.Contents
    LastModified 创建对象的时间,属于 ListBucketResult.Contents
    ETag 对象的MD5值,属于 ListBucketResult.Contents
    Size 对象的大小,单位为字节,属于 ListBucketResult.Contents
    Owner 存储桶的所有者,属于 ListBucketResult.Contents
    ID 存储桶所有者的ID,属于 ListBucketResult.Contents.Owner
    DisplayName 桶所有者的名字,属于 ListBucketResult.Contents.Owner

    示例

    • 不携带查询条件,查询存储桶内所有记录

      GET /bucketname HTTP/1.1
      Host: ip:port
      Date: date
      Authorization: authorization string
      

      查询结果如下:

      <ListBucketResult>
          <Name>bucketname</Name>
          <Prefix/>
          <Marker/>
          <MaxKeys>1000</MaxKeys>
          <IsTruncated>false</IsTruncated>
          <Contents>
              <Key>my-image.jpg</Key>
              <LastModified>2019-08-12T17:50:30.000Z</LastModified>
              <ETag>&quot;fba9dede5f27731c9771645a39863328&quot;</ETag>
              <Size>434234</Size>
              <Owner>
                  <ID>125664</ID>
                  <DisplayName>username</DisplayName>
              </Owner>
          </Contents>
          <Contents>
             <Key>my-third-image.jpg</Key>
               <LastModified>2019-08-12T17:51:30.000Z</LastModified>
               <ETag>&quot;1b2cf535f27731c974343645a3985328&quot;</ETag>
               <Size>64994</Size>
               <Owner>
                  <ID>125664</ID>
                  <DisplayName>username</DisplayName>
              </Owner>
          </Contents>
      </ListBucketResult>
      
    • 本次请求指定 prefix 为 N,起始位置为 Ned,并只返回 100 条记录

      GET /mybucket?prefix=N&marker=Ned&max-keys=100 HTTP/1.1
      Host: iP:port
      Date: date
      Authorization: authorization string
      

      查询结果如下:

      <ListBucketResult>
        <Name>mybucket</Name>
        <Prefix>N</Prefix>
        <Marker>Ned</Marker>
        <MaxKeys>100</MaxKeys>
        <IsTruncated>false</IsTruncated>
        <Contents>
          <Key>Nelson</Key>
          <LastModified>2019-08-12T12:00:00.000Z</LastModified>
          <ETag>&quot;828ef3fdfa96f00ad9f27c383fc9ac7f&quot;</ETag>
          <Size>5</Size>
          <Owner>
            <ID>125664</ID>
            <DisplayName>username</DisplayName>
           </Owner>
        </Contents>
        <Contents>
          <Key>Neo</Key>
          <LastModified>2019-08-12T12:01:00.000Z</LastModified>
          <ETag>&quot;828ef3fdfa96f00ad9f27c383fc9ac7f&quot;</ETag>
          <Size>4</Size>
           <Owner>
            <ID>125664</ID>
            <DisplayName>username</DisplayName>
          </Owner>
       </Contents>
      </ListBucketResult>
      
    • 桶内已经有如下对象

      sample.jpg
      photos/2006/January/sample.jpg
      photos/2006/February/sample2.jpg
      photos/2006/February/sample3.jpg
      photos/2006/February/sample4.jpg
      

      本次请求携带分隔符/

      GET /mybucket-2?delimiter=/ HTTP/1.1
      Host: ip:port
      Date: date
      Authorization: authorization string
      

      查询结果如下:

      <ListBucketResult>
        <Name>mybucket-2</Name>
        <Prefix/>
        <Marker/>
        <MaxKeys>1000</MaxKeys>
        <Delimiter>/</Delimiter>
        <IsTruncated>false</IsTruncated>
        <Contents>
          <Key>sample.jpg</Key>
          <LastModified>2019-08-12T12:01:00.000Z</LastModified>
          <ETag>&quot;bf1d737a4d46a19f3bced6905cc8b902&quot;</ETag>
          <Size>142863</Size>
          <Owner>
            <ID>canonical-user-id</ID>
            <DisplayName>display-name</DisplayName>
          </Owner>
        </Contents>
        <CommonPrefixes>
          <Prefix>photos/</Prefix>
        </CommonPrefixes>
      </ListBucketResult>
      

    GET Bucket (List Objects) Version 2

    查询桶内对象列表

    请求语法

    GET /bucketname?list-type=2 HTTP/1.1
    Host: ip:port
    Date: date
    Authorization: authorization string
    

    请求参数

    参数名 说明
    list-type 固定设置为 2,List Objects 的第二个版本
    prefix 前缀,返回具有前缀的对象列表,类型为 String
    delimiter 分隔符,如果指定 prefix,则 prefix 后第一次出现的分隔符之间包含相同字符串的所有键都被分组在一个 CommonPrefixes;如果未指定 prefix 参数,则子字符串从对象名称的开头开始,类型为 String
    start-after 指定在存储桶中列出对象要开始的键,返回对象键按照 UTF-8 二进制顺序从该标记后的键开始按顺序排列,类型为 String
    max-keys 设置响应中返回的最大键数,默认值 1000,如果要查询返回数量少于 1000,可以填写其他值,填写超过 1000 的值,仍然按照 1000 条返回,类型为 String
    encoding-type 响应结果编码类型,只支持 url。由于对象名称可以包含任意字符,但是 XML 对某些特别的字符无法解析,所以需要对响应中的对象名称进行编码
    continuation-token 当响应结果被截断,还有部分未返回时,响应结果中会包含 NextContinuationToken,要列出下一组对象,可以使用 NextContinuationToken 下一个请求中的元素作为 continuation-token
    fetch-owner 默认情况下,结果中不会返回 Owner 信息,如果要在响应中包含 Owner 信息,将该参数置为 true

    结果解析

    查询结果以 XML 形式在响应消息体中显示。

    元素 说明
    ListBucketResult 包含存储桶信息、查询条件和查询的对象信息
    Name 存储桶名称
    Prefix 查询的 prefix 条件
    Delimiter 查询的 delimiter 条件
    StartAfter 查询的 start-after 条件
    ContinuationToken 查询的 continuation-token 条件
    MaxKeys 查询的 maxKeys 条件
    Encoding-Type 查询的 encoding-type 条件
    KeyCount 本次查询返回的记录数
    IsTruncated 如果该字段为 true,说明由于条数限制,本次没有查询完所有符合条件的结果,可以使用 NextMarker 作为下一次查询的 Marker 条件继续查询剩余内容
    NextContinuationToken 当 IsTruncated 为 true 时,NextContinuationToken 记录位置,下一次请求在 continuation-token 携带该令牌继续查询下一组记录
    CommonPrefixes 当查询条件指定了 Delimter 时,Prefix 后面第一次出现 Delimiter 的位置(包括 Delimiter)之前的内容作为 CommonPrefix,当有多个对象具有相同的 CommonPrefix 时,只返回一条 CommonPrefix,计数一次,对象信息不返回
    Prefix CommonPrefix 包含的前缀,属于 ListBucketResult.CommonPrefixes
    Contents 包含对象的元数据
    Key 对象的名称,属于 ListBucketResult.Contents
    LastModified 创建对象的时间,属于 ListBucketResult.Contents
    ETag 对象的 MD5 值,属于 ListBucketResult.Contents
    Size 对象的大小,单位为字节,属于 ListBucketResult.Contents
    Owner 存储桶的所有者,属于 ListBucketResult.Contents
    ID 存储桶所有者的 ID,属于 ListBucketResult.Contents.Owner
    DisplayName 桶所有者的名字,属于 ListBucketResult.Contents.Owner

    示例

    • 不携带查询条件,查询存储桶内所有记录

      GET /bucketname?list-type=2 HTTP/1.1
      Host: ip:port
      Date: Sat, 17 Aug 2019 17:51:00 GMT
      Authorization: authorization string
      

      查询结果如下:

      <ListBucketResult>
          <Name>bucketname</Name>
          <Prefix/>
          <Marker/>
          <KeyCount>205</KeyCount>
          <MaxKeys>1000</MaxKeys>
          <IsTruncated>false</IsTruncated>
          <Contents>
              <Key>my-image.jpg</Key>
              <LastModified>2019-08-12T17:50:30.000Z</LastModified>
              <ETag>&quot;fba9dede5f27731c9771645a39863328&quot;</ETag>
              <Size>434234</Size>
              <Owner>
                  <ID>125664</ID>
                  <DisplayName>username</DisplayName>
              </Owner>
          </Contents>
          <Contents>
             ...
          </Contents>
          ...
      </ListBucketResult>
      
    • 指定 prefix 为 N,起始位置为 Ned,并只返回 100 条记录

      GET /mybucket?list-type=2&prefix=N&start-after=Ned&max-keys=100 HTTP/1.1
      Host: iP:port
      Date: Sat, 17 Aug 2019 17:45:00 GMT
      Authorization: authorization string
      

      查询结果如下,实际查询到两条符合条件的记录:

      <ListBucketResult>
        <Name>mybucket</Name>
        <Prefix>N</Prefix>
        <Marker>Ned</Marker>
        <KeyCount>2</KeyCount>
        <MaxKeys>100</MaxKeys>
        <IsTruncated>false</IsTruncated>
        <Contents>
          <Key>Nelson</Key>
          <LastModified>2019-08-12T12:00:00.000Z</LastModified>
          <ETag>&quot;828ef3fdfa96f00ad9f27c383fc9ac7f&quot;</ETag>
          <Size>5</Size>
          <Owner>
            <ID>125664</ID>
            <DisplayName>username</DisplayName>
           </Owner>
        </Contents>
        <Contents>
          <Key>Neo</Key>
          <LastModified>2019-08-12T12:01:00.000Z</LastModified>
          <ETag>&quot;828ef3fdfa96f00ad9f27c383fc9ac7f&quot;</ETag>
          <Size>4</Size>
           <Owner>
            <ID>125664</ID>
            <DisplayName>username</DisplayName>
          </Owner>
       </Contents>
      </ListBucketResult>
      
    • 桶内已经有如下对象

      sample.jpg
      photos/2006/January/sample.jpg
      photos/2006/February/sample2.jpg
      photos/2006/February/sample3.jpg
      photos/2006/February/sample4.jpg
      

      本次请求携带分隔符/

      GET /mybucket-2?list-type=2&delimiter=/ HTTP/1.1
      Host: ip:port
      Date: date
      Authorization: authorization string
      

      查询结果如下:

      <ListBucketResult>
        <Name>mybucket-2</Name>
        <Prefix/>
        <Marker/>
        <KeyCount>2</KeyCount>
        <MaxKeys>1000</MaxKeys>
        <Delimiter>/</Delimiter>
        <IsTruncated>false</IsTruncated>
        <Contents>
          <Key>sample.jpg</Key>
          <LastModified>2019-08-12T12:01:00.000Z</LastModified>
          <ETag>&quot;bf1d737a4d46a19f3bced6905cc8b902&quot;</ETag>
          <Size>142863</Size>
          <Owner>
            <ID>canonical-user-id</ID>
            <DisplayName>display-name</DisplayName>
          </Owner>
        </Contents>
        <CommonPrefixes>
          <Prefix>photos/</Prefix>
        </CommonPrefixes>
      </ListBucketResult>
      

    GET Bucket Object versions

    查询桶内对象的所有版本

    请求语法

    GET /bucketname?versions HTTP/1.1
    Host: ip:port
    Date: date
    Authorization: authorization string
    

    请求参数

    参数名 说明
    prefix 前缀,返回具有前缀的对象列表,类型为 String
    delimiter 分隔符,如果指定 prefix,则 prefix 后第一次出现的分隔符之间包含相同字符串的所有键都被分组在一个 CommonPrefixes;如果未指定 prefix 参数,则子字符串从对象名称的开头开始,类型为 String
    key-marker 指定在存储桶中列出对象要开始的键,返回对象键按照 UTF-8 二进制顺序从该标记后的键开始按顺序排列,类型为 String
    version-id-marker 指定起始位置的 version,仅在指定了 key-marker 的情况下有效
    max-keys 设置响应中返回的最大键数,默认值 1000,如果要查询返回数量少于 1000,可以填写其他值,填写超过 1000 的值,仍然按照 1000 条返回,类型为 String
    encoding-type 响应结果编码类型,只支持 url,由于对象名称可以包含任意字符,但是 XML 对某些特别的字符无法解析,所以需要对响应中的对象名称进行编码

    结果解析

    查询结果以 XML 形式在响应消息体中显示。

    元素 说明
    ListVersionsResult 包含存储桶信息、查询条件和查询的对象版本信息
    Name 存储桶名称
    Prefix 查询的 prefix 条件
    Delimiter 查询的 delimiter 条件
    KeyMarker 查询的 key-marker 条件
    VersionIDMarker 查询的 version-id-marker 条件
    MaxKeys 查询的 maxKeys 条件
    Encoding-Type 查询的 encoding-type 条件
    IsTruncated 如果该字段为 true,说明由于条数限制,本次没有查询完所有符合条件的结果,可以使用 NextMarker 作为下一次查询的 Marker 条件继续查询剩余内容
    NextKeyMarker 当 IsTruncated 为 true 时,NextKeyMarker 记录本次返回的最后一个对象或者 CommonPrefix
    NextVersionIdMarker 当 IsTruncated 为 true 时,NextVersionIdMarker 记录本次返回的最后一条记录的 version
    CommonPrefixes 当查询条件指定了 Delimter 时,Prefix 后面第一次出现 Delimiter 的位置(包括 Delimiter)之前的内容作为 CommonPrefix,当有多个对象具有相同的 CommonPrefix 时,只返回一条 CommonPrefix,计数一次,对象信息不返回
    Prefix CommonPrefix 包含的前缀,属于 ListVersionsResult.CommonPrefixes
    Version 包含对象版本的元数据
    DeleteMarker 包含删除标记
    Key 对象的名称,属于 ListVersionsResult.Version
    VersionId 对象的版本号,属于 ListVersionsResult.Version
    IsLatest 是否是最新版本,属于 ListVersionsResult.Version
    LastModified 创建对象的时间,属于 ListVersionsResult.Version
    ETag 对象的 MD5 值,属于 ListVersionsResult.Version
    Size 对象的大小,单位为字节,属于 ListVersionsResult.Version
    Owner 存储桶的所有者,属于 ListVersionsResult.Version
    ID 存储桶所有者的 ID,属于 ListVersionsResult.Version.Owner
    DisplayName 桶所有者的名字,属于 ListVersionsResult.Version.Owner

    示例

    • 查询存储桶内所有版本

      GET /bucketname?versions HTTP/1.1
      Host: ip:port
      Date: date
      Authorization: authorization string
      

      查询结果如下:

      <ListVersionsResult>
          <Name>bucket</Name>
          <Prefix>my</Prefix>
          <KeyMarker/>
          <VersionIdMarker/>
          <MaxKeys>1000</MaxKeys>
          <IsTruncated>false</IsTruncated>
          <Version>
              <Key>my-image.jpg</Key>
              <VersionId>234</VersionId>
              <IsLatest>true</IsLatest>
              <LastModified>2019-08-16T17:50:32.000Z</LastModified>
              <ETag>&quot;fba9dede5f27731c9771645a39863328&quot;</ETag>
              <Size>434234</Size>
              <Owner>
                  <ID>125664</ID>
                  <DisplayName>username</DisplayName>
              </Owner>
          </Version>
          <DeleteMarker>
              <Key>my-second-image.jpg</Key>
              <VersionId>55566666</VersionId>
              <IsLatest>true</IsLatest>
              <LastModified>2019-08-16T17:50:31.000Z</LastModified>
              <Owner>
                  <ID>125664</ID>
                  <DisplayName>username</DisplayName>
              </Owner>
          </DeleteMarker>
          <Version>
              <Key>my-second-image.jpg</Key>
              <VersionId>45667</VersionId>
              <IsLatest>false</IsLatest>
              <LastModified>2019-08-16T17:50:30.000Z</LastModified>
              <ETag>&quot;9b2cf535f27731c974343645a3985328&quot;</ETag>
              <Size>166434</Size>
              <Owner>
                  <ID>125664</ID>
                  <DisplayName>username</DisplayName>
              </Owner>
          </Version>
      </ListVersionsResult>
      
    • 携带分隔符/进行查询

      GET /mybucket-2?versions&delimiter=/ HTTP/1.1
      Host: ip:port
      Date: date
      Authorization: authorization string
      

      响应结果如下:

      <ListVersionsResult>
        <Name>mvbucketwithversionon1</Name>
        <Prefix/>
        <KeyMarker/>
        <VersionIdMarker/>
        <MaxKeys>1000</MaxKeys>
        <Delimiter>/</Delimiter>
        <IsTruncated>false</IsTruncated>
        <Version>
          <Key>Sample.jpg</Key>
          <VersionId>toxMzQlBsGyGCz1YuMWMp90cdXLzqOCH</VersionId>
          <IsLatest>true</IsLatest>
          <LastModified>2019-02-02T18:46:20.000Z</LastModified>
          <ETag>&quot;3305f2cfc46c0f04559748bb039d69ae&quot;</ETag>
          <Size>3191</Size>
          <Owner>
              <ID>125664</ID>
              <DisplayName>username</DisplayName>
          </Owner>
        </Version>
        <CommonPrefixes>
          <Prefix>photos/</Prefix>
        </CommonPrefixes>
        <CommonPrefixes>
          <Prefix>videos/</Prefix>
        </CommonPrefixes>
      </ListVersionsResult>
      

    List Multipart Uploads

    查询桶内所有已初始化未完成的分段上传请求

    请求语法

    GET /bucketname?uploads HTTP/1.1
    Host: ip:port
    Date: Date
    Authorization: authorization string
    

    请求参数

    参数 说明
    prefix 前缀,返回具有前缀的对象列表,类型为 String
    delimiter 分隔符,如果指定 prefix,则 prefix 后第一次出现的分隔符之间包含相同字符串的所有键都被分组在一个 CommonPrefixes;如果未指定 prefix 参数,则子字符串从对象名称的开头开始,类型为 String
    key-marker 指定在存储桶中列出对象要开始的键,返回对象键按照 UTF-8 二进制顺序从该标记后的键开始按顺序排列,类型为 String
    upload-id-marker 指定起始位置的 uploadId,仅在指定了 key-marker 的情况下有效
    max-uploads 设置响应中返回的最大键数,默认值 1000,如果要查询返回数量少于 1000,可以填写其他值,填写超过 1000 的值,仍然按照 1000 条返回,类型为 String
    encoding-type 对响应内容进行的编码方法,只支持 url,由于对象名称可以包含任意字符,但是 XML 对某些特别的字符无法解析,所以需要对响应中的对象名称进行编码

    结果解析

    查询结果在响应消息体中以 XML 形式体现。

    元素 说明
    ListMultipartUploadsResult 包含桶信息、查询条件和未完成的分段上传信息
    Bucket 存储桶名称
    Prefix 查询的 prefix 条件
    Delimiter 查询的 delimiter 条件
    KeyMarker 查询的 key-marker 条件
    UploadIdMarker 查询的 upload-id-marker 条件
    MaxUploads 查询的 maxUploads 条件
    Encoding-Type 查询的 encoding-type 条件
    IsTruncated 如果该字段为 true,说明由于条数限制,本次没有查询完所有符合条件的结果,可以使用 NextMarker 作为下一次查询的 Marker 条件继续查询剩余内容
    NextKeyMarker 当 IsTruncated 为 true 时,NextKeyMarker 记录本次返回的最后一个对象或者 CommonPrefix
    NextUploadIdMarker 当 IsTruncated 为 true 时,NextUploadIdMarker 记录本次返回的最后一条记录的 uploadId
    CommonPrefixes 当查询条件指定了 Delimter 时,Prefix 后面第一次出现 Delimiter 的位置(包括 Delimiter)之前的内容作为 CommonPrefix,当有多个对象具有相同的 CommonPrefix 时,只返回一条 CommonPrefix,计数一次,对象信息不返回
    Prefix CommonPrefix 包含的前缀,属于 ListMultipartUploadsResult.CommonPrefixes
    Upload 包含分段上传信息
    Key 对象的名称,属于 ListMultipartUploadsResult.Upload
    UploadId 分段上传的 uploadId,属于 ListMultipartUploadsResult.Upload
    Initiated 分段上传的的初始化时间,属于 ListMultipartUploadsResult.Upload
    Owner 存储桶的所有者,属于 ListMultipartUploadsResult.Upload
    ID 存储桶所有者的 ID,属于 ListMultipartUploadsResult.Upload.Owner
    DisplayName 桶所有者的名字,属于 ListMultipartUploadsResult.Upload.Owner

    示例

    查询 uploads,携带分隔符/

    GET /example-bucket?uploads&delimiter=/ HTTP/1.1
    Host: ip:port
    Date: Sat, 17 Aug 2019 20:34:56 GMT
    Authorization: authorization string
    

    查询结果如下:

    <ListMultipartUploadsResult>
      <Bucket>example-bucket</Bucket>
      <KeyMarker/>
      <UploadIdMarker/>
      <NextKeyMarker>sample.jpg</NextKeyMarker>
      <NextUploadIdMarker>4444</NextUploadIdMarker>
      <Delimiter>/</Delimiter>
      <Prefix/>
      <MaxUploads>1000</MaxUploads>
      <IsTruncated>false</IsTruncated>
      <Upload>
        <Key>sample.jpg</Key>
        <UploadId>4444</UploadId>
        <Initiator>
          <ID>2234</ID>
          <DisplayName>s3-nickname</DisplayName>
        </Initiator>
        <Owner>
          <ID>2234</ID>
          <DisplayName>s3-nickname</DisplayName>
        </Owner>
        <Initiated>2019-08-16T19:24:17.000Z</Initiated>
      </Upload>
      <CommonPrefixes>
        <Prefix>photos/</Prefix>
      </CommonPrefixes>
      <CommonPrefixes>
        <Prefix>videos/</Prefix>
      </CommonPrefixes>
    </ListMultipartUploadsResult>
    

    Create Region

    增加一个区域或更新区域配置

    Note:

    用户创建区域时可对区域内数据存储位置进行配置,即指定集合空间的生成方式,生成方式分为指定模式和自动创建模式。不能够同时指定两种模式,更新区域配置是也不能修改模式,更新区域配置只能够修改自动创建模式下的集合空间生成规则。

    请求语法

    POST /region/?Action=CreateRegion&RegionName={regionname} HTTP/1.1
    Host: ip:port
    Content-Length: length
    Date: date
    Authorization: authorization string
    
    <RegionConfiguration>
      <DataCSShardingType>year</DataCSShardingType>
      <DataCLShardingType>month</DataCLShardingType>
      <DataDomain>domain1</DataDomain>
      <MetaDomain>domain2</MetaDomain>
    </RegionConfiguration>
    

    参数说明

    参数名 说明
    Action 固定为 CreateRegion,表示该操作为创建一个区域
    RegionName 指定区域名称

    请求元素

    用户可以在请求消息体中使用 XML 形式指定区域的配置。

    元素 说明
    RegionConfiguration 包含区域配置内容
    DataCSShardingType 对象数据集合空间的生成规则,按照设定的时间生成指定的集合空间,类型为 String,默认值为 year,有效值为 year
    DataCLShardingType 对象数据集合的生成规则,按照设定的时间生成指定的集合,类型为 String,默认值为 quarter,有效值为 year/quarter/month
    DataCSRange 对象数据集合的生成规则,在设定时间段内能够生成的集合空间数量,类型为 Int
    DataDomain 对象数据集合空间所属域,域必须已在 SequoiaDB 中定义,如果不填写域名称,则对象数据集合空间建立在系统域上,类型为 String
    DataLobPageSize 对象数据集合空间的 LobPageSize,默认值为 262144,有效值为 0,4096,8192,16384,32768,65536,131072,262144,524288 之一,0 表示选择默认值
    DataReplSize 对象集合的ReplSize,写操作同步的副本数,默认值为 -1,有效值为 -1, 0, 1-7
    MetaDomain 元数据集合空间所属域,域必须已在 SequoiaDB 中定义,若不填写则元数据集合空间建在系统域上,类型为 String
    DataLocation 指定模式为对象数据的集合空间.集合名称,如 CS.CL,类型为 String
    MetaLocation 指定模式为元数据的集合空间.集合名称,如 CS.CL,类型为 String
    MetaHisLocation 指定模式为历史元数据的集合空间.集合名称,如 CS.CL,类型 String

    示例

    创建区域的请求,指定对象数据集合空间和元数据集合空间的域,指定对象数据集合空间和对象数据集合的生成规则

    POST /region/?Action=CreateRegion&RegionName=region1 HTTP/1.1
    Host: ip:port
    Content-Length: length
    Date: date
    Authorization: authorization string
    
    <RegionConfiguration>
      <DataCSShardingType>year</DataCSShardingType>
      <DataCLShardingType>month</DataCLShardingType>
      <DataDomain>domain1</DataDomain>
      <MetaDomain>domain2</MetaDomain>
    </RegionConfiguration>
    

    响应结果如下:

    HTTP/1.1 200 OK
    Date: date
    Content-Length: 0
    

    GetRegion

    获取一个区域的配置

    请求语法

    POST /region/?Action=GetRegion&RegionName={regionname} HTTP/1.1 
    Host: ip:port
    Date: date 
    Authorization: authorization string 
    

    参数说明

    参数名 说明
    Action 固定为 GetRegion,表示该操作为删除一个区域
    RegionName 指定区域名称

    示例

    查询一个区域的配置信息

    POST /region/?Action=GetRegion&RegionName=region1 HTTP/1.1
    Host: ip:port
    Date: Wed, 12 Oct 2009 17:50:00 GMT
    Authorization: authorization string
    

    响应结果如下:

    <RegionConfiguration>
      <Name>region1</Name>
      <DataCSShardingType>year</DataCSShardingType>
      <DataCLShardingType>month</DataCLShardingType>
      <DataCSRange>1</DataCSRange>
      <DataDomain>domain1</DataDomain>
      <MetaDomain>domain2</MetaDomain>
      <DataLobPageSize>262144</DataLobPageSize>
      <DataReplSize>-1</DataReplSize>
      <DataLocation/>
      <MetaLocation/>
      <MetaHisLocation/>
      <Buckets>
        <Bucket>bucketname1</Bucket>
        <Bucket>bucketname2</Bucket>
      </Buckets>
    </RegionConfiguration>
    
    

    DeleteRegion

    删除一个区域

    请求语法

    POST /region/?Action=DeleteRegion&RegionName={regionname} HTTP/1.1
    Host: ip:port
    Date: date 
    Authorization: authorization string
    

    参数说明

    参数名 说明
    Action 固定为 DeleteRegion,表示该操作为删除一个区域
    RegionName 指定区域名称

    示例

    删除一个区域的请求

    POST /region/?Action=DeleteRegion&RegionName=region1 HTTP/1.1
    Host: ip:port
    Date: date 
    Authorization: authorization string
    

    响应结果如下:

    HTTP/1.1 204 No Content 
    Date: date 
    

    ListRegions

    查询区域列表,可以查询当前系统中所有区域名称

    请求语法

    POST /region/?Action=ListRegions HTTP/1.1 
    Host: ip:port
    Date: date 
    Authorization: authorization string 
    

    参数说明

    参数名 说明
    Action 固定为 ListRegions,表示该操作为查询区域列表

    结果解析

    查询结果以 XML 形式在响应消息头中显示。

    元素 说明
    ListAllRegionsResult 包含一个到多个 Region
    Region 区域名称

    示例

    查询区域列表的响应结果如下:

    <ListAllRegionsResult>
      <Region>region1</Region>
      <Region>region1</Region>
      <Region>region1</Region>
    </ListAllRegionsResult>
    

    HeadRegion

    查询区域是否存在

    请求语法

    POST /region/?Action=HeadRegion&RegionName={regionname} HTTP/1.1
    Host: ip:port
    Date: date 
    Authorization: authorization string 
    

    示例

    响应结果如下:

    HTTP/1.1 200 OK
    Date: date
    

    Create User

    创建用户

    Note:

    该操作需管理员用户权限,系统默认生成一个管理员用户,可用该用户创建其他用户。

    请求语法

    POST /users/?Action=CreateUser&UserName=username&role=admin HTTP/1.1 
    Host: ip:port
    Date: date 
    Authorization: authorization string
    

    参数说明

    参数名 说明
    Action 固定为 CreateUser,表示该操作为创建一个用户
    UserName 指定用户名称
    Role 指定用户的角色,可选管理员 admin 用户或普通 normal 用户,管理员用户可以管理用户也可以使用 S3 业务,普通用户可以使用 S3 业务但不能管理用户

    结果解析

    创建用户成功后,会收到 AccessKeys,AccessKeys 用于访问 SequoiaS3 系统的用户验证。

    元素 说明
    AccessKeys 包含用户 Key 值
    AccessKeyID 用户的 Access Key ID,代表用户身份
    SecretAccessKey 新用户的 Secret Access Key 类似密码,用于计算签名,和 Access Key ID 一起在请求消息中携带,用来验证用户身份

    示例

    创建用户后,响应结果如下:

    HTTP/1.1 200 OK
    Date: Wed, 01 Mar  2006 12:00:00 GMT
    
    <AccessKeys>
      <AccessKeyID>AKIAIC6UQBTBIW7THT5A</AccessKeyID>
      <SecretAccessKey>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</SecretAccessKey>
    </AccessKeys>
    

    Create AccessKey

    更新用户的访问密钥

    Note:

    该操作需要管理员用户权限。生成新的密钥之后,旧密钥失效。

    请求语法

    POST /users/?Action=CreateAccessKey&UserName=username HTTP/1.1 
    Host: ip:port
    Date: date 
    Authorization: authorization string
    

    参数说明

    参数名 说明
    Action 固定为 CreateAccessKey,表示该操作为更新 AccessKeys
    UserName 指定用户名称

    示例

    更新密钥后,响应结果如下:

    HTTP/1.1 200 OK
    Date: Wed, 01 Mar  2006 12:00:00 GMT
    
    <AccessKeys>
      <AccessKeyID>AKIAIC6UQBCDGW7TH35T</AccessKeyID>
      <SecretAccessKey>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</SecretAccessKey>
    </AccessKeys>
    

    Delete User

    删除一个用户

    Note:

    • 该操作需要管理员用户权限。
    • 当该用户还有桶未清理时,不允许删除用户。
    • 当请求携带了 Force 标识时,可以强制删除未清理桶的用户,并将该用户拥有的桶以及桶内对象全部清理。

    请求语法

    POST /users/?Action=DeleteUser&UserName=username HTTP/1.1 
    Host: ip:port
    Date: date 
    Authorization: authorization string
    

    参数说明

    参数名 说明
    Action 固定为 DeleteUser,表示该操作为删除用户
    UserName 指定用户名称
    Force 强制删除标记,当请求携带 Force 参数且值为 true 时删除用户,并清理该用户拥有的桶及桶内对象

    示例

    • 删除用户

      POST /users/?Action=DeleteUser&UserName=user1 HTTP/1.1 
      Host: ip:port
      Date: date 
      Authorization: authorization string
      

      响应结果如下:

      HTTP/1.1 200 OK
      Date: date
      
    • 强制删除用户

      POST/users/?Action=DeleteUser&UserName=username&Force=true HTTP/1.1 
      Host: ip:port
      Date: date 
      Authorization: authorization string
      

      响应结果如下:

      HTTP/1.1 200 OK
      Date: date
      

    Get AccessKey

    获取用户的访问密钥

    Note:

    该操作需要管理员用户权限。

    请求语法

    POST /users/?Action=GetAccessKey&UserName=username HTTP/1.1 
    Host: ip:port
    Date: date 
    Authorization: authorization string
    

    参数说明

    参数名 说明
    Action 固定为 GetAccessKey,表示该操作为获取用户的访问密钥
    UserName 指定用户名称

    示例

    获取 user1 的访问密钥请求

    POST /users/?Action=GetAccessKey&UserName=user1 HTTP/1.1 
    Host: ip:port
    Date: date 
    Authorization: authorization string
    

    响应结果如下:

    HTTP/1.1 200 OK
    Date: date
    
    <AccessKeys>
      <AccessKeyID>AKIAIC6UQBTBIW7THT5A</AccessKeyID>
      <SecretAccessKey>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</SecretAccessKey>
    </AccessKeys>
    

    点击巨杉数据库官网文档中心了解更多。

    展开全文
  • 重新解析REST Service

    2019-09-16 11:56:19
    三种流行 web 服务的架构  Web 服务是一种面向服务的架构的技术,通过标准的 Web 协议提供服务,目的是保证不同平台的应用服务可以互操作。根据 W3C 的定义,Web 服务(Web ...网络服务通常是许多应用程序接口...
  • 重要概念2.REST 接口规范1)动作2)路径(接口命名)3)过滤信息(Filtering)4)状态码(Status Codes)3.HATEOAS RestFul API RESTful API 是每个程序员都应该了解并掌握的基本知识,我们在开发过程中设计 API 的时候...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 440
精华内容 176
关键字:

解析rest接口