Penulis: Richard Jones
Server Pedang Sederhana harus menggunakan:
1/ Ini adalah perpustakaan server untuk server python yang digunakan agar kompatibel dengan SWORDv2 2/ Ini adalah server yang berdiri sendiri yang menyediakan implementasi referensi dari spesifikasi SWORD 2.0
SSS bergantung pada web.py dan lxml, jadi Anda perlu easy_install keduanya sebelum melanjutkan. Anda harus menginstal libxml2 dan libxslt1.1 agar lxml dapat menginstal.
SSS memiliki objek konfigurasi yang dapat dimodifikasi untuk mengubah beberapa aspek perilakunya. Buka sss.py untuk mengedit dan temukan objek Konfigurasi; setiap opsi yang tersedia bagi Anda didokumentasikan sebaris.
Jika Anda menjalankan ini menggunakan Mulai Cepat di bawah, Anda dapat membiarkan konfigurasi apa adanya dan semuanya akan berfungsi. Jika Anda menerapkan SSS menggunakan web.py di Apache, Anda perlu mengubah objek konfigurasi dari CherryPyConfiguration menjadi ApacheConfiguration yang dapat dilakukan di akhir file.
SSS menyediakan model objek, dua implementasi API web (untuk web.py dan tiang) dan antarmuka server yang akan diimplementasikan untuk mengikat API SWORD ke server yang mendasarinya.
Antarmuka yang akan diimplementasikan oleh server adalah sss.SwordServer. Ini kemudian dapat dikonfigurasi dalam file konfigurasi sss.conf.json yang digunakan oleh SSS untuk memuat sebagai implementasi server.
Web.py API ada di sss.webpy, dan hanya dapat dijalankan secara mandiri. Ini adalah penggunaan SSS yang direkomendasikan untuk implementasi referensi (lihat di bawah)
API Pylons ada di sss.pylons_sword_controller, dan dapat diimpor ke proyek Pylons dengan sangat mudah. Anda harus membuat pengontrol baru di proyek Pylons Anda, dan membuat isi pengontrol itu menjadi:
from sss.pylons_sword_controller import SwordController __controller__ = "SwordController"
Ketika dijalankan sebagai implementasi referensi, SSS merespons permintaan seolah-olah itu adalah server SWORD 2.0 yang sebenarnya, meskipun di balik terpalnya SSS adalah penyimpanan file sederhana yang melakukan pemrosesan minimal pada konten yang digunakannya.
CATATAN: menggunakan CherryPy secara langsung tidak mendukung HTTP 1.1 (karena ada bug), jadi Anda perlu mengeluarkan permintaan dengan HTTP 1.0. Ini merupakan gangguan, jadi untuk penggunaan selain menggunakan CURL disarankan untuk menjalankan SSS di belakang Apache, seperti dijelaskan lebih lanjut...
Untuk memulai SSS menggunakan CherryPy, tempatkan sss.py di direktori yang sesuai dan mulai dengan
python sss.py
Ini akan memulai server web pada
http://localhost:8080/
Perhatikan bahwa SSS secara otomatis membuat penyimpanan data di direktori tempat file sss.py berada sehingga hal ini harus dilakukan di direktori yang sesuai. Untuk memulai server pada port alternatif (misalnya 8443) mulailah dengan
python sss.py 8443
Untuk mendapatkan dukungan HTTP 1.1, SSS perlu diterapkan di Apache (CherryPy tidak mendukung HTTP 1.1 saat ini karena ada bug)
Untuk melakukannya, Anda dapat mengikuti petunjuk di:
http://webpy.org/cookbook/mod_wsgi-apache
Saat menyiapkan file httpd.conf Anda, agar unggahan file dapat menggunakan Transfer-Encoding: chunked, dan untuk memastikan kredensial otorisasi diteruskan, Anda perlu menyiapkan konfigurasi sebagai berikut:
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>
Perhatikan bahwa ini menetapkan lokasi eksplisit untuk wsgi_module (diperlukan untuk Ubuntu, YMMV pada platform lain), dan menambahkan WSGIChunkRequest ke konteks yang benar.
Bagian ini menjelaskan serangkaian permintaan CURL yang memanfaatkan setiap bagian dari layanan web SWORD
Perhatikan bahwa untuk permintaan POST dan PUT kami menggunakan HTTP 1.0 untuk permintaan curl. Hal ini karena server web CherryPy tempat SSS beroperasi secara asli tidak merespons permintaan tersebut dengan benar (walaupun fungsionalitas server tidak terpengaruh). Anda mungkin menemukan bahwa pemrograman melawan SSS akan mengharuskan Anda untuk menggunakan HTTP 1.0 secara eksplisit - ini TIDAK boleh dianggap sebagai persyaratan untuk SWORD 2.0.
###Otentikasi
Untuk melihat berbagai hasil autentikasi, coba permintaan berikut pada dokumen layanan. Secara default SSS memiliki detail pengguna berikut:
pengguna: pedang
kata sandi: pedang
Atas Nama: obo
curl -i http://sword:sword@localhost:8080/sd-uri
Otentikasi berhasil tanpa pengguna Atas Nama
curl -i -H "X-On-Behalf-Of: obo" http://sword:sword@localhost:8080/sd-uri
Otentikasi berhasil dengan pengguna Atas Nama
curl -i http://localhost:8080/sd-uri
Tidak ada kredensial Auth Dasar yang diberikan, 401 Respons tidak sah
curl -i http://sword:drows@localhost:8080/sd-uri
Kata sandi salah, 401 respons tidak sah
curl -i http://drows:sword@localhost:8080/sd-uri
Pengguna salah, 401 respons tidak sah
curl -i -H "X-On-Behalf-Of: bob" http://sword:sword@localhost:8080/sd-uri
Pengguna yang benar tetapi Pengguna Atas Nama tidak valid, 401 respons tidak sah
Semua permintaan selanjutnya dapat dilakukan dengan header X-On-Behalf-Of; tidak ada contoh lebih lanjut yang akan diberikan
###Dapatkan Dokumen Layanan
HTTP: DAPATKAN di SD-URI
curl -i http://sword:sword@localhost:8080/sd-uri
Ini mengembalikan Dokumen Layanan dengan jumlah koleksi yang dikonfigurasi dan terdaftar
###Setorkan beberapa konten baru
HTTP: POST di 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]
Ini memposting file example.zip ke Col-URI dengan nama file "example.zip", dan menentukan bahwa itu adalah file zip. Tanpa header X-Packaging ini akan diartikan sebagai paket SWORD default. Col-URI harus diperoleh dari Dokumen Layanan.
Ini akan mengembalikan status HTTP 201 Dibuat, dan Tanda Terima Deposit
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]
Ini akan mengembalikan status HTTP 202 Diterima, dan Tanda Terima Deposit
curl -i --http1.0 --data-binary "@multipart.dat" -H 'Content-Type: multipart/related; boundary="===============0670350989=="' -H "MIME-Version: 1.0" sword:sword@[Col-URI]
Ini akan meniru deposit Atom Multipart dan akan membuat dua item dalam wadah: atom.xml dan example.xml (diawali dengan stempel waktu saat ini). Ini akan mengembalikan status HTTP 201 Dibuat dan Tanda Terima Deposit. Anda dapat menambahkan
-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]
Ini adalah contoh penggunaan format paket berbeda untuk example.zip. Saat ini pembuat paket ingest di SSS akan membiarkan paket ini apa adanya, tanpa mencoba membongkarnya
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]
Ini adalah contoh di mana kami menyediakan checksum MD5 yang benar untuk item tersebut, hanya untuk menunjukkan bahwa ini berfungsi dengan atau tanpa checksum. Lihat bagian di bawah tentang kesalahan untuk memberikan checksum yang salah.
###Cantumkan isi Koleksi
HTTP: DAPATKAN di Col-URI
curl -i sword:sword@[Col-URI]
Ini akan mengembalikan Umpan Atom di mana setiap atom:entry mengacu pada koleksi dalam koleksi yang ditentukan. Hal ini diterapkan hanya demi kenyamanan, jadi bukan Feed lengkap; melainkan hanya berisi elemen atom:link yang berisi href ke Edit-URI untuk Koleksi itu
###Dapatkan representasi wadah (Sumber Daya Media)
HTTP: DAPATKAN di Cont-URI atau EM-URI
curl -i [EM-URI]
Dapatkan paket penyebaran default dari server. Dalam hal ini curl mengisi header Accept untuk kita dengan " / ". Ini akan mengembalikan file aplikasi/zip dari semua konten dalam wadah. Perhatikan bahwa permintaan ini tidak memerlukan autentikasi, karena SSS memodelkannya sebagai tampilan publik dari konten untuk tujuan contoh.
FIXME: metode negosiasi konten ini masih diperdebatkan, meskipun SSS saat ini mendukungnya
curl -i -H "Accept: application/zip;swordpackage=http://www.swordapp.org/package/default" [EM-URI]
Secara eksplisit meminta file zip dalam format paket pedang standar (yang kebetulan merupakan file zip biasa)
curl -i -H "Accept: application/zip" [EM-URI]
Secara eksplisit meminta file zip biasa dari konten (yang kebetulan tidak berbeda dengan paket pedang standar)
curl -i -H "Accept: text/html" [EM-URI]
Secara eksplisit meminta representasi HTML dari Sumber Daya Media. Ini akan mengembalikan header HTTP 302 Found dengan header Lokasi yang menunjuk ke representasi HTML
curl -i -H "Accept: application/vnd+msword" [EM-URI]
Hasilkan kesalahan 415 Jenis Media Tidak Didukung
###Timpa Sumber Daya Media yang ada dengan yang baru
HTTP: PUT pada 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]
Ini akan mengganti semua konten yang ada dalam wadah yang diidentifikasi dengan EM-URI dengan file example.zip terlampir. Format paket diartikan sebagai paket pedang default. Ini akan mengembalikan 201 Dibuat dan Tanda Terima Deposit
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]
Ini akan melakukan hal yang sama seperti di atas, tetapi akan mengembalikan 202 Diterima yang menunjukkan bahwa pembaruan telah diterima di server, tetapi belum diproses (untuk tujuan misalnya, tentu saja; tidak ada bedanya dengan apa yang sebenarnya terjadi di server).
FIXME: ini bukan cara kerja AtomPub, melainkan dikatakan bahwa ini akan menghasilkan 200 - juri masih belum mendukung PEDANG dalam hal ini
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]
Ini akan melakukan hal yang sama seperti di atas tetapi memberitahu server untuk tidak memperbarui metadata item berdasarkan deposit ini. SSS tidak mengimplementasikan pembaruan metadata untuk paket default yang bukan multibagian, jadi ini tidak akan berdampak apa pun, namun ini adalah permintaan yang valid.
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]
Contohnya sama seperti di atas tetapi dengan header X-Packaging yang diteruskan.
###Hapus kontennya, bukan wadahnya
HTTP: HAPUS di EM-URI
curl -i -X DELETE sword:sword@[EM-URI]
Ini menghapus semua konten dari toko, tetapi bukan wadah itu sendiri, dan mengembalikan 200 OK dan Tanda Terima Deposit
###Dapatkan representasi container
HTTP: DAPATKAN di Edit-URI
curl -i sword:sword@[Edit-URI]
Ini mengambil Edit-URI dalam format defaultnya, yaitu sebagai salinan Tanda Terima Deposit - dokumen entri atom
curl -i -H "Accept: application/rdf+xml" sword:sword@[Edit-URI]
Ini memberi kita pernyataan RDF/XML murni dari repositori
curl -i -H "Accept: application/atom+xml;type=entry" sword:sword@[Edit-URI]
Ini secara eksplisit meminta Edit-URI dalam bentuk entri atomnya, yang sama dengan format default
###Perbarui penampung dengan menambahkan konten baru ke konten yang sudah ada
HTTP: POST pada Edit-URI
curl -i --http1.0 --data-binary "@example.zip" -H "Content-Disposition: filename=example.zip" -H "Content-Type: application/zip" sword:sword@[Edit-URI]
Ini menambahkan file example.zip ke server (perhatikan bahwa Disposisi Konten memberinya nama yang sama - SSS akan melokalkan nama pada tanda terima untuk menghindari penimpaan file yang ada) tanpa menghapus konten apa pun yang ada. Ini akan mengembalikan 201 Dibuat (atau jika Anda menambahkan header X-In-Progress 202 Diterima) dan Tanda Terima Deposit.
curl -i --http1.0 --data-binary "@multipart.dat" -H 'Content-Type: multipart/related; boundary="===============0670350989=="' -H "MIME-Version: 1.0" sword:sword@[Edit-URI]
Ini akan meniru deposit Atom Multipart dan akan membuat dua item dalam wadah: atom.xml dan example.xml (diawali dengan stempel waktu saat ini). Atom.xml akan menimpa file atom.xml yang ada dalam kasus ini, sedangkan example.zip hanya akan ditambahkan dengan nama lokal. Ini akan mengembalikan status HTTP 201 Dibuat dan Tanda Terima Deposit. Anda dapat menambahkan -H "X-In-Progress: true" untuk mendapatkan 202 Accepted kembali, seperti di atas.
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]
Versi permintaan ini, dengan set header X-Suppress-Metadata akan melakukan hal yang sama seperti di atas tetapi tidak akan mencoba mengekstrak metadata apa pun dari file atom.xml seperti yang dilakukan sebaliknya.
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]
###Hapus wadah dan seluruh isinya
HTTP: HAPUS pada Edit-URI
curl -i -X DELETE sword:sword@[Edit-URI]
Ini akan menghapus semua konten dari wadah diikuti dengan wadah itu sendiri. Ini akan mengembalikan respons 204 Tanpa Konten tanpa isi respons.
###Menghasilkan Kesalahan
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]
Menghasilkan respons kesalahan ErrorContent saat menyetorkan paket yang jenis paketnya tidak cocok dengan header X-Packaging
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]
Menghasilkan kesalahan karena ketidakcocokan antara checksum dan header checksum yang disediakan, sehingga menghasilkan kesalahan 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]
Menghasilkan kesalahan Permintaan Buruk dengan meneruskan nilai ilegal ke X-In-Progress, sehingga menghasilkan 400 respons Permintaan Buruk