Bắt đầu
OneEntry Platform SDK là một SDK cung cấp cách dễ dàng để tương tác với OneEntry Platform API.
🚀 Bắt đầu nhanh
Khởi động và chạy với OneEntry trong 3 bước đơn giản:
Cài đặt
npm install oneentry
2️⃣ Khởi tạo SDK
import { defineOneEntry } from 'oneentry';
const api = defineOneEntry('your-project-url', {
token: 'your-api-token'
});
3️⃣ Bắt đầu sử dụng API
// Fetch products
const products = await api.Products.getProducts({ limit: 10 });
// Get user profile
const user = await api.Users.getUser();
// Submit a form
const formData = await api.FormData.postFormsData('contact-form', {
name: 'John Doe',
email: 'john@example.com'
});
🎉 Chỉ vậy thôi! Bạn đã sẵn sàng để xây dựng những ứng dụng tuyệt vời với OneEntry.
Bạn đang sử dụng TypeScript? Mỗi kiểu công khai đều được xuất từ gốc gói và từ
oneentry/types—import type { IProductsEntity } from 'oneentry'. Xem Nhập các kiểu.
✨ Tính năng chính
Quản lý token tích hợp và hỗ trợ OAuth
Hỗ trợ i18n với phát hiện ngôn ngữ tự động
Định nghĩa kiểu đầy đủ, có thể nhập từ gốc gói
Gói ESM có thể loại bỏ — 9.7 kB gzip trong một thiết lập điển hình
28 mô-đun chuyên biệt cho tất cả nhu cầu của bạn
Bộ xử lý lỗi tùy chỉnh và chế độ shell
🌐 Tài nguyên
Tìm hiểu thêm về OneEntry Platform
Tạo tài khoản miễn phí của bạn
Tải xuống SDK
Thử nghiệm các phương thức SDK trực tiếp trong trình duyệt của bạn — không cần thiết lập
📖 Sử dụng chi tiết
Tất cả các mô-đun có sẵn
Nhập và phân tách tất cả các mô-đun bạn cần:
import { defineOneEntry } from 'oneentry'
const config = { token: 'your-app-token',}const { Admins, AttributesSets, AuthProvider, Blocks, Events, Filters, FileUploading, Forms, FormData, GeneralTypes, IntegrationCollections, Locales, Menus, Orders, Pages, Payments, ProductStatuses, Products, Search, Subscriptions, Settings, System, Templates, TemplatePreviews, UserActivity, Users, WS} = defineOneEntry('your-url', config);
Hoặc
const config = {
token: 'your-app-token',
};
const api = defineOneEntry('your-url', config);
Cấu hình
Tham số thứ hai của hàm khởi tạo nhận 'config'. Nó chứa các giá trị sau:
- 'token' - Đặt khóa token nếu dự án của bạn bảo mật "Security API Token". Nếu bạn đang sử dụng bảo vệ bằng chứng chỉ, không truyền biến này. Bạn có thể đọc thêm về bảo mật của dự án của bạn tại đây.
- 'langCode' - Đặt "langCode" để thiết lập ngôn ngữ mặc định. Bằng cách chỉ định tham số này một lần, bạn không cần phải truyền langCode cho các phương thức ONEENTRY API. Nếu bạn chưa truyền ngôn ngữ mặc định, nó sẽ được đặt là "en_US".
- 'traficLimit' - Một số phương thức sử dụng nhiều hơn một yêu cầu đến OneEntry để dữ liệu bạn nhận được đầy đủ và dễ làm việc. Truyền giá trị "true" cho tham số này để tiết kiệm lưu lượng và tự quyết định dữ liệu bạn cần. Giá trị mặc định là "false".
- 'rawData' - Khi được đặt là
false(mặc định), SDK tự động chuyển đổi mảngadditionalFieldsthành một đối tượng được khóa bởimarkerđể dễ dàng truy cập hơn. Đặt thànhtrueđể nhậnadditionalFieldsdưới dạng mảng gốc từ API. - 'guestId' - Một định danh khách tùy chọn được gửi dưới dạng tiêu đề
x-guest-idtrong các yêu cầu không xác thực, cho phép các luồng giỏ hàng/danh sách yêu thích/hoạt động của khách. Trong trình duyệt, nếu không có, một ID ổn định theo thiết bị được tạo ra và lưu trữ tronglocalStorage. Trên máy chủ, bạn phải truyền mộtguestIdtheo từng khách. Xem Chế độ khách bên dưới. Giá trị mặc định làundefined. - 'deviceMetadata' - Một chuỗi tùy chọn được gửi dưới dạng tiêu đề
x-device-metadata(trong các yêu cầu POST và làm mới token) thay vì dấu vân tay mà SDK tính toán từ môi trường hiện tại. API liên kết các token làm mới với tiêu đề này, vì vậy một máy chủ phát hành token thay mặt cho một trình duyệt phải đóng dấu dấu vân tay của trình duyệt ở đây. Xem Dữ liệu thiết bị bên dưới. Giá trị mặc định làundefined. - 'auth' - Một đối tượng với các cài đặt xác thực. Theo mặc định, SDK được cấu hình để làm việc với các token bên trong phiên của người dùng và không yêu cầu bất kỳ công việc bổ sung nào từ bạn. Đồng thời, SDK không lưu trạng thái phiên giữa các phiên. Nếu bạn hài lòng với các cài đặt như vậy, hãy không truyền biến 'auth' chút nào.
Đối tượng 'auth' chứa các cài đặt sau:
- 'refreshToken' - Token làm mới của người dùng. Chuyển nó ở đây từ kho để khôi phục phiên của người dùng trong quá trình khởi tạo.
- 'saveFunction' - Một hàm làm việc với token làm mới được cập nhật. Nếu bạn muốn lưu trữ token giữa các phiên, chẳng hạn như trong lưu trữ cục bộ, hãy truyền một hàm ở đây thực hiện điều này. Hàm phải chấp nhận một tham số mà chuỗi chứa token sẽ được truyền vào.
- 'customAuth' - Nếu bạn muốn cấu hình xác thực và làm việc với các token của riêng mình, hãy đặt cờ này thành true. Nếu bạn muốn sử dụng các cài đặt sdk, hãy đặt nó thành false hoặc không truyền nó chút nào.
- 'providerMarker' - Dấu hiệu cho nhà cung cấp xác thực. Mặc định: 'email'. Một ví dụ về cấu hình với bảo vệ token và xác thực tự động lưu trữ trạng thái giữa các phiên
const tokenFunction = (token) => {
localStorage.setItem('refreshToken', token);
};
const api = defineOneEntry('https://my-project.oneentry.cloud', {
token: 'my-token',
langCode: 'en_US',
auth: {
refreshToken: localStorage.getItem('refreshToken'),
saveFunction: tokenFunction,
providerMarker: 'email'
},
});
Một ví dụ về cấu hình được bảo vệ bằng chứng chỉ cho phép bạn tự cấu hình hệ thống xác thực và lưu trữ dữ liệu trên các yêu cầu.
const api = defineOneEntry('https://my-project.oneentry.cloud', {
langCode: 'en_US',
traficLimit: true,
auth: {
customAuth: true,
refreshToken: localStorage.getItem('refreshToken'),
providerMarker: 'email'
},
});
Nếu bạn đã chọn cấu hình các token của riêng mình, bạn có thể truyền token vào phương thức như sau. Phương thức trung gian cho phép bạn truyền một token truy cập vào yêu cầu. Sau đó gọi phương thức cần thiết. Phương thức này (setAccessToken) không nên được gọi nếu phương thức không yêu cầu xác thực người dùng.
const user = api.Users.setAccessToken('my.access.token').getUser();
Nếu bạn đã chọn bảo vệ token để đảm bảo an toàn kết nối, chỉ cần truyền token của bạn vào hàm như một tham số tùy chọn.
Bạn có thể nhận token như sau
- Đăng nhập vào tài khoản cá nhân của bạn
- Đi đến tab "Dự án" và chọn một dự án
- Đi đến tab "Truy cập"
- Đặt công tắc thành "Security API Token"
- Đăng nhập vào dự án, đi đến phần cài đặt và mở tab token
- Nhận và sao chép token của dự án bạn
Bạn cũng có thể kết nối một chứng chỉ tls để bảo vệ dự án của bạn. Trong trường hợp này, không truyền "token" chút nào. Khi sử dụng chứng chỉ, hãy thiết lập một proxy trong dự án của bạn. Truyền một chuỗi rỗng làm tham số url. Tìm hiểu thêm về chứng chỉ mtls
const saveTokenFromLocalStorage = (token) => {
localStorage.setItem('refreshToken', token);
};
const api = defineOneEntry('your-url', {
token: 'my-token',
langCode: 'my-langCode',
auth: {
customAuth: false,
userToken: 'rerfesh.token',
saveFunction: saveTokenFromLocalStorage,
providerMarker: 'email'
},
});
Chế độ khách
SDK có thể hoạt động thay mặt cho một khách không xác thực. Khi không có token truy cập nào được thiết lập, nó gửi một tiêu đề x-guest-id trong các yêu cầu, cho phép các điểm cuối nhận biết khách hoạt động mà không cần người dùng đăng nhập - các luồng giỏ hàng, danh sách yêu thích và hoạt động người dùng, cũng như các khối cá nhân hóa (đã xem gần đây, gợi ý cá nhân, và những cái khác).
Cách xác định guest id:
- Một
guestIdđược cấu hình rõ ràng (từconfig.guestIdhoặcsetGuestId) luôn thắng. - Trong trình duyệt, khi không có, một ID ổn định được tạo ra (thông qua Web Crypto khi có sẵn) và được lưu trữ trong
localStoragedưới khóaoneentry_guest_id, phản ánh chiến lược dữ liệu thiết bị. Nó giữ ổn định qua các phiên và tab. - Nếu không, ID là
undefinedvà tiêu đềx-guest-idđơn giản bị bỏ qua.
⚠️ Phía máy chủ: SDK không bao giờ tự động tạo một guest id trên máy chủ. Một phiên bản chia sẻ duy nhất của
defineOneEntrysẽ rò rỉ một giỏ hàng/danh sách yêu thích của khách giữa tất cả các khách truy cập ẩn danh. Trên máy chủ, bạn phải tự truyền mộtguestIdtheo từng khách (thông quaconfig.guestIdhoặcsetGuestId).
Tiêu đề bị bỏ qua cho các yêu cầu đã xác thực (khi một token truy cập được thiết lập), vì vậy một người dùng đã đăng nhập luôn hoạt động trên dữ liệu của riêng họ.
Đặt guest id khi khởi tạo
const api = defineOneEntry('https://my-project.oneentry.cloud', {
token: 'my-token',
guestId: 'visitor-123', // per-visitor id, required on the server
});
Đặt hoặc xóa guest id tại thời gian chạy
setGuestId hoạt động giống như setAccessToken - nó có thể nối chuỗi và trả về phiên bản mô-đun. Truyền một chuỗi rỗng để xóa nó (SDK sau đó sẽ quay lại ID được hỗ trợ bởi localStorage trong trình duyệt, hoặc không có guest id nào trên máy chủ).
// Set the guest id, then call a guest-aware method
const cart = await api.Users.setGuestId('visitor-123').getCart();
// Clear the guest id
api.Users.setGuestId('');
Dữ liệu thiết bị
SDK gửi một tiêu đề x-device-metadata trong các yêu cầu POST và khi làm mới token. Theo mặc định, nó là một dấu vân tay được tính toán từ môi trường hiện tại (nền tảng, tác nhân người dùng, ngôn ngữ, màn hình, múi giờ, cộng với một ID phiên ổn định), được API sử dụng cho phân tích và chống gian lận.
API liên kết các token làm mới với tiêu đề này. Một token làm mới được phát hành trong khi một dấu vân tay được gửi chỉ có thể được làm mới trong khi cùng một dấu vân tay được gửi — điều này chính xác là vấn đề khi token được phát hành trên máy chủ thay mặt cho một trình duyệt (ví dụ, một mã OAuth trao đổi giữ bí mật của khách hàng ở phía máy chủ): token sẽ được liên kết với dấu vân tay của máy chủ và trình duyệt sẽ không bao giờ có thể làm mới nó.
deviceMetadata giải quyết vấn đề này: máy chủ đóng dấu dấu vân tay của trình duyệt, và token làm mới được phát hành vẫn có thể được làm mới từ trình duyệt đó.
Đọc giá trị trong trình duyệt
getDeviceMetadata() có sẵn trên mọi mô-đun và trả về chính xác chuỗi mà SDK gửi — giá trị ghi đè nếu có, nếu không thì là dấu vân tay đã tính toán:
// Browser: obtain the fingerprint and forward it to your backend
const deviceMetadata = api.Users.getDeviceMetadata();
await fetch('/api/oauth/exchange', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ code, deviceMetadata }),
});
Đặt giá trị ghi đè
Truyền nó khi khởi tạo:
const api = defineOneEntry('https://my-project.oneentry.cloud', {
token: 'my-token',
deviceMetadata, // the string forwarded from the browser
});
Hoặc đặt nó tại thời gian chạy với setDeviceMetadata(deviceMetadata) — có sẵn trên mọi mô-đun và có thể nối chuỗi, giống như setAccessToken. Truyền một chuỗi rỗng sẽ xóa giá trị ghi đè và quay lại dấu vân tay đã tính toán:
// Server: issue tokens bound to the browser's fingerprint
const auth = await api.AuthProvider
.setDeviceMetadata(deviceMetadata)
.auth('email', authData);
// Clear the override
api.AuthProvider.setDeviceMetadata('');
| Phương thức | Trả về | Mô tả |
|---|---|---|
getDeviceMetadata() | string | Chuỗi x-device-metadata mà phiên bản này gửi (ghi đè, hoặc dấu vân tay đã tính toán) |
setDeviceMetadata(value) | phiên bản mô-đun | Đặt giá trị ghi đè; một chuỗi rỗng sẽ xóa nó |
Xác thực phản hồi API
OneEntry SDK bao gồm xác thực tùy chọn cho các phản hồi API bằng cách sử dụng Zod, một thư viện xác thực sơ đồ đầu tiên của TypeScript. Tính năng này giúp đảm bảo tính toàn vẹn dữ liệu và an toàn kiểu khi làm việc với các phản hồi API.
Tính năng
- Tùy chọn: Xác thực bị vô hiệu hóa theo mặc định và có thể được kích hoạt theo cấu hình
- An toàn kiểu: Sử dụng các sơ đồ Zod phù hợp với các giao diện TypeScript
- Hai chế độ: Chế độ mềm (ghi lại lỗi) và chế độ nghiêm ngặt (trả về lỗi)
- Chi phí bằng không khi bị vô hiệu hóa: Zod và các sơ đồ phản hồi được tải theo yêu cầu — lần đầu tiên một phản hồi thực sự cần được xác thực. Khi xác thực bị tắt, chúng không bao giờ đến gói của bạn (xem Kích thước gói & Định dạng mô-đun)
Cấu hình
Kích hoạt xác thực bằng cách thêm thuộc tính validation vào cấu hình SDK của bạn:
import { defineOneEntry } from 'oneentry'
const api = defineOneEntry('https://your-project.oneentry.cloud', {
token: 'your-token',
validation: {
enabled: true, // Enable validation (default: false)
strictMode: false, // Strict mode (default: false)
logErrors: true, // Log validation errors (default: true)
}
})
Tùy chọn cấu hình
| Tùy chọn | Loại | Mặc định | Mô tả |
|---|---|---|---|
enabled | boolean | false | Kích hoạt/vô hiệu hóa xác thực phản hồi |
strictMode | boolean | false | Khi true, trả về IError khi xác thực thất bại. Khi false, ghi lại lỗi và trả về dữ liệu gốc |
logErrors | boolean | true | Ghi lại lỗi xác thực vào bảng điều khiển (hữu ích cho việc gỡ lỗi) |
Chế độ xác thực
Chế độ mềm (Mặc định)
Khi strictMode là false, các lỗi xác thực được ghi lại vào bảng điều khiển, nhưng phản hồi API gốc được trả về không thay đổi. Điều này hữu ích trong quá trình phát triển để xác định các bất thường dữ liệu tiềm năng mà không làm hỏng ứng dụng của bạn.
const api = defineOneEntry('https://your-project.oneentry.cloud', {
token: 'your-token',
validation: {
enabled: true,
strictMode: false, // Soft mode
logErrors: true,
}
})
// Even if validation fails, you'll get the API response
const user = await api.Users.getUser()
// Console will show validation errors if any
Chế độ nghiêm ngặt
Khi strictMode là true, các lỗi xác thực trả về một đối tượng IError thay vì dữ liệu. Điều này đảm bảo ứng dụng của bạn chỉ xử lý dữ liệu đã được xác thực.
const api = defineOneEntry('https://your-project.oneentry.cloud', {
token: 'your-token',
validation: {
enabled: true,
strictMode: true, // Strict mode
logErrors: true,
}
})
const user = await api.Users.getUser()
// Check if response is an error
if ('statusCode' in user) {
console.error('Validation failed:', user.message)
} else {
// Type-safe: user is IUserEntity
console.log('User:', user.email)
}
Định dạng các trường bổ sung
Theo mặc định, SDK chuyển đổi thuộc tính additionalFields từ một mảng (như được trả về bởi API) thành một đối tượng được khóa bởi marker. Điều này giúp dễ dàng truy cập các trường cụ thể mà không cần biết chỉ số của chúng.
Hành vi mặc định (rawData: false)
const api = defineOneEntry('https://your-project.oneentry.cloud', {
token: 'your-token',
// rawData is false by default — no need to pass it explicitly
})
// additionalFields is an object keyed by marker:
const field = attribute.additionalFields['my_field']
console.log(field.value) // direct access, no array search needed
Chế độ thô (rawData: true)
Nếu bạn cần định dạng phản hồi gốc của API (ví dụ: để tương thích ngược), hãy đặt rawData: true:
const api = defineOneEntry('https://your-project.oneentry.cloud', {
token: 'your-token',
rawData: true,
})
// additionalFields is the original array from the API:
const field = attribute.additionalFields.find(f => f.marker === 'my_field')
console.log(field.value)
Tùy chọn cấu hình
| Tùy chọn | Loại | Mặc định | Mô tả |
|---|---|---|---|
rawData | boolean | false | Khi false, additionalFields được chuyển đổi thành một đối tượng được khóa bởi marker. Khi true, mảng gốc từ API được trả về |
Phần còn lại của việc chuẩn hóa mà SDK áp dụng cho các giá trị thuộc tính - giải nén tệp đơn, chuyển đổi số,
nullcho các giá trị chưa được thiết lập, sắp xếp theoposition- được mô tả trong Giá trị thuộc tính.
Lỗi
Nếu bạn muốn thoát khỏi lỗi bên trong sc, hãy để thuộc tính "errors" theo mặc định. Trong trường hợp này, bạn sẽ nhận được dữ liệu thực thể hoặc đối tượng lỗi. Bạn cần thực hiện kiểm tra kiểu. ví dụ, bằng cách kiểm tra thuộc tính statusCode với ".hasOwnProperty"
Tuy nhiên, nếu bạn muốn sử dụng cấu trúc "try catch(e) ", hãy đặt thuộc tính "isShell" thành giá trị "false". Trong trường hợp này, bạn cần xử lý lỗi bằng cách sử dụng "try catch(e) ".
Ngoài ra, bạn có thể truyền các hàm tùy chỉnh sẽ được gọi bên trong sdk với mã lỗi thích hợp. Các hàm này nhận một đối tượng lỗi làm đối số. Bạn có thể xử lý nó theo cách của riêng bạn.
const api = defineOneEntry('your-url', {
token: 'my-token',
langCode: 'my-langCode',
errors: {
isShell: false,
customErrors: {
400: (error) => console.error('Bad Request:', error.message),
401: (error) => console.error('Unauthorized:', error.message),
403: (error) => console.error('Forbidden:', error.message),
404: (error) => console.error('Not Found:', error.message),
429: (error) => console.error('Rate Limit Exceeded:', error.message),
500: (error) => console.error('Server Error:', error.message),
502: (error) => console.error('Bad Gateway:', error.message),
503: (error) => console.error('Service Unavailable:', error.message),
504: (error) => console.error('Gateway Timeout:', error.message),
},
},
})
Khi tùy chọn isShell: false được đặt trong cấu hình SDK, nó có tác động sau:
Khi xảy ra lỗi trong các yêu cầu API (ví dụ: lỗi HTTP 400, 401, 404, 500, v.v., hoặc lỗi mạng), SDK sẽ ném ra một ngoại lệ thay vì trả về đối tượng lỗi như một giá trị bình thường.
Điều này cho phép bạn sử dụng cấu trúc try/catch trong mã ứng dụng của bạn để xử lý lỗi:
try {
const result = await api.someMethod();
// Handling a successful result
} catch (error) {
// Error handling
}
Nếu isShell: true, lỗi được trả về như các giá trị, và bạn sẽ cần kiểm tra rõ ràng loại kết quả để xác minh:
const result = await api.someMethod();
if ('statusCode' in result) { // Assumes the presence of a statusCode property on the error object
// Error handling
} else {
// Handling a successful result
}
Do đó, isShell: false cho phép một mô hình xử lý lỗi quen thuộc hơn với try/catch, trong khi isShell: true cung cấp một mô hình phẳng nơi lỗi và thành công được trả về như các giá trị của cùng một loại.
Khi sử dụng SDK với cài đặt mặc định (isShell được đặt thành true), lỗi được trả về như các giá trị thay vì bị ném ra như các ngoại lệ. Điều này có nghĩa là ứng dụng sẽ không bị sập do các ngoại lệ không được xử lý, vì lỗi được xử lý như một phần của luồng thực thi bình thường. Dưới đây là cách bạn có thể xử lý lỗi ở phía trước mà không cần sử dụng try/catch:
Kiểm tra loại trả về sau khi gọi một phương thức API:
const result = await api.someMethod();
// Check if the result is an error
if ('statusCode' in result || 'message' in result) {
// Error handling
console.error('Error:', result);
} else {
// Handling a successful result
console.log('Success:', result);
}
Bạn cũng có thể tạo các loại tiện ích "IError" để kiểm tra lỗi:
import type { IError } from 'oneentry';
function isErrorResult(result: any): result is IError {
return result && typeof result === 'object' &&
(result.hasOwnProperty('statusCode') ||
result.hasOwnProperty('message'));
}
// Then use it like this:
const result = await api.someMethod();
if (isErrorResult(result)) {
// Error handling
console.error('Произошла ошибка:', result);
} else {
// Handling a successful result
console.log('Успешный результат:', result);
}
Cách tiếp cận này cho phép bạn tránh sử dụng các cấu trúc try/catch trong khi vẫn xử lý đúng các lỗi, ngăn chặn ứng dụng bị sập.
📚 Các bước tiếp theo
Khám phá các hướng dẫn toàn diện của chúng tôi để tìm hiểu thêm:
Thương mại điện tử
Xây dựng danh mục sản phẩm với bộ lọc và tìm kiếm
Quản lý người dùng
Thực hiện xác thực và hồ sơ người dùng
Đơn hàng & Thanh toán
Xử lý đơn hàng và thanh toán
Trang & Nội dung
Quản lý các trang động và cấu trúc nội dung
Biểu mẫu
Tìm hiểu cách xử lý các biểu mẫu
Dữ liệu biểu mẫu
Tìm hiểu cách xử lý dữ liệu biểu mẫu
Nhập các kiểu
Nhập mọi kiểu SDK từ 'oneentry' hoặc 'oneentry/types'
Kích thước gói
Gói ESM, loại bỏ cây và Zod / socket.io theo yêu cầu
Giá trị thuộc tính
Hình dạng chuẩn hóa mà mỗi thuộc tính đến
Khoảng thời gian
Mở rộng lịch trình thành các khoảng thời gian đặt chỗ cụ thể