저자: 리처드 존스
Simple Sword 서버는 다음을 사용해야 합니다.
1/ SWORDv2와 호환되기 위해 사용하는 Python 서버용 서버 라이브러리입니다. 2/ SWORD 2.0 사양의 참조 구현을 제공하는 독립형 서버입니다.
SSS는 web.py와 lxml에 의존하므로 계속 진행하기 전에 이 두 가지를 모두 easy_install해야 합니다. lxml을 설치하려면 libxml2 및 libxslt1.1을 설치해야 합니다.
SSS에는 동작의 일부 측면을 변경하기 위해 수정할 수 있는 구성 개체가 있습니다. 편집을 위해 sss.py를 열고 구성 개체를 찾습니다. 사용 가능한 각 옵션은 인라인으로 문서화되어 있습니다.
아래 빠른 시작을 사용하여 이를 실행하는 경우 구성을 그대로 두면 모든 것이 작동합니다. Apache에서 web.py를 사용하여 SSS를 배포하는 경우 파일 끝에서 구성 개체를 CherryPyConfiguration에서 ApacheConfiguration으로 변경해야 합니다.
SSS는 개체 모델, 두 가지 웹 API 구현(web.py 및 pylons용) 및 SWORD API를 기본 서버에 바인딩하기 위해 구현되는 서버 인터페이스를 제공합니다.
서버에서 구현할 인터페이스는 sss.SwordServer입니다. 그런 다음 SSS가 서버 구현으로 로드하는 데 사용되는 sss.conf.json 구성 파일에서 구성할 수 있습니다.
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를 배포해야 합니다(CherryPy는 현재 버그로 인해 HTTP 1.1을 지원하지 않습니다).
이렇게 하려면 다음 지침을 따르세요.
http://webpy.org/cookbook/mod_wsgi-apache
httpd.conf 파일을 설정할 때 파일 업로드에서 Transfer-Encoding: 청크 사용을 허용하고 인증 자격 증명이 전달되도록 하려면 다음과 같이 구성을 설정해야 합니다.
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를 올바른 컨텍스트에 추가한다는 점에 유의하세요.
이 섹션에서는 SWORD 웹 서비스의 각 부분을 활용하는 일련의 CURL 요청에 대해 설명합니다.
POST 및 PUT 요청의 경우 컬 요청에 HTTP 1.0을 사용합니다. 이는 SSS가 기본적으로 작동하는 CherryPy 웹 서버가 해당 요청에 제대로 응답하지 않기 때문입니다(서버의 기능은 영향을 받지 않음에도 불구하고). SSS에 대한 프로그래밍에는 명시적으로 HTTP 1.0을 사용해야 한다는 것을 알 수 있습니다. 이는 SWORD 2.0의 요구 사항으로 간주되어서는 안 됩니다.
###입증
다양한 인증 결과를 보려면 서비스 문서에 대해 다음 요청을 시도해보세요. 기본적으로 SSS에는 다음과 같은 사용자 세부 정보가 있습니다.
사용자: 검
비밀번호 : 검
대리: 오보
컬 -i http://sword:sword@localhost:8080/sd-uri
On-Behalf-Of 사용자 없이 성공적인 인증
curl -i -H "X-On-Behalf-Of: obo" http://sword:sword@localhost:8080/sd-uri
On-Behalf-Of 사용자를 통한 성공적인 인증
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
올바른 사용자이지만 잘못된 On-Behalf-Of 사용자, 401 무단 응답
모든 후속 요청은 X-On-Behalf-Of 헤더를 사용하여 수행할 수 있습니다. 더 이상의 예시는 제공되지 않습니다
###서비스 문서 받기
HTTP: SD-URI에서 GET
curl -i http://sword:sword@localhost:8080/sd-uri
그러면 구성된 컬렉션 수가 나열된 서비스 문서가 반환됩니다.
###새로운 콘텐츠를 입금하세요
HTTP: Col-URI의 POST
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"이고 zip 파일임을 지정하여 Col-URI에 example.zip 파일을 게시합니다. X-Packaging 헤더가 없으면 이는 기본 SWORD 패키지로 해석됩니다. Col-URI는 서비스 문서에서 얻어야 합니다.
그러면 201 Created라는 HTTP 상태와 입금 영수증이 반환되어야 합니다.
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(현재 타임스탬프가 앞에 붙음))을 생성합니다. 그러면 201 Created라는 HTTP 상태와 Deposit Receipt가 반환되어야 합니다. 당신은 추가할 수 있습니다
-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에서 GET
curl -i sword:sword@[Col-URI]
그러면 각 원자:항목이 지정된 컬렉션의 컬렉션을 참조하는 Atom 피드가 반환됩니다. 이는 편의를 위해서만 구현되므로 전체 피드가 아닙니다. 대신 해당 컬렉션의 Edit-URI에 대한 href를 포함하는atom:link 요소만 포함됩니다.
###컨테이너 표현 가져오기(미디어 리소스)
HTTP: Cont-URI 또는 EM-URI에서 GET
curl -i [EM-URI]
서버에서 기본 배포 패키지를 가져옵니다. 이 경우 컬은 " / "로 Accept 헤더를 채웁니다. 그러면 컨테이너에 있는 모든 콘텐츠의 애플리케이션/zip 파일이 반환됩니다. SSS는 이를 예시 목적으로 콘텐츠의 공개 얼굴로 모델링하므로 이 요청에는 인증이 필요하지 않습니다.
FIXME: 이 콘텐츠 협상 방법은 현재 SSS에서 지원하지만 논의 중입니다.
curl -i -H "Accept: application/zip;swordpackage=http://www.swordapp.org/package/default" [EM-URI]
표준 Sword 패키지 형식의 zip 파일(부수적으로 일반 zip 파일)을 명시적으로 요청합니다.
curl -i -H "Accept: application/zip" [EM-URI]
콘텐츠의 일반 zip 파일을 명시적으로 요청합니다(표준 검 패키지와 다르지 않음).
curl -i -H "Accept: text/html" [EM-URI]
미디어 리소스의 HTML 표현을 명시적으로 요청합니다. 그러면 HTML 표현을 가리키는 Location 헤더가 포함된 302 Found HTTP 헤더가 반환됩니다.
curl -i -H "Accept: application/vnd+msword" [EM-URI]
415 지원되지 않는 미디어 유형 오류 생성
###기존 미디어 리소스를 새 미디어 리소스로 덮어쓰기
HTTP: EM-URI에 PUT
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 파일로 대체됩니다. 패키지 형식은 기본 Sword 패키지로 해석됩니다. 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와 Deposit Receipt가 반환됩니다.
###컨테이너 표현 가져오기
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]
이는 기본 형식과 동일한 Atom 항목 형식으로 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은 현지화된 이름으로 추가됩니다. 그러면 201 Created라는 HTTP 상태와 Deposit Receipt가 반환되어야 합니다. 위와 같이 -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 전제 조건 실패 오류가 발생합니다.
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 잘못된 요청 응답이 발생합니다.