1. 程式人生 > >SWIFT API 使用文件

SWIFT API 使用文件

1、背景知識

OpenStack Object Storage (Swift) 是用來建立冗餘的、可擴充套件的物件儲存(引擎)的開源軟體。 swift使用標準化的伺服器儲存 PB 級的訪問資料。它並不是檔案系統或者實時的資料儲存系統 ,而是一個用於儲存永久型別的靜態資料的長期儲存系統 ,這些資料可以檢索、調整、必要時進行更新。最適合儲存的資料型別的首要例子是虛擬機器映象,圖片儲存,郵件儲存,存檔備份。因為沒有中心單元或者主控結點,swift提供了更強的擴充套件性、冗餘和永續性。

OpenStack Object Storage (Swift)使用RESTful API對外提供服務,通過HTTP協議來進行資料間的互動,資料存放在request中。Swift支援單個無檔案最大5G,大於5G的檔案在客戶端切分上傳,並上傳manifest檔案。

圖 1-1 SWIFT資料互動

2、API使用描述

1)獲取token

介面名稱:

獲取一個token ID

介面定義:

curl -X POST -d '
{"auth":
        {"tenantName": “{租戶名}”,
         "passwordCredentials": {
            "username": “{使用者名稱}”,
            "password": “{使用者密碼}”}
        }
 }' 
-H "Content-type: application/json" http://localhost:35357/v2.0/tokens | python -mjson.tool

傳入引數定義:

{"tenantName": “{租戶名}”,
     "passwordCredentials": {
     "username": “{使用者名稱}”,
     "password": “{使用者密碼}”}
}

返回結果:

返回的結果比較冗長,請自己在實驗環境192.168.0.191上操作,並觀察。而需要注意的是其中token的結果:
"token": {
     "expires": "2012-09-27T13:41:15Z", 
            "id": "d8444bd1ab8140ceb136d748eef86647", 
            "tenant": {
                "description": null, 
                "enabled": true, 
                "id": "e8b18580e5b44cb79b10bd0f7a03bbdc", 
                "name": "admin"
            }
        }
在以下的介面操作中,都需要從該token中獲取它的id,以及其對應租戶(tenant)的id。

協議:

http

示例:

curl -X POST -d '{"auth": {"tenantName": "admin", "passwordCredentials":{"username": "admin", "password": "pengchao"}}}' -H "Content-type: application/json" http://192.168.0.191:35357/v2.0/tokens | python -mjson.tool

2)容器列表

介面名稱:

獲取容器列表

介面定義:

curl -s http://localhost:8080/v1/AUTH_{Tenant_id} \
     -X GET \
     -H "X-Auth-Token: { Token_id}"

傳入引數定義:

Tenant_id:租戶id
Token_id:租戶對應的token的id

返回結果:

協議:

http

示例:

curl -s http://192.168.0.191:8080/v1/AUTH_e8b18580e5b44cb79b10bd0f7a03bbdc -X GET -H "X-Auth-Token: 22ec6a37ed6b4b23a435e6b9050f21a4"

3)建立容器

介面名稱:

建立容器

介面定義:

curl -s http://localhost:8080/v1/AUTH_{Tenant_id}/{Container_name} \
     -X PUT \
     -H "X-Auth-Token: { Token_id}"

傳入引數定義:

Tenant_id:租戶id
Container_name: 所建立的容器名稱
Token_id:租戶對應的token的id

返回結果:

如果建立成功,返回“201 Created”

協議:

http

示例:

curl -s http://192.168.0.191:8080/v1/AUTH_e8b18580e5b44cb79b10bd0f7a03bbdc -X GET -H "X-Auth-Token: 22ec6a37ed6b4b23a435e6b9050f21a4"

4)刪除容器

介面名稱:

刪除容器

介面定義:

curl -s http://localhost:8080/v1/AUTH_{Tenant_id}/{Container_name} \
     -X DELETE \
     -H "X-Auth-Token: { Token_id}"

傳入引數定義:

Tenant_id:租戶id
Container_name: 所刪除的容器名稱
Token_id:租戶對應的token的id

返回結果:

如果刪除成功,什麼也沒返回。可以使用列出容器的api驗證。

協議:

http

示例:

curl -s http://192.168.0.191:8080/v1/AUTH_e8b18580e5b44cb79b10bd0f7a03bbdc/my_container -X DELETE -H "X-Auth-Token: 22ec6a37ed6b4b23a435e6b9050f21a4"

5)列出物件

介面名稱:

列出容器物件

介面定義:

curl -s http://localhost:8080/v1/AUTH_{Tenant_id}/{Container_name}[?parm=value] \
     -X GET \
     -H "X-Auth-Token: { Token_id}"

傳入引數定義:

Tenant_id:租戶id
Container_name: 容器名稱
Token_id:租戶對應的token的id

返回結果:

協議:

http

示例:

curl -s http192.168.0.191:8080/v1/AUTH_AUTH_e8b18580e5b44cb79b10bd0f7a03bbdc/my_container?format=json -X GET -H "X-Auth-Token: 22ec6a37ed6b4b23a435e6b9050f21a4" | python -mjson.tool

6)建立物件

介面名稱:

建立物件

介面定義:

curl –X PUT -i \
    -H "X-Auth-Token: { Token_id}" \
    -T {obj_path} \
    http://localhost:8080/v1/AUTH_{Tenant_id}/{Container_name}/{obj_name}

傳入引數定義:

Tenant_id:租戶id
Obj_path:物件的完整路徑
obj_name:物件名稱
Container_name: 容器名稱
Token_id:租戶對應的token的id

返回結果:

<html>
 <head>
  <title>201 Created</title>
 </head>
 <body>
  <h1>201 Created</h1>
  <br /><br />
 </body>
</html>

協議:

http

示例:

curl -X PUT -i -H "X-Auth-Token: 22ec6a37ed6b4b23a435e6b9050f21a4" -T ufw.log  http://192.168.0.191:8080/v1/AUTH_e8b18580e5b44cb79b10bd0f7a03bbdc/my_container/ufw.log

7)刪除物件

介面名稱:

刪除物件

介面定義:

curl -s http://localhost:8080/v1/AUTH_{Tenant_id}/{Container_id}/{object_name} \
     -X DELETE \
     -H "X-Auth-Token: { Token_id}"

傳入引數定義:

Tenant_id:租戶id
Obj_name:物件名稱
Container_name: 所刪除的容器名稱
Token_id:租戶對應的token的id

返回結果:

無返回

協議:

http

示例:

curl -s http://192.168.0.191:8080/v1/AUTH_e8b18580e5b44cb79b10bd0f7a03bbdc/my_container/history24 -X DELETE -H "X-Auth-Token: 22ec6a37ed6b4b23a435e6b9050f21a4"

3、例項:使用Python實現

3.1、前提條件

由於資料是存放在request中,為了方便,先構造request,使用python(urllib2)程式碼實現如下:

@param:server_api  根據需要定義的rest url

@param:autho_token 管理員token

@param:send_data 需要傳送的資料

@param:method 定義的方法【GET、PUT、DELETE、POST】,預設是POST

def get_server_request(server_api=None, auth_token=None, send_data=None, method=None):
    if not server_api:
        return None
    server_request = urllib2.Request(server_api)
    if not server_request:
        return None
    server_request.add_header('Content-Type', 'application/json;charset=utf8')
    server_request.add_header('Accept', 'application/json')
    server_request.add_header('User-Agent', 'python-mikeyp')
    if auth_token:
        server_request.add_header('X-Auth-Token', auth_token)
    if send_data:
        server_request.add_data(send_data)
    if method:
        server_request.get_method = lambda: method
    return server_request

1)獲取keystone認證,進行任何CURD操作,都需要從keystone中獲取管理員的租戶ID和管理員的token,用Python程式碼實現如下:

@param:user_name 管理員

@param:password 管理員密碼

@param:tenant_name 管理員對應的租戶名稱

def get_keystone_token(user_name=None, password=None, tenant_name=None):
    server_api = get_Keystone_Endpoint() + 'tokens'
    send_data = None
    if user_name and password and tenant_name:
        send_data = {'auth': {'tenantName': tenant_name, 'passwordCredentials': \
                           {'username': user_name, 'password': password}}}
    if not send_data:
        return None
    server_request = get_server_request(server_api, None, json.dumps(send_data), None)
    if not server_request:
        return None
    try:
        server_response = urllib2.urlopen(server_request)
        receiver_data = server_response.read()
        if receiver_data:
            data = json.loads(receiver_data)
            token = data['access']['token']['id']
            tenant_id = data['access']['token']['tenant']['id']
            return (tenant_id, token)
        else:
            return None
    except Exception:
        return None

3.2、主要功能實現

以下的程式碼都能單獨使用,實現的關鍵在於對request操作,實現如下:

server_response = urllib2.urlopen(server_request)

1)列出容器

'''列出swift容器列表

@param:

@type:

@return:"count","bytes","name"

@rtype:json

'''

def Container_list():
    server_api = None
    if tenant_id:
        server_api = untils.get_Swift_Endpoint() + tenant_id
    if not server_api:
        api_logger.error('Container_list server_api: %s.' % server_api)
        return untils.rest_result()
    try:
        server_request = untils.get_server_request(server_api, token)
        api_logger.info('Container_list server_request: %s.' % server_request)
        if not server_request:
            return untils.rest_result()
        server_response = urllib2.urlopen(server_request)
        api_logger.info('Container_list server_response: %s.' % server_response)
        receiver_data = server_response.read()
        if receiver_data:
            data = json.loads(receiver_data)
            con_list = []
            for d in data:
                con_list.append(d['name'])
            return con_list
        return untils.rest_result(True, False)
    except Exception:
        api_logger.critical('Container_list function caught an exception.')
        return untils.rest_result(False, True)

2)建立容器                          

'''建立一個容器

@param:

@type:

@return:"count","bytes","name"

@rtype:json

'''

def Container_create(name=None):
    server_api = None
    if tenant_id:
        server_api = untils.get_Swift_Endpoint() + tenant_id + "/" + name
    if not server_api:
        api_logger.error('Container_create server_api: %s.' % server_api)
        return untils.rest_result()
    try:
        server_request = untils.get_server_request(server_api, token, None, "PUT")
        api_logger.info('Container_create server_request: %s.' % server_request)
        if not server_request:
            return untils.rest_result()
        server_response = urllib2.urlopen(server_request)
        api_logger.info('Container_create server_response: %s.' % server_response)
        receiver_data = server_response.read()
        if receiver_data:
            data = json.dumps(receiver_data)
            return untils.rest_result(True, False, data)
        return untils.rest_result(True, False)
    except Exception:
        api_logger.critical('Container_create function caught an exception.')
        return untils.rest_result(False, True)

3)刪除容器

'''刪除一個容器

@param:

@type:

@return:"count","bytes","name"

@rtype:json

'''

def Container_delete(con_name=None):
    if con_name not in Container_list():
        return untils.rest_result()
    obj_list= Object_list(con_name)[0]
    if obj_list:
        api_logger.info("the contaniner is not empty!")
        for obj in obj_list:
            Object_delete(con_name,obj)
    server_api = None
    if tenant_id:
        server_api = untils.get_Swift_Endpoint() + tenant_id + "/" + con_name
    if not server_api:
        api_logger.error('Container_delete server_api: %s.' % server_api)
        return untils.rest_result()
    try:
        server_request = untils.get_server_request(server_api, token, None, "DELETE")
        api_logger.info('Container_delete server_request: %s.' % server_request)
        if not server_request:
            return untils.rest_result()
        server_response = urllib2.urlopen(server_request)
        api_logger.info('Container_delete server_response: %s.' % server_response)
        receiver_data = server_response.read()
        if receiver_data:
            data = json.dumps(receiver_data)
            return untils.rest_result(True, False, data)
        return untils.rest_result(True, False)
    except Exception:
        api_logger.critical('Container_delete function caught an exception.')
        return untils.rest_result(False, True)

4)列出物件

'''列出swift某容器的物件列表

@param container_name:容器名稱

@type:char

@return:"bytes","last_modified","hash","name","content_type"

@rtype:json

'''

def Object_list(container_name=None):
    server_api = None
    if tenant_id:
        server_api = untils.get_Swift_Endpoint() + tenant_id + "/" + container_name
    if not server_api:
        api_logger.error('Object_list server_api: %s.' % server_api)
        return untils.rest_result()
    try:
        server_request = untils.get_server_request(server_api, token)
        api_logger.info('Object_list server_request: %s.' % server_request)
        if not server_request:
            return untils.rest_result()
        server_response = urllib2.urlopen(server_request)
        api_logger.info('Object_list server_response: %s.' % server_response)
        receiver_data = server_response.read()
        if receiver_data:
            data = json.loads(receiver_data)
            c_l = []
            for d in data:
                c_l.append(d['name'])
            return untils.rest_result(True, False, c_l)
        return untils.rest_result(True, False)
    except Exception:
        api_logger.critical('Object_list function caught an exception.')
        return untils.rest_result(False, True)

5)上傳物件

'''在一個容器內建立、上傳一個物件

@param container_name:容器名稱

@param file_name:物件名稱

@type:char

@return:

@rtype:json

'''

def Object_upload(container_name=None, obj_path=None, obj_name=None):
    send_data = None
    obj_full_path = os.path.join(obj_path, obj_name)
    with open(obj_full_path) as obj:
        send_data = json.dumps(obj.read())
    server_api = None
    if tenant_id:
        server_api = untils.get_Swift_Endpoint() + tenant_id + "/" + container_name + "/" + obj_name
    if not server_api:
        api_logger.error('Object_upload server_api: %s.' % server_api)
        return untils.rest_result()
    try:
        server_request = untils.get_server_request(server_api, token, send_data, 'PUT')
        api_logger.info('Object_upload server_request: %s.' % server_request)
        if not server_request:
            return untils.rest_result()
        server_response = urllib2.urlopen(server_request)
        api_logger.info('Object_upload server_response: %s.' % server_response)
        receiver_data = server_response.read().strip()
        if receiver_data:
            data = json.dumps(receiver_data)
            return untils.rest_result(True, False, data)
        return untils.rest_result(True, False)        
    except Exception:
        api_logger.critical('Object_upload function caught an exception.')
        return untils.rest_result(False, True)

6)下載物件

'''從容器下載一個物件

@param container_name:容器名稱

@param file_name:物件名稱

@type:char

@return:

@rtype:json

'''

def Object_download(container_name=None, obj_path=None, obj_name=None):
    server_api = None
    if tenant_id:
        server_api = untils.get_Swift_Endpoint() + tenant_id + "/" + container_name + "/" + obj_name
    if not server_api:
        api_logger.error('Object_download server_api: %s.' % server_api)
        return untils.rest_result()
    try:
        server_request = untils.get_server_request(server_api, token)
        api_logger.info('Object_download server_request: %s.' % server_request)
        if not server_request:
            return untils.rest_result()
        server_response = urllib2.urlopen(server_request)
        api_logger.info('Object_download server_response: %s.' % server_response)
        receiver_data = server_response.read()
        if receiver_data:
            obj_full_path = os.path.join(obj_path, obj_name)
            with open(obj_full_path, "wb") as code:
                code.write(receiver_data)
        return untils.rest_result(True, False)
            
           

相關推薦

win32 api 和目錄管理

spa logs 當前 獲取 efi length ttr 重命名 turn BOOL DeleteFile ( LPCTSTR lpFileName ); //刪除文件 BOOL CopyFile ( LPCTSTR lpExistingFileN

用VSCode開發一個asp.net core2.0+angular5項目(5): Angular5+asp.net core 2.0 web api上傳

owb bus sed loaded runt ace created one 做了 第一部分: http://www.cnblogs.com/cgzl/p/8478993.html 第二部分: http://www.cnblogs.com/cgzl/p/8481825.

swagger2 離線 中心搭建 json swagger 自動生成api

最近找了一個自動生成api文件的工具swagger,相對swaggerEdit就不說了。個人比較懶,還是自動生成來的便捷,尤其是老專案,新專案在初期可能會維護,但是到了後期就很難保證了。所以,那些需要一些特殊配置說明的文件工具就不提了。 這篇文章主要是在swagger2 swagger UI的基

Laravel(PHP)使用Swagger生成API不完全指南 - 基本概念和環境搭建 - 簡書

在PHPer中,很多人聽說過Swagger,部分人知道Swagger是用來做API文件的,然而只有少數人真正知道怎麼正確使用Swagger,因為PHP界和Swagger相關的資料實在是太少了。所以鄙人斗膽一試,希望能以本文幫助到大家瞭解Swagger,從此告別成天用Word、Markdown折騰API文件的日

Swagger2構建強大的RESTful API實戰

一 點睛 RESTful API的重磅好夥伴Swagger2,它可以輕鬆的整合到Spring Boot中,並與Spring MVC程式配合組織出強大RESTful API文件。它既可以減少我們建立文件的工作量,同時說明內容又整合入實現程式碼中,讓維護文件和修改程式碼整合為一體,可以

phantomjs api

phantomjs實現了一個無介面的webkit瀏覽器。雖然沒有介面,但dom渲染、js執行、網路訪問、canvas/svg繪製等功能都很完備,在頁面抓取、頁面輸出、自動化測試等方面有廣泛的應用。 詳細文件 安裝 下載phantomjs(官方下載,下載失敗請訪問另一個下載點)。解壓到任意目錄,並將包含p

bluebird與原生Promise物件及bluebird模組的中文API

bluebird與原生Promise物件及bluebird模組的中文API文件  2016年06月15日     9392     宣告 https://itbilu.com/nodejs/np

snowboard快速生成api

snowboard快速生成api文件。作為介面文件最合適不過了。網上關於這方面的介紹不多,自己寫下,算是一個筆記,對他人來說是福利。下面是我研究學習的。希望對你有好處。 要看英文文件,https://github.com/bukalapak/snowboard 1,下載。我用下面的命令沒

mac Alfred+Dash快速查詢API

本文出自 http://blog.csdn.net/wyk304443164 dash 下載地址 備用地址 沒有破解,因為就幾秒的時間 Alfred 破解版 下載地址 你需要在下載完後開啟Alfred 然後不要關閉軟體,點選破解檔案,再重啟下Alfre

使用swaggo自動生成Restful API

Java使用Spring Boot寫Restful API時,可以在程式碼裡用註解來標識API,編譯為Jar包後,執行時Web應用可以直接託管API文件。具體的可以參考這篇文章:使用swagger來做API文件。 那麼golang繫有沒有類似的做法呢? 有是有的,只是沒有springfox的那麼方便就是了

使用sphinx快速為你python註釋生成API

sphinx簡介 sphinx是一種基於Python的文件工具,它可以令人輕鬆的撰寫出清晰且優美的文件,由Georg Brandl在BSD許可證下開發。新版的Python3文件就是由sphinx生成的,並且它已成為Python專案首選的文件工具,同時它對C/C++專案也有很好的支援。

026_生成自己專案的API

一、什麼是API   API即Application Programming Interface的首字母縮寫、應用程式程式設計介面。 二、常用的註釋標籤   在生成API之前我們需瞭解一下jdk為我們提供的幾個註釋標籤     @Author 作者     @versi

PopupWindow 使用詳解(一) 中文API 贈送 ListPopupWindow 中文 API

筆者數了數枕巾脫落的頭髮,發現了 Android 開發常用的類似於彈窗的懸浮視窗 大概是 PopupWindow 和 dialog。之前有還算具體的寫過關於 dialog 以及自定義 dialog 甚至是 dialogActivity 的相關筆記,即:Android 系統原生dialog使用

SpringBoot中使用Swagger生成RestFul規範API

j簡單介紹Swagger的作用: Swagger是為了描述一套標準的而且是和語言無關的REST API的規範。對於外部呼叫者來說,只需通過Swagger文件即可清楚Server端提供的服務,而不需去閱讀原始碼或介面文件說明。 官方網站為:http://swagger.io 中文網站:http

使用apidoc 生成Restful web Api

在專案開發過程中,總會牽扯到介面文件的設計與編寫,之前使用的都是office工具,寫一個文件,總也是不夠漂亮和直觀。好在git上的開源大神提供了生成文件的工具,so來介紹一下! 該工具是Nodejs的模組,請務必在使用前安裝好nodejs環境! 工具名稱:apiDoc Git地址:http

SpringBoot 使用 swagger 實現Rest Api

swagger 允許使用者在一個html5 web 頁面中,對API 進行文件化和互動 優點: 功能豐富 :支援多種註解,自動生成介面文件介面,支援在介面測試API介面功能; 及時更新 :開發過程中花一點寫註釋的時間,就可以及時的更新API文件,省心省力; 整合簡單 :通過新增pom依賴

Spring boot 整合 swagger生成api(轉換成markdown格式)

spring boot 整合 swagger 步驟 1. 匯入jar包 2. 新增配置類 3. 新增介面類 3. 啟動伺服器 4. 訪問UI頁面,可線上測試介面 5. 匯出swagger原始檔 6. 轉換成markdown格式檔案 1,匯入jar包 gradl

XCODE8 API解析

31 OCT 2016 . CATEGORY: TECH . COMMENTS #TUTORIAL 背景 iOS API的start/deprecated的判斷一個重要基礎是獲取到每個API的具體版本支援資訊。

Spring MVC中使用Swagger生成API和完整專案示例Demo,swagger

轉載自:http://www.360doc.com/content/17/0914/17/16915_687184334.shtml    實際專案中非常需要寫文件,提高Java服務端和Web前端以及移動端的對接效率。   聽說Swagger這

MonkeyScript API

一、前言 本文件記錄了和 MonkeyScript 相關的 API 文件,由承香墨影整理。所有 API 描述均來自 MonkeySourceScript.java 。 也可以自行檢視原始碼,線上閱讀地址: http://androidxref.com/5.1.1_r6/xref/deve