Trình kích hoạt https.onCall
cho Cloud Functions là một trình kích hoạt HTTPS có định dạng cụ thể cho yêu cầu và phản hồi. Phần này cung cấp thông số kỹ thuật cho các định dạng yêu cầu và phản hồi HTTPS mà SDK ứng dụng sử dụng để triển khai API. Thông tin này có thể hữu ích cho bạn nếu bạn không thể đáp ứng các yêu cầu bằng cách sử dụng nền tảng Android, Apple hoặc SDK web.
Định dạng yêu cầu: tiêu đề
Yêu cầu HTTP đến điểm cuối của trình kích hoạt có thể gọi phải là POST
với các tiêu đề sau:
- Bắt buộc:
Content-Type: application/json
- Cho phép
; charset=utf-8
không bắt buộc.
- Cho phép
- Không bắt buộc:
Authorization: Bearer <token>
- Mã thông báo mã nhận dạng người dùng Firebase Authentication cho người dùng đã đăng nhập đưa ra yêu cầu. Phần phụ trợ sẽ tự động xác minh mã thông báo này và cung cấp mã thông báo trong
context
của trình xử lý. Nếu mã thông báo không hợp lệ, yêu cầu sẽ bị từ chối.
- Mã thông báo mã nhận dạng người dùng Firebase Authentication cho người dùng đã đăng nhập đưa ra yêu cầu. Phần phụ trợ sẽ tự động xác minh mã thông báo này và cung cấp mã thông báo trong
- Không bắt buộc:
Firebase-Instance-ID-Token: <iid>
- Mã thông báo đăng ký FCM từ SDK ứng dụng Firebase. Đây phải là một chuỗi. Bạn có thể tìm thấy thông tin này trong
context
của trình xử lý. Mã này được dùng để nhắm mục tiêu thông báo đẩy.
- Mã thông báo đăng ký FCM từ SDK ứng dụng Firebase. Đây phải là một chuỗi. Bạn có thể tìm thấy thông tin này trong
- Không bắt buộc:
X-Firebase-AppCheck: <token>
- Mã thông báo Kiểm tra ứng dụng Firebase do ứng dụng khách đưa ra khi thực hiện yêu cầu. Phần phụ trợ sẽ tự động xác minh và giải mã mã thông báo này, chèn
appId
vàocontext
của trình xử lý. Nếu không xác minh được mã thông báo, yêu cầu sẽ bị từ chối. (Có sẵn cho SDK >=3.14.0)
- Mã thông báo Kiểm tra ứng dụng Firebase do ứng dụng khách đưa ra khi thực hiện yêu cầu. Phần phụ trợ sẽ tự động xác minh và giải mã mã thông báo này, chèn
Nếu có bất kỳ tiêu đề nào khác, yêu cầu sẽ bị từ chối, như mô tả trong tài liệu phản hồi bên dưới.
Lưu ý: Trong ứng dụng JavaScript, các yêu cầu này sẽ kích hoạt một chuyến bay trước OPTIONS
CORS, vì:
application/json
là không được phép. Giá trị này phải làtext/plain
hoặcapplication/x-www-form-urlencoded
.- Tiêu đề
Authorization
không phải là tiêu đề yêu cầu được liệt kê an toàn theo CORS. - Tương tự, các tiêu đề khác cũng không được phép.
Trình kích hoạt có thể gọi sẽ tự động xử lý các yêu cầu OPTIONS
này.
Nội dung yêu cầu
Nội dung của yêu cầu HTTP phải là một đối tượng JSON có bất kỳ trường nào sau đây:
- Bắt buộc:
data
– Đối số được truyền vào hàm. Đây có thể là bất kỳ giá trị JSON hợp lệ nào. Dữ liệu này được tự động giải mã thành các loại JavaScript gốc theo định dạng chuyển đổi tuần tự được mô tả bên dưới.
Nếu có bất kỳ trường nào khác trong yêu cầu, thì phần phụ trợ sẽ coi yêu cầu đó là không đúng định dạng và bị từ chối.
Định dạng phản hồi: mã trạng thái
Có một số trường hợp có thể dẫn đến các mã trạng thái HTTP và mã trạng thái chuỗi khác nhau cho lỗi trong phản hồi.
Trong trường hợp xảy ra lỗi HTTP trước khi điều kiện kích hoạt
client
được gọi, phản hồi sẽ không được xử lý dưới dạng hàm ứng dụng. Ví dụ: nếu một ứng dụng cố gắng gọi một hàm không tồn tại, thì ứng dụng đó sẽ nhận được phản hồi404 Not Found
.Nếu điều kiện kích hoạt ứng dụng được gọi nhưng yêu cầu ở định dạng không chính xác, chẳng hạn như không phải JSON, có các trường không hợp lệ hoặc thiếu trường
data
, thì yêu cầu sẽ bị từ chối bằng400 Bad Request
, với mã lỗi làINVALID_ARGUMENT
.Nếu mã thông báo xác thực được cung cấp trong yêu cầu không hợp lệ, thì yêu cầu sẽ bị từ chối bằng
401 Unauthorized
, kèm theo mã lỗi làUNAUTHENTICATED
.Nếu mã đăng ký FCM được cung cấp trong yêu cầu không hợp lệ, thì hành vi sẽ không được xác định. Mã thông báo không được kiểm tra trên mọi yêu cầu, ngoại trừ khi được dùng để gửi thông báo đẩy bằng FCM.
Nếu điều kiện kích hoạt có thể gọi được được gọi nhưng không thành công do một ngoại lệ chưa được xử lý hoặc trả về một lời hứa không thành công, thì yêu cầu sẽ bị từ chối bằng
500 Internal Server Error
, với mã lỗi làINTERNAL
. Điều này giúp người dùng cuối không vô tình thấy lỗi lập trình.Nếu đối tượng có thể gọi được gọi và trả về một điều kiện lỗi rõ ràng bằng cách sử dụng API được cung cấp cho các hàm có thể gọi, thì yêu cầu sẽ không thành công. Mã trạng thái HTTP được trả về dựa trên mối liên kết chính thức của trạng thái lỗi với trạng thái HTTP, như được xác định trong code.proto. Mã lỗi, thông báo và thông tin chi tiết cụ thể được trả về được mã hoá trong phần nội dung phản hồi như chi tiết bên dưới. Điều này có nghĩa là nếu hàm trả về một lỗi rõ ràng có trạng thái
OK
, thì phản hồi sẽ có trạng thái200 OK
, nhưng trườngerror
được đặt trong phản hồi.Nếu điều kiện kích hoạt ứng dụng thành công, trạng thái phản hồi sẽ là
200 OK
.
Định dạng phản hồi: tiêu đề
Phản hồi có các tiêu đề sau:
Content-Type: application/json
- Cho phép
; charset=utf-8
không bắt buộc.
Nội dung phản hồi
Phản hồi từ điểm cuối của ứng dụng luôn là một đối tượng JSON. Ở mức tối thiểu, tệp này chứa result
hoặc error
, cùng với mọi trường tuỳ chọn. Nếu phản hồi không phải là đối tượng JSON hoặc không chứa data
hoặc error
, thì SDK ứng dụng sẽ coi yêu cầu là không thành công với mã lỗi Google INTERNAL (13)
.
error
– Nếu có trường này, thì yêu cầu được coi là không thành công, bất kể mã trạng thái HTTP haydata
có xuất hiện hay không. Giá trị của trường này phải là một đối tượng JSON ở định dạng Ánh xạ HTTP của Google Cloud chuẩn cho lỗi, với các trường chostatus
,message
và (không bắt buộc)details
. Không được đưa trườngcode
vào. Nếu trườngstatus
không được đặt hoặc là giá trị không hợp lệ, thì ứng dụng phải coi trạng thái làINTERNAL
, theo code.proto. Nếu códetails
, thì thông tin này sẽ được đưa vào mọi thông tin người dùng đính kèm với lỗi trong SDK ứng dụng khách (nếu có).
Lưu ý: Trườngdetails
ở đây là giá trị do người dùng cung cấp. Đây không nhất thiết phải là danh sách các giá trị được khoá theo loại proto như trong định dạngStatus
của Google.result
– Giá trị được hàm trả về. Đây có thể là bất kỳ giá trị JSON hợp lệ nào. SDK firebase-functions tự động mã hoá giá trị do người dùng trả về thành định dạng JSON này. SDK ứng dụng sẽ tự động giải mã các tham số này thành các loại gốc theo định dạng chuyển đổi tuần tự được mô tả bên dưới.
Nếu có các trường khác, bạn nên bỏ qua các trường đó.
Tuần tự hoá
Định dạng tuần tự hoá cho tải trọng dữ liệu tuỳ ý giống nhau cho cả yêu cầu và phản hồi.
Để đảm bảo tính nhất quán trên nền tảng, các giá trị này được mã hoá trong JSON như thể chúng là giá trị của trường Any
trong vùng đệm giao thức proto3, sử dụng tính năng ánh xạ JSON tiêu chuẩn. Các giá trị của các loại đơn giản như null
, int
, double
hoặc string
được mã hoá trực tiếp và không bao gồm loại rõ ràng của các giá trị đó. Vì vậy, float
và double
được mã hoá theo cùng một cách và bạn có thể không biết bên kia nhận được mã nào. Đối với các loại không phải JSON gốc, hệ thống sẽ sử dụng kiểu mã hoá proto3 đã nhập cho giá trị. Để biết thêm thông tin, hãy xem tài liệu về Any JSON encoding (Mã hoá JSON bất kỳ).
Các loại sau đây được phép:
- rỗng –
null
- int (có dấu hoặc không dấu, tối đa 32 bit) – ví dụ:
3
hoặc-30
. - float – ví dụ:
3.14
- double – ví dụ:
3.14
- boolean –
true
hoặcfalse
- chuỗi – ví dụ:
"hello world"
- map<string, any=""> – ví dụ:
{"x": 3}
</string,> - danh sách
– ví dụ: [1, 2, 3]
- long (có dấu hoặc không dấu, tối đa 64 bit) – [xem bên dưới để biết thông tin chi tiết]
Không hỗ trợ giá trị NaN
và Infinity
cho float
và double
.
Xin lưu ý rằng long
là một loại đặc biệt thường không được phép trong JSON, nhưng thuộc phạm vi của thông số kỹ thuật proto3. Ví dụ: các giá trị này được mã hoá dưới dạng:
dài
{
'@type': 'type.googleapis.com/google.protobuf.Int64Value',
'value': '-123456789123456'
}
long không dấu
{
'@type': 'type.googleapis.com/google.protobuf.UInt64Value',
'value': '123456789123456'
}
Nhìn chung, khoá @type
phải được xem là được đặt trước và không được dùng cho các bản đồ được truyền vào.
Vì loại không được chỉ định cho các loại đơn giản, nên một số giá trị sẽ thay đổi loại sau khi truyền qua mạng. float
được truyền vào sẽ trở thành double
. short
trở thành int
, v.v. Trong Android, cả List
và JSONArray
đều được hỗ trợ cho các giá trị danh sách. Trong những trường hợp đó, việc truyền vào JSONArray sẽ tạo ra một List
.
Nếu một bản đồ có trường @type
không xác định được chuyển đổi tuần tự, thì bản đồ đó sẽ được giữ nguyên dưới dạng bản đồ. Điều này cho phép nhà phát triển thêm các trường có loại mới vào giá trị trả về mà không làm hỏng các ứng dụng cũ.
Mã mẫu
Các mẫu trong phần này minh hoạ cách mã hoá những nội dung sau:
- Ví dụ về callable.call trong Swift
- Phản hồi thành công cho lệnh gọi
- Phản hồi không thành công cho lệnh gọi
Ví dụ về Callable.call trong Swift để mã hoá
callable.call([
"aString": "some string",
"anInt": 57,
"aFloat": 1.23,
"aLong": -123456789123456 as Int64
])
Tiêu đề yêu cầu:
Method: POST
Content-Type: application/json; charset=utf-8
Authorization: Bearer some-auth-token
Firebase-Instance-ID-Token: some-iid-token
Nội dung yêu cầu:
{
"data": {
"aString": "some string",
"anInt": 57,
"aFloat": 1.23,
"aLong": {
"@type": "type.googleapis.com/google.protobuf.Int64Value",
"value": "-123456789123456"
}
}
}
Phản hồi để mã hoá
return {
"aString": "some string",
"anInt": 57,
"aFloat": 1.23
};
Tiêu đề phản hồi thành công:
200 OK
Content-Type: application/json; charset=utf-8
Nội dung phản hồi thành công:
{
"response": {
"aString": "some string",
"anInt": 57,
"aFloat": 1.23
}
}
Phản hồi không mã hoá được
throw new HttpsError("unauthenticated", "Request had invalid credentials.", {
"some-key": "some-value"
});
Tiêu đề phản hồi không thành công:
401 UNAUTHENTICATED
Content-Type: application/json; charset=utf-8
Nội dung phản hồi không thành công:
{
"error": {
"message": "Request had invalid credentials.",
"status": "UNAUTHENTICATED",
"details": {
"some-key": "some-value"
}
}
}