Cloud Drive30s: Hướng dẫn kết nối API cơ bản

  • Wednesday 04/10/2023

API cơ bản

Tài liệu này cung cấp tổng quan nhanh về các hoạt động WebDAV được hỗ trợ trong Cloud Drive30s, để mọi thứ dễ đọc, tài liệu này sẽ không đi sâu vào nhiều chi tiết cho từng hoạt động, bạn có thể tìm thêm thông tin cho từng hoạt động trong RFC tương ứng nếu có.

 

Thông tin cơ bản về WebDAV

Url cơ sở cho tất cả các hoạt động WebDAV cho phiên bản Cloud Drive30s là /remote.php/webdav.

Để lấy URL chính xác bạn cần đăng nhập vào link web Cloud Drive30s (ví dụ: https://clouddrive30s.superdata.vn/) sau đó nhấn vào Settings (góc trái bên dưới màn hình sau khi đăng nhập) khi đó sẽ hiển thị link WebDAV

api-webdav

Tất cả các yêu cầu cần cung cấp thông tin xác thực, dưới dạng tiêu đề xác thực cơ bản hoặc bằng cách chuyển một tập hợp cookie phiên hợp lệ.

Nếu cài đặt Cloud Drive30s của bạn sử dụng nhà cung cấp xác thực bên ngoài (chẳng hạn như máy chủ OIDC), bạn có thể phải tạo mật khẩu ứng dụng. Để làm điều đó, hãy đi tới cài đặt bảo mật cá nhân của bạn và tạo một cài đặt. Nó sẽ cung cấp tên người dùng và mật khẩu mà bạn có thể sử dụng trong tiêu đề Xác thực cơ bản.

Tạo yêu cầu kiểm tra

Sử dụng curl

Tất cả các yêu cầu WebDAV có thể được kiểm tra dễ dàng curl bằng cách chỉ định phương thức yêu cầu ( GETPROPFINDPUT…) và cung cấp nội dung yêu cầu khi cần.

Ví dụ: bạn có thể thực hiện PROPFIND yêu cầu tìm tệp trong thư mục bằng cách sử dụng:

curl 'https://cloud.example.com/remote.php/dav/files/username/folder' \
  --user username:password \
  --request PROPFIND \
  --data '<?xml version="1.0" encoding="UTF-8"?>
    <d:propfind xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns" xmlns:nc="http://nextcloud.org/ns">
      <d:prop>
        <d:getlastmodified/>
        <d:getcontentlength/>
        <d:getcontenttype/>
        <oc:permissions/>
        <d:resourcetype/>
        <d:getetag/>
      </d:prop>
    </d:propfind>'

Tạo yêu cầu kiểm tra với JavaScript

Đây là mẫu mã JavaScript để giúp bạn bắt đầu:

import { createClient } from 'webdav'
import { generateRemoteUrl } from '@nextcloud/router'
import { getCurrentUser } from '@nextcloud/auth'

const client = createClient(generateRemoteUrl('dav'))
const response = await client.getDirectoryContents(`/files/${getCurrentUser()?.uid}/folder`, {
        details: true,
        data: `<?xml version="1.0" encoding="UTF-8"?>
                <d:propfind xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns" xmlns:nc="http://nextcloud.org/ns">
                        <d:prop>
                                <d:getlastmodified/>
                                <d:getcontentlength/>
                                <d:getcontenttype/>
                                <oc:permissions/>
                                <d:resourcetype/>
                                <d:getetag/>
                        </d:prop>
                </d:propfind>`,
})

Yêu cầu thuộc tính

Theo mặc định, một PROPFIND yêu cầu sẽ chỉ trả về một số lượng nhỏ thuộc tính cho mỗi tệp: ngày sửa đổi lần cuối, kích thước tệp, cho dù đó là thư mục, etag và loại mime.

Bạn có thể yêu cầu các thuộc tính bổ sung bằng cách gửi nội dung yêu cầu kèm theo PROPFIND yêu cầu liệt kê tất cả các thuộc tính được yêu cầu.

<?xml version="1.0"?>
<d:propfind xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns" xmlns:nc="http://nextcloud.org/ns">
  <d:prop>
        <d:getlastmodified />
        <d:getetag />
        <d:getcontenttype />
        <d:resourcetype />
        <oc:fileid />
        <oc:permissions />
        <oc:size />
        <d:getcontentlength />
        <nc:has-preview />
        <oc:favorite />
        <oc:comments-unread />
        <oc:owner-display-name />
        <oc:share-types />
        <nc:contained-folder-count />
        <nc:contained-file-count />
  </d:prop>
</d:propfind>

Lưu ý về không gian tên URI

Khi xây dựng nội dung yêu cầu DAV, bạn sẽ yêu cầu các thuộc tính có sẵn trong URI không gian tên cụ thể. Thông thường người ta khai báo tiền tố cho các vùng tên đó trong d:propfind phần tử của phần thân.

Đây là danh sách các không gian tên có sẵn:

Và đây là giao diện của nó trong yêu cầu DAV của bạn:

<?xml version="1.0"?>
        <d:propfind
                xmlns:d="DAV:"
                xmlns:oc="http://owncloud.org/ns"
                xmlns:nc="http://nextcloud.org/ns"
                xmlns:ocs="http://open-collaboration-services.org/ns">
                xmlns:ocm="http://open-cloud-mesh.org/ns">
        ...

Thuộc tính được hỗ trợ

Thuộc tính Mô tả Ví dụ
<d:creationdate /> The creation date of the node. 1970-01-01T00:00:00+00:00
<d:getlastmodified /> The latest modification time. Wed, 20 Jul 2022 05:12:23 GMT
<d:getetag /> The file’s etag. &quot;6436d084d4805&quot;
<d:getcontenttype /> The mime type of the file. image/jpeg
<d:resourcetype /> Specifies the nature of the resource. <d:collection /> for a folder
<d:getcontentlength /> The size if it is a file in bytes. 3030237
<d:getcontentlanguage /> The language of the content. en
<d:displayname /> A name suitable for presentation. File name
<d:lockdiscovery />
Dummy endpoint for class 2 WebDAV support.
Should return the list of lock, but
always return an empty response.
<d:lockdiscovery />
<d:supportedlock />
Dummy endpoint for class 2 WebDAV support.
Always provide the same lock capabilities.
<d:lockentry>
<d:lockscope><d:exclusive /></d:lockscope>
<d:locktype><d:write /></d:locktype></d:lockentry>
</d:lockentry>
<d:lockentry>
<d:lockscope><d:shared /></d:lockscope>
<d:locktype><d:write /></d:locktype>
</d:lockentry>
<oc:id />
The fileid namespaced by the instance id.
Globally unique.
00000007oc9l3j5ur4db
<oc:fileid /> The unique id for the file within the instance. 7
<oc:downloadURL />
A URL to directly download the file from a
storage. No storage implements that yet.
<oc:permissions />
The permissions that the user has over the
file. The value is a string containing
letters for all available permissions.
S: Shared
R: Shareable
M: Mounted
G: Readable
D: Deletable
NV: Updateable, Renameable, Moveable
W: Updateable (file)
CK: Creatable
<nc:creation_time /> Same as creationdate, but as a timestamp. 1675789581
<nc:mount-type /> The type of mount.
'' = local
'shared' = received share
'group' = group folder
'external' = external storage
'external-session' = external storage
<nc:is-encrypted /> Whether the folder is end-to-end encrypted.
0 for false
1 for true
<oc:tags /> List of user specified tags. <oc:tag>test</oc:tag>
<oc:favorite /> The favorite state.
0 for not favourited
1 for favourited
<oc:comments-href /> The DAV endpoint to fetch the comments. /remote.php/dav/comments/files/{fileId}
<oc:comments-count /> The number of comments. 2
<oc:comments-unread /> The number of unread comments. 0
<oc:owner-id /> The user id of the owner of a shared file. alice
<oc:owner-display-name /> The display name of the owner of a shared file. Alice
<oc:share-types /> XML array of share types.
<oc:share-type>{shareTypeId}</oc:share-type>
0 = User
1 = Group
3 = Public link
4 = Email
6 = Federated cloud share
7 = Circle
8 = Guest
9 = Remote group
10 = Talk conversation
12 = Deck
15 = Science mesh
<ocs:share-permissions />
The permissions that the
user has over the share.
1 = Read
2 = Update
4 = Create
8 = Delete
16 = Share
31 = All
<ocm:share-permissions />
The permissions that the user has
over the share as a JSON array.
["share", "read", "write"]
<nc:share-attributes /> User set attributes as a JSON array. [{ "scope" => <string>, "key" => <string>, "enabled" => <bool> }]
<nc:sharees /> The list of share recipient.
<nc:sharee>
<nc:id>alice</nc:id>
<nc:display-name>Alice</nc:display-name>
<nc:type>0</nc:type>
</nc:sharee>
<oc:checksums /> An array of checksums. <oc:checksum>md5:04c36b75222cd9fd47f2607333029106</oc:checksum>
<nc:has-preview /> Whether a preview of the file is available. true or false
<oc:size />
Unlike getcontentlength, this property
also works for folders, reporting the size of
everything in the folder. Size is in bytes.
127815235
<oc:quota-used-bytes /> Amount of bytes used in the folder. 3950773
<oc:quota-available-bytes /> Amount of available bytes in the folder.
3950773
-1 Uncomputed free space.
-2 Unknown free space.
-3 Unlimited free space.
<nc:rich-workspace-file /> The id of the workspace file. 3456
<nc:rich-workspace /> The content of the workspace file.
<nc:upload_time /> Date this file was uploaded. 1675789581
<nc:note /> Share note.
<nc:contained-folder-count />
The number of folders directly contained
in the folder (not recursively).
<nc:contained-file-count />
The number of files directly contained
in the folder (not recursively).
<nc:data-fingerprint />
Used by the clients to find out
if a backup has been restored.
<nc:acl-enabled> Whether ACL is enabled for this group folder. 1 or 0
<nc:acl-can-manage> Wether the current user can manager ACL. 1 or 0
<nc:acl-list> Array of ACL rules.
<nc:acl>
<nc:acl-mapping-type>group</nc:acl-mapping-type>
<nc:acl-mapping-id>admin</nc:acl-mapping-id>
<nc:acl-mapping-display-name>admin</nc:acl-mapping-display-name>
<nc:acl-mask>20</nc:acl-mask>
<nc:acl-permissions>15</nc:acl-permissions>
</nc:acl>
<nc:inherited-acl-list> Array of ACL rules from the parents folders See <nc:acl-list>
<nc:group-folder-id> Numerical id of that group folder. 1
<nc:lock> Wether the file is locked. 1 or 0
<nc:lock-owner-type> Type of the owner of the lock. 0 = User 1 = Office or Text 2 = WebDAV
<nc:lock-owner> User id of the owner of the lock. alice
<nc:lock-owner-displayname> Display name of the owner of the lock. Alice
<nc:lock-owner-editor> App id of an app owned lock.
<nc:lock-time> Date when the lock was created as a timestamp. 1675789581
<nc:lock-timeout> TTL of the lock in seconds staring from the creation time. 0 = No timeout
<nc:lock-token> The token of the lock. files_lock/0e53dfb6-61b4-46f0-b38e-d9a428292998
<nc:file-metadata-size> The pixel-size of an image. {&quot;width&quot;:451,&quot;height&quot;:529}
<nc:file-metadata-gps> The GPS location of a file taken from EXIF data. {&quot;latitude&quot;:52.52093727702034,&quot;longitude&quot;:13.397258069518614}

Liệt kê danh sách thư mục (rfc4918)

Nội dung của một thư mục có thể được liệt kê bằng cách gửi PROPFIND yêu cầu đến thư mục đó.

PROPFIND remote.php/dav/files/user/path/to/folder

Lấy thuộc tính của thư mục 

Bạn có thể yêu cầu các thuộc tính của thư mục mà không cần lấy nội dung thư mục bằng cách thêm tiêu đề vào yêu cầu.Depth: 0

Tải tập tin xuống

Có thể tải xuống tệp bằng cách gửi GET yêu cầu tới url WebDAV của tệp.

GET remote.php/dav/files/user/path/to/file

Tải tập tin lên

Một tệp có thể được tải lên bằng cách gửi PUT yêu cầu tới tệp và gửi nội dung tệp thô làm nội dung yêu cầu.

PUT remote.php/dav/files/user/path/to/file

Mọi tập tin hiện có sẽ bị ghi đè bởi yêu cầu.

Tạo thư mục ( rfc4918 )

Một thư mục có thể được tạo bằng cách gửi MKCOL yêu cầu đến thư mục đó.

MKCOL remote.php/dav/files/user/path/to/new/folder

Xóa tập tin và thư mục ( rfc4918 )

Một tập tin hoặc thư mục có thể bị xóa bằng cách gửi DELETE yêu cầu tới tập tin hoặc thư mục đó.

DELETE remote.php/dav/files/user/path/to/file

Khi xóa một thư mục, nội dung của nó sẽ bị xóa đệ quy.

Di chuyển tập tin và thư mục ( rfc4918 )

Có thể di chuyển tệp hoặc thư mục bằng cách gửi MOVE yêu cầu tới tệp hoặc thư mục và chỉ định đích trong Destination tiêu đề là url đầy đủ.

MOVE remote.php/dav/files/user/path/to/file
Destination: https://cloud.example/remote.php/dav/files/user/new/location

Hành vi ghi đè của thao tác di chuyển có thể được kiểm soát bằng cách đặt phần Overwrite đầu thành T hoặc F để bật hoặc tắt ghi đè tương ứng.

Sao chép tập tin và thư mục ( rfc4918 )

Có thể sao chép tệp hoặc thư mục bằng cách gửi COPY yêu cầu tới tệp hoặc thư mục đó và chỉ định đích trong Destination tiêu đề là url đầy đủ.

COPY remote.php/dav/files/user/path/to/file
Destination: https://cloud.example/remote.php/dav/files/user/new/location

Hành vi ghi đè của bản sao có thể được kiểm soát bằng cách đặt phần Overwrite đầu thành T hoặc F để bật hoặc tắt ghi đè tương ứng.

Cài đặt yêu thích

Một tệp hoặc thư mục có thể được đánh dấu là yêu thích bằng cách gửi PROPPATCH yêu cầu đến tệp hoặc thư mục đó và đặt oc-favorite thuộc tính

PROPPATCH remote.php/dav/files/user/path/to/file
<?xml version="1.0"?>
<d:propertyupdate xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns">
  <d:set>
        <d:prop>
          <oc:favorite>1</oc:favorite>
        </d:prop>
  </d:set>
</d:propertyupdate>

Đặt oc:favorite thuộc tính để 1 đánh dấu một tệp là yêu thích, đặt thuộc tính đó để 0 bỏ đánh dấu tệp đó là yêu thích.

Danh sách yêu thích

Có thể truy xuất mục yêu thích của người dùng bằng cách gửi REPORT yêu cầu và chỉ định oc:favorite làm bộ lọc

REPORT remote.php/dav/files/user/path/to/folder
<?xml version="1.0"?>
<oc:filter-files  xmlns:d="DAV:" xmlns:oc="http://owncloud.org/ns" xmlns:nc="http://nextcloud.org/ns">
         <oc:filter-rules>
                 <oc:favorite>1</oc:favorite>
         </oc:filter-rules>
 </oc:filter-files>

Các thuộc tính tệp có thể được yêu cầu bằng cách thêm một <d:prop/> phần tử vào yêu cầu liệt kê các thuộc tính được yêu cầu theo cách tương tự như cách thực hiện cho một PROPFIND yêu cầu.

Khi liệt kê các mục yêu thích, yêu cầu sẽ tìm đệ quy tất cả các mục yêu thích trong thư mục, tất cả các mục yêu thích của người dùng có thể được tìm thấy bằng cách gửi yêu cầu tớiremote.php/dav/files/user

Tiêu đề đặc biệt

Request Headers

Bạn có thể đặt một số tiêu đề đặc biệt mà Cloud Drive30s sẽ diễn giải.

Header Mô tả Ví dụ
X-OC-MTime
Cho phép chỉ định thời gian sửa đổi.
Phản hồi sẽ chứa tiêu đềX-OC-MTime: accepted
nếu mtime được chấp nhận.
1675789581
X-OC-CTime
Cho phép chỉ định thời gian tạo.
Phản hồi sẽ chứa tiêu đềX-OC-CTime: accepted
nếu mtime được chấp nhận.
1675789581
OC-Checksum
Checksum sẽ được lưu trữ trong DB.
Máy chủ sẽ không thực hiện bất kỳ loại xác nhận nào.
md5:04c36b75222cd9fd47f2607333029106
X-Hash
Cho phép yêu cầu hàm băm của tệp từ máy chủ.
Máy chủ sẽ trả về hàm băm trong tiêu đề có tên:
X-Hash-MD5X-Hash-SHA1, or X-Hash-SHA256.
md5sha1, or sha256
OC-Chunked Chỉ định rằng dữ liệu đã gửi là một phần của tải lên từng đoạn true
OC-Total-Length
Chứa tổng kích thước của tệp trong quá trình tải lên từng đoạn.Điều này cho phép máy chủ hủy bỏ nhanh hơn nếu phần còn lại hạn ngạch của người dùng là không đủ
4052412

Response Headers

Header Mô tả Ví dụ
OC-Etag
Khi tạo, di chuyển và sao chép,
phản hồi chứa etag của tập tin.
"50ef2eba7b74aa84feff013efee2a5ef"
OC-FileId
Khi tạo, di chuyển và sao chép,
phản hồi chứa fileid của tập tin.
Định dạng: <padded-id><instance-id>.
Ví dụ: 00000259oczn5x60nrdu

Bạn có thể tham khảo thêm các bài viết hướng dẫn sử dụng Cloud Drive30s tại link https://kb.pavietnam.vn/category/giai-phap/cloud-drive

Rate this post