作者:理查德瓊斯
Simple Sword 伺服器必須使用:
1/ 它是 python 伺服器用於相容 SWORDv2 的伺服器庫 2/ 它是一個獨立伺服器,提供 SWORD 2.0 規範的參考實現
SSS 依賴 web.py 和 lxml,因此您需要在繼續之前輕鬆安裝這兩個檔案。 您需要安裝 libxml2 和 libxslt1.1 才能安裝 lxml。
SSS 有一個配置對象,可以修改它來改變其行為的某些方面。 開啟sss.py進行編輯,找到Configuration物件;您可以使用的每個選項都內聯記錄。
如果您使用下面的快速入門來運行此程序,則可以按原樣保留配置,一切都應該可以正常工作。 如果您在 Apache 下使用 web.py 部署 SSS,則需要將設定物件從 CherryPyConfiguration 變更為 ApacheConfiguration,這可以在檔案末尾完成。
SSS 提供了一個物件模型、兩個 Web API 實作(用於 web.py 和 pylon)以及一個用於將 SWORD API 綁定到底層伺服器的伺服器介面。
伺服器端要實現的介面是sss.SwordServer。 然後可以在 sss.conf.json 設定檔中進行配置,SSS 使用該檔案來載入伺服器的實作。
Web.py API 位於 sss.webpy 中,且只能獨立運作。 這是SSS的建議用法,供參考實作(見下文)
Pylons API 位於 sss.pylons_sword_controller 中,可以非常輕鬆地匯入到 Pylons 專案中。 您應該在 Pylons 專案中建立一個新控制器,並且該控制器的主體如下:
from sss.pylons_sword_controller import SwordController __controller__ = "SwordController"
當作為參考實作運行時,SSS 對請求的回應就好像它是一個真正的 SWORD 2.0 伺服器一樣,儘管在幕後它是一個簡單的文件存儲,對其所處理的內容進行最少的處理。
注意:開箱即用的 CherryPy 不支援 HTTP 1.1(由於錯誤),因此您需要使用 HTTP 1.0 發出請求。 這是一個麻煩,因此對於使用 CURL 以外的用途,建議在 Apache 後面運行 SSS,如下所述...
要使用 CherryPy 啟動 SSS,請將 sss.py 放置在其自己的合適目錄中並使用以下命令啟動它
python sss.py
這將啟動網頁伺服器
http://localhost:8080/
請注意,SSS 會自動在 sss.py 檔案所在的目錄中建立資料存儲,因此應在適當的目錄中完成此操作。 若要在備用連接埠(例如 8443)上啟動伺服器,請使用
python sss.py 8443
為了獲得 HTTP 1.1 支持,需要在 Apache 下部署 SSS(由於 bug,CherryPy 目前不支援 HTTP 1.1)
為此,您可以按照以下網址的說明進行操作:
http://webpy.org/cookbook/mod_wsgi-apache
設定 httpd.conf 檔案時,若要允許檔案上傳使用 Transfer-Encoding: chunked,並確保轉送授權憑證,您需要以下列方式設定設定:
LoadModule wsgi_module /usr/lib/apache2/modules/mod_wsgi.so WSGIScriptAlias /sss /path/to/SSS/sss.py WSGIPassAuthorization On Alias /sss/static /path/to/SSS/static/ AddType text/html .py <Directory /path/to/SSS/> WSGIChunkedRequest On Order deny,allow Allow from all </Directory>
請注意,這為 wsgi_module 設定了明確位置(Ubuntu、其他平台上的 YMMV 需要),並將 WSGICunkedRequest 新增至正確的上下文。
本節介紹一系列利用 SWORD Web 服務各部分的 CURL 請求
請注意,對於 POST 和 PUT 請求,我們使用 HTTP 1.0 來處理curl 請求。 這是因為 SSS 本身運行的 CherryPy Web 伺服器無法正確回應這些請求(儘管伺服器的功能不受影響)。 您可能會發現針對 SSS 進行程式設計將要求您明確使用 HTTP 1.0 - 這不應被視為 SWORD 2.0 的要求。
###驗證
若要查看各種身份驗證結果,請嘗試對服務文件執行下列請求。 預設情況下,SSS 具有以下使用者詳細資訊:
使用者:劍
密碼:劍
代表人:奧博
捲曲-i http://sword:sword@localhost:8080/sd-uri
無需代表用戶即可成功進行身份驗證
curl -i -H "X-On-Behalf-Of: obo" http://sword:sword@localhost:8080/sd-uri
代表使用者成功進行身份驗證
curl -i http://localhost:8080/sd-uri
未提供基本驗證憑證,401 未經授權回應
curl -i http://sword:drows@localhost:8080/sd-uri
密碼錯誤,401未經授權的回應
curl -i http://drows:sword@localhost:8080/sd-uri
使用者不正確,401未經授權的回應
curl -i -H "X-On-Behalf-Of: bob" http://sword:sword@localhost:8080/sd-uri
使用者正確但代表使用者無效,401 未經授權的回應
所有後續請求都可以使用 X-On-Behalf-Of 標頭來完成;將不再提供更多範例
###取得服務文檔
HTTP:SD-URI 上的 GET
curl -i http://sword:sword@localhost:8080/sd-uri
這將返回服務文檔,其中列出了配置的集合數量
###存入一些新內容
HTTP:在 Col-URI 上發布
curl -i --http1.0 --data-binary "@example.zip" -H "Content-Disposition: filename=example.zip" -H "Content-Type: application/zip" sword:sword@[Col-URI]
這會將 example.zip 檔案發佈到 Col-URI,檔案名稱為“example.zip”,並指定它是一個 zip 檔案。 如果沒有 X-Packaging 標頭,這將被解釋為預設的 SWORD 套件。 Col-URI 應從服務文件中取得。
這應該會傳回 HTTP 狀態 201 Created 和存款收據
curl -i --http1.0 --data-binary "@example.zip" -H "Content-Disposition: filename=example.zip" -H "Content-Type: application/zip" -H "X-In-Progress: true" sword:sword@[Col-URI]
這應該會傳回 HTTP 狀態 202 Accepted 和存款收據
curl -i --http1.0 --data-binary "@multipart.dat" -H 'Content-Type: multipart/related; boundary="===============0670350989=="' -H "MIME-Version: 1.0" sword:sword@[Col-URI]
這將模仿 Atom Multipart 存款,並在容器中建立兩個專案:atom.xml 和 example.xml(以當前時間戳為前綴)。 這應該會傳回 HTTP 狀態 201 Created 和存款收據。 您可以新增
-H "X-In-Progress: true" to get a 202 Accepted back instead, as above. curl -i --http1.0 --data-binary "@example.zip" -H "Content-Disposition: filename=example.zip" -H "Content-Type: application/zip" -H "X-Packaging: http://purl.org/net/sword/package/METSDSpaceSIP" sword:sword@[Col-URI]
這是對 example.zip 使用不同套件格式的範例。 目前,SSS 中的攝取打包器將簡單地保留此包,而不會嘗試對其進行解包
curl -i --http1.0 --data-binary "@example.zip" -H "Content-Disposition: filename=example.zip" -H "Content-Type: application/zip" -H "Content-MD5: 2b25f82ba67284461d4a481d7a06dd28" sword:sword[Col-URI]
在這個範例中,我們為該專案提供了正確的 MD5 校驗和,只是為了證明無論有沒有校驗和,該方法都有效。 請參閱下面有關提供錯誤校驗和的錯誤的部分。
###列出集合的內容
HTTP:在 Col-URI 上取得
curl -i sword:sword@[Col-URI]
這將傳回一個 Atom Feed,其中每個atom:entry 引用指定集合中的一個集合。 這只是為了方便而實施,因此不是完整的 Feed;相反,它只包含一個atom:link元素,其中包含該集合的編輯URI的href
###取得容器的表示(媒體資源)
HTTP:在 Cont-URI 或 EM-URI 上取得
curl -i [EM-URI]
從伺服器取得預設的分發包。 在這種情況下,curl 會用「 / 」為我們填滿 Accept 標頭。這將返回容器中所有內容的 application/zip 檔案。 請注意,此請求不需要身份驗證,因為 SSS 出於範例目的將其建模為內容的公共面孔。
FIXME:這種內容協商方法正在爭論中,儘管 SSS 目前支援它
curl -i -H "Accept: application/zip;swordpackage=http://www.swordapp.org/package/default" [EM-URI]
明確請求標準劍包格式的 zip 檔案(順便說一下,這是一個普通的 zip 檔案)
curl -i -H "Accept: application/zip" [EM-URI]
明確請求內容的普通 zip 檔案(這恰好與標準劍包沒有什麼不同)
curl -i -H "Accept: text/html" [EM-URI]
明確請求媒體資源的 HTML 表示形式。 這將傳回一個 302 Found HTTP 標頭,其中包含一個指向 HTML 表示的 Location 標頭
curl -i -H "Accept: application/vnd+msword" [EM-URI]
產生 415 不支援的媒體類型錯誤
###用新媒體資源覆蓋現有媒體資源
HTTP:放在 EM-URI 上
curl -i -X PUT --http1.0 --data-binary "@example.zip" -H "Content-Disposition: filename=example.zip" -H "Content-Type: application/zip" sword:sword@[EM-URI]
這將用附加的 example.zip 檔案取代用 EM-URI 標識的容器中的所有現有內容。 包格式被解釋為預設的劍包。 它將返回 201 Created 和存款收據
curl -i -X PUT --http1.0 --data-binary "@example.zip" -H "Content-Disposition: filename=example.zip" -H "Content-Type: application/zip" -H "X-In-Progress: true" sword:sword@[EM-URI]
這將執行與上面相同的操作,但將返回 202 Accepted 指示更新已被伺服器接受,但尚未處理(顯然,出於範例的目的;它與實際情況沒有任何區別)發生在伺服器上)。
FIXME:這不是 AtomPub 的工作方式,它相反說應該返回 200 - SWORD 對此還沒有定論
curl -i -X PUT --http1.0 --data-binary "@example.zip" -H "Content-Disposition: filename=example.zip" -H "Content-Type: application/zip" -H "X-Suppress-Metadata: true" sword:sword@[EM-URI]
這將執行與上面相同的操作,但告訴伺服器不要根據此存款更新項目的元資料。 SSS 不會對非多部分的預設套件實現元資料更新,因此這不會產生任何實際效果,但這是一個有效的請求。
curl -i -X PUT --http1.0 --data-binary "@example.zip" -H "Content-Disposition: filename=example.zip" -H "Content-Type: application/zip" -H "X-Packaging: http://purl.org/net/sword/package/METSDSpaceSIP" sword:sword@[EM-URI]
與上面相同但傳入了 X-Packaging 標頭的範例。
###刪除內容但不刪除容器
HTTP:在 EM-URI 上刪除
curl -i -X DELETE sword:sword@[EM-URI]
這將從商店中刪除所有內容,但不會刪除容器本身,並返回 200 OK 和存款收據
###取得容器的表示
HTTP:編輯 URI 上的 GET
curl -i sword:sword@[Edit-URI]
這會以其預設格式檢索 Edit-URI,該格式是存款收據的副本 - 原子條目文檔
curl -i -H "Accept: application/rdf+xml" sword:sword@[Edit-URI]
這為我們提供了來自儲存庫的純 RDF/XML 語句
curl -i -H "Accept: application/atom+xml;type=entry" sword:sword@[Edit-URI]
這以原子條目形式明確請求 Edit-URI,這與預設格式相同
###透過為現有內容新增內容來更新容器
HTTP:編輯 URI 上的 POST
curl -i --http1.0 --data-binary "@example.zip" -H "Content-Disposition: filename=example.zip" -H "Content-Type: application/zip" sword:sword@[Edit-URI]
這會將 example.zip 檔案新增至伺服器(請注意,Content-Disposition 為其提供了相同的名稱 - SSS 將在收到時本地化名稱以避免覆蓋現有檔案),而不刪除任何現有內容。 這將傳回 201 Created(或如果您新增 X-In-Progress 標頭,則傳回 202 Accepted)和存款收據。
curl -i --http1.0 --data-binary "@multipart.dat" -H 'Content-Type: multipart/related; boundary="===============0670350989=="' -H "MIME-Version: 1.0" sword:sword@[Edit-URI]
這將模仿 Atom Multipart 存款,並在容器中建立兩個專案:atom.xml 和 example.xml(以當前時間戳為前綴)。 在這種情況下,atom.xml 將覆蓋任何現有的atom.xml 文件,而 example.zip 將僅添加到本地化名稱下。 這應該會傳回 HTTP 狀態 201 Created 和存款收據。 您可以新增 -H "X-In-Progress: true" 以取得 202 Accepted 返回,如上所述。
curl -i --http1.0 --data-binary "@multipart.dat" -H 'Content-Type: multipart/related; boundary="===============0670350989=="' -H "MIME-Version: 1.0" -H "X-Suppress-Metadata: true" sword:sword@[Edit-URI]
設定了 X-Suppress-Metadata 標頭的此版本請求將執行與上面相同的操作,但它不會嘗試從atom.xml 檔案中提取任何元數據,否則它會執行此操作。
curl -i --http1.0 --data-binary "@example.zip" -H "Content-Disposition: filename=example.zip" -H "Content-Type: application/zip" -H "X-Packaging: http://purl.org/net/sword/package/METSDSpaceSIP" sword:sword@[Edit-URI]
###刪除容器及其所有內容
HTTP:編輯 URI 上的刪除
curl -i -X DELETE sword:sword@[Edit-URI]
這將從容器中刪除所有內容,然後刪除容器本身。 它將傳回沒有回應正文的 204 No Content 回應。
###產生錯誤
curl -i --http1.0 --data-binary "@example.zip" -H "Content-Disposition: filename=example.zip" -H "Content-Type: application/zip" -H "X-Packaging: http://purl.org/net/sword/package/error" sword:sword[Col-URI]
在存放包裹類型與 X-Packaging 標頭不符的包裹時產生 ErrorContent 錯誤回應
curl -i --http1.0 --data-binary "@example.zip" -H "Content-Disposition: filename=example.zip" -H "Content-Type: application/zip" -H "Content-MD5: 1234567890" sword:sword[Col-URI]
由於校驗和與提供的校驗和標頭不匹配而產生錯誤,從而導致 412 Precondition Failed 錯誤。
curl -i --http1.0 --data-binary "@example.zip" -H "Content-Disposition: filename=example.zip" -H "Content-Type: application/zip" -H "X-In-Progress: whatever" sword:sword[Col-URI]
透過向 X-In-Progress 傳遞非法值來產生錯誤請求錯誤,從而導致 400 錯誤請求回應