المؤلف: ريتشارد جونز
يجب أن يستخدم خادم Simple Sword:
1/ إنها مكتبة خادم لخوادم python لاستخدامها لتكون متوافقة مع SWORDv2 2/ إنها خادم مستقل يوفر تطبيقًا مرجعيًا لمواصفات SWORD 2.0
يعتمد SSS على web.py وlxml، لذا ستحتاج إلى تثبيت كل منهما بسهولة قبل المتابعة. ستحتاج إلى تثبيت libxml2 وlibxslt1.1 حتى يتم تثبيت lxml.
يحتوي SSS على كائن تكوين يمكن تعديله لتغيير بعض جوانب سلوكه. افتح sss.py للتحرير وابحث عن كائن التكوين؛ تم توثيق كل خيار من الخيارات المتاحة لك في السطر.
إذا كنت تقوم بتشغيل هذا باستخدام البداية السريعة أدناه، فيمكنك ترك التكوين كما هو وسيعمل كل شيء. إذا كنت تقوم بنشر SSS باستخدام web.py ضمن Apache، فستحتاج إلى تغيير كائن التكوين من CherryPyConfiguration إلى ApacheConfiguration والذي يمكن إجراؤه في نهاية الملف.
يوفر SSS نموذج كائن، وتطبيقين لواجهة برمجة تطبيقات الويب (لـ web.py وpylons) وواجهة خادم ليتم تنفيذها لربط SWORD API بالخادم الأساسي.
الواجهة التي سيتم تنفيذها بواسطة الخادم هي sss.SwordServer. ويمكن بعد ذلك تكوين ذلك في ملف التكوين sss.conf.json الذي يستخدمه SSS للتحميل كتنفيذ للخادم.
واجهة برمجة تطبيقات Web.py موجودة في sss.webpy، ولا يمكن تشغيلها إلا بشكل مستقل. هذا هو الاستخدام الموصى به لـ SSS للتنفيذ المرجعي (انظر أدناه)
واجهة برمجة تطبيقات Pylons موجودة في 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، يوصى بتشغيل SSS خلف Apache، كما هو موضح أدناه...
لبدء SSS باستخدام CherryPy، ضع sss.py في الدليل المناسب الخاص به وابدأ به
python sss.py
سيؤدي هذا إلى تشغيل خادم الويب في
http://localhost:8080/
لاحظ أن SSS يقوم تلقائيًا بإنشاء مخزن بيانات في الدليل الذي يوجد به ملف sss.py لذا يجب أن يتم ذلك في دليل مناسب. لبدء تشغيل الخادم على منفذ بديل (مثل 8443)، ابدأ تشغيله
python sss.py 8443
للحصول على دعم HTTP 1.1، من الضروري نشر SSS ضمن Apache (CherryPy لا يدعم HTTP 1.1 في هذه المرحلة بسبب خطأ)
للقيام بذلك، يمكنك اتباع التعليمات الموجودة على:
http://webpy.org/cookbook/mod_wsgi-apache
عند إعداد ملف httpd.conf، للسماح بتحميل الملفات باستخدام ترميز النقل: مقسم، ولضمان إعادة توجيه بيانات اعتماد التفويض، ستحتاج إلى إعداد التكوين على النحو التالي:
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 على الأنظمة الأساسية الأخرى)، ويضيف WSGIChunkedRequest إلى السياق الصحيح.
يصف هذا القسم سلسلة من طلبات CURL التي تستخدم كل جزء من خدمة الويب SWORD
لاحظ أنه بالنسبة لطلبات POST وPUT، نستخدم HTTP 1.0 لطلبات التجعيد. وذلك لأن خادم الويب CherryPy الذي يعمل SSS بموجبه أصلاً لا يستجيب بشكل صحيح لتلك الطلبات (على الرغم من عدم تأثر وظيفة الخادم). قد تجد أن البرمجة ضد 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
curl -i http://sword:sword@localhost:8080/sd-uri
يؤدي ذلك إلى إرجاع مستند الخدمة مع العدد المكون من المجموعات المدرجة
###إيداع بعض المحتوى الجديد
HTTP: POST على 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"، وتحديد أنه ملف مضغوط. بدون رأس X-Packaging، سيتم تفسير ذلك على أنه حزمة SWORD افتراضية. يجب الحصول على Col-URI من مستند الخدمة.
يجب أن يُرجع هذا حالة HTTP وهي 201 تم الإنشاء وإيصال الإيداع
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 مقبول وإيصال الإيداع
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 تم الإنشاء وإيصال الإيداع. يمكنك إضافة
-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 حيث يشير كل إدخال ذرة إلى مجموعة في المجموعة المحددة. يتم تنفيذ هذا فقط من أجل الراحة، لذا فهو ليس موجزًا كاملاً؛ بدلاً من ذلك، فهو يحتوي فقط على عنصر atom:link الذي يحتوي على href إلى Edit-URI لتلك المجموعة
###الحصول على تمثيل للحاوية (مورد الوسائط)
HTTP: احصل على Cont-URI أو EM-URI
curl -i [EM-URI]
احصل على حزمة النشر الافتراضية من الخادم. في هذه الحالة، يملأ الضفيرة رأس القبول لنا بـ " / ". سيؤدي هذا إلى إرجاع ملف تطبيق/zip لجميع المحتويات الموجودة في الحاوية. لاحظ أن هذا الطلب لا يتطلب المصادقة، حيث تقوم SSS بتصوير ذلك باعتباره الوجه العام للمحتوى لأغراض المثال.
FIXME: هذه الطريقة للتفاوض على المحتوى قيد المناقشة، على الرغم من أن SSS يدعمها حاليًا
curl -i -H "Accept: application/zip;swordpackage=http://www.swordapp.org/package/default" [EM-URI]
اطلب بشكل صريح ملفًا مضغوطًا بتنسيق حزمة السيف القياسي (وهو، بالمناسبة، ملف مضغوط عادي)
curl -i -H "Accept: application/zip" [EM-URI]
اطلب بشكل صريح ملف مضغوط عادي للمحتوى (والذي لا يختلف عن حزمة السيف القياسية)
curl -i -H "Accept: text/html" [EM-URI]
اطلب بشكل صريح تمثيل HTML لمورد الوسائط. سيعيد هذا رأس HTTP 302 Found مع رأس الموقع الذي يشير إلى تمثيل HTML
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]
سيؤدي هذا إلى استبدال كل المحتوى الموجود في الحاوية المحددة باستخدام EM-URI بملف example.zip المرفق. يتم تفسير تنسيق الحزمة على أنه حزمة السيف الافتراضية. سيُرجع 201 تم إنشاؤه وإيصال الإيداع
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 مقبول للإشارة إلى أنه تم قبول التحديث في الخادم، ولكن لم تتم معالجته بعد (لأغراض على سبيل المثال، من الواضح أن ذلك لا يحدث أي فرق عما يحدث بالفعل) يحدث على الخادم).
الإصلاح: هذه ليست الطريقة التي يعمل بها 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 موافق وإيصال الإيداع
###احصل على تمثيل للحاوية
HTTP: احصل على Edit-URI
curl -i sword:sword@[Edit-URI]
يؤدي ذلك إلى استرداد معرف 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]
يطلب هذا بشكل صريح تحرير URI في نموذج الإدخال الذري الخاص به، وهو نفس التنسيق الافتراضي
###تحديث الحاوية عن طريق إضافة محتوى جديد إلى المحتوى الموجود
HTTP: POST على تحرير URI
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 إلى الخادم (لاحظ أن ترتيب المحتوى يمنحه نفس الاسم - سيقوم SSS بترجمة الأسماء عند الاستلام لتجنب الكتابة فوق الملفات الموجودة) دون إزالة أي من المحتوى الموجود. سيعيد هذا 201 تم الإنشاء (أو إذا أضفت رأس X-In-Progress، فسيتم قبول 202) وإيصال الإيداع.
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 تم الإنشاء وإيصال الإيداع. يمكنك إضافة -H "X-In-Progress: true" للحصول على 202 مقبول بدلاً من ذلك، كما هو مذكور أعلاه.
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 استجابة بدون محتوى بدون نص استجابة.
###توليد الأخطاء
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]
يُنشئ استجابة خطأ ErrorContent عند إيداع حزمة لا يتطابق نوع الحزمة الخاصة بها مع رأس 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]
قم بإنشاء خطأ لعدم التطابق بين المجموع الاختباري ورأس المجموع الاختباري المقدم، مما يؤدي إلى خطأ فشل الشرط المسبق 412.
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