Phát triển trải nghiệm về dinh dưỡng và bổ sung nước bằng API Google Health

API Google Health cung cấp các loại dữ liệu để theo dõi chế độ dinh dưỡng và lượng nước của người dùng. Các loại này cho phép bạn ghi nhật ký bữa ăn, tham khảo thực phẩm từ cơ sở dữ liệu thực phẩm, theo dõi lượng chất dinh dưỡng và ghi nhật ký lượng chất lỏng nạp vào cơ thể.

Các loại dữ liệu được hỗ trợ

Bảng: Các kiểu dữ liệu dinh dưỡng của API Google Health
Loại dữ liệu Các thao tác
có thể thực hiện
Phạm vi
Đồ ăn
dataType: food
filter parameter: food
Loại bản ghi: Thực phẩm
list, get .nutrition.readonly
.nutrition.writeonly
Đơn vị đo lường thực phẩm
dataType: food-measurement-unit
filter parameter: food_measurement_unit
Loại bản ghi: Thực phẩm

Thiết bị tương thích

list, get .nutrition.readonly
.nutrition.writeonly
Nhật ký về lượng nước uống
dataType: hydration-log
filter parameter: hydration_log
Loại bản ghi: Phiên
list, get, reconcile, rollup, dailyRollup, create, update, batchDelete .nutrition.readonly
.nutrition.writeonly
Nhật ký dinh dưỡng
dataType: nutrition-log
filter parameter: nutrition_log
Loại bản ghi: Phiên

Thiết bị tương thích

list, get, reconcile, rollup, dailyRollup, create, update, batchDelete .nutrition.readonly
.nutrition.writeonly

Nhật ký dinh dưỡng

Nhật ký dinh dưỡng thể hiện thực phẩm mà người dùng đã ghi lại. Có hai cách để tạo nhật ký dinh dưỡng, tuỳ thuộc vào loại thực phẩm:

  1. Thực phẩm đã xác định: Đặt trường food để tham chiếu đến tài nguyên Thực phẩm hiện có. Các trường nutrients, energy, energyFromFat, totalCarbohydrate, totalFat và foodDisplayName được điền tự động từ thực phẩm được tham chiếu. Đây là phương thức được ưu tiên.

  2. Thực phẩm không xác định: Đặt trường foodDisplayName theo cách thủ công và cung cấp giá trị cho nutrients, energy, energyFromFat, totalCarbohydrate và totalFat. Bạn không thể chỉnh sửa nhật ký dinh dưỡng được tạo từ thực phẩm ẩn danh sau khi tạo.

Tạo nhật ký dinh dưỡng với món ăn ẩn danh

Để tạo một mục nhập nhật ký dinh dưỡng, hãy gửi yêu cầu POST đến điểm cuối nutrition-log dataPoints.

Yêu cầu

POST https://health.googleapis.com/v4/users/me/dataTypes/nutrition-log/dataPoints
Authorization: Bearer access-token
Content-Type: application/json

{
  "nutritionLog": {
    "interval": {
      "startTime": "2026-06-16T18:00:00Z",
      "endTime": "2026-06-16T18:30:00Z"
    },
    "foodDisplayName": "Grilled Chicken Breast",
    "mealType": "DINNER",
    "energy": {
      "kcal": 165
    },
    "totalCarbohydrate": {
      "grams": 0
    },
    "totalFat": {
      "grams": 3.6
    },
    "nutrients": [
      {
        "nutrient": "PROTEIN",
        "quantity": {
          "grams": 31
        }
      },
      {
        "nutrient": "SODIUM",
        "quantity": {
          "grams": 0.074
        }
      }
    ],
    "serving": {
      "amount": 1.0
    }
  }
}

Phản hồi

{
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.devicesandservices.health.v4.DataPoint",
    "name": "users/user-id/dataTypes/nutrition-log/dataPoints/data-point-id",
    "dataSource": {
      "recordingMethod": "UNKNOWN",
      "application": {
        "googleWebClientId": "google-web-client-id"
      },
      "platform": "GOOGLE_WEB_API"
    },
    "nutritionLog": {
      "interval": {
        "startTime": "2026-06-16T18:00:00Z",
        "startUtcOffset": "0s",
        "endTime": "2026-06-16T18:30:00Z",
        "endUtcOffset": "0s",
        "civilStartTime": {
          "date": {
            "year": 2026,
            "month": 6,
            "day": 16
          },
          "time": {
            "hours": 18
          }
        },
        "civilEndTime": {
          "date": {
            "year": 2026,
            "month": 6,
            "day": 16
          },
          "time": {
            "hours": 18,
            "minutes": 30
          }
        }
      },
      "energy": {
        "kcal": 165
      },
      "totalCarbohydrate": {
        "grams": 0
      },
      "totalFat": {
        "grams": 3.6
      },
      "nutrients": [
        {
          "quantity": {
            "grams": 31
          },
          "nutrient": "PROTEIN"
        },
        {
          "quantity": {
            "grams": 0.074
          },
          "nutrient": "SODIUM"
        }
      ],
      "mealType": "DINNER",
      "serving": {
        "amount": 1
      },
      "foodDisplayName": "Grilled Chicken Breast"
    }
  }
}

Tạo nhật ký dinh dưỡng với món ăn đã xác định

Để ghi nhật ký một món ăn trong cơ sở dữ liệu thực phẩm, hãy đặt trường food để tham chiếu đến một tài nguyên Thực phẩm. API này tự động điền các trường thông tin dinh dưỡng.

Yêu cầu

POST https://health.googleapis.com/v4/users/me/dataTypes/nutrition-log/dataPoints
Authorization: Bearer access-token
Content-Type: application/json

{
  "nutritionLog": {
    "interval": {
      "startTime": "2026-06-16T12:00:00Z",
      "endTime": "2026-06-16T12:30:00Z"
    },
    "food": "users/me/dataTypes/food/dataPoints/food-id",
    "mealType": "LUNCH",
    "serving": {
      "amount": 1.0,
      "foodMeasurementUnit": "users/me/dataTypes/food-measurement-unit/dataPoints/food-measurement-unit-id"
    }
  }
}

Phản hồi

{
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.devicesandservices.health.v4.DataPoint",
    "name": "users/user-id/dataTypes/nutrition-log/dataPoints/data-point-id",
    "dataSource": {
      "recordingMethod": "UNKNOWN",
      "application": {
        "googleWebClientId": "google-web-client-id"
      },
      "platform": "GOOGLE_WEB_API"
    },
    "nutritionLog": {
      "interval": {
        "startTime": "2026-06-16T12:00:00Z",
        "startUtcOffset": "0s",
        "endTime": "2026-06-16T12:30:00Z",
        "endUtcOffset": "0s",
        "civilStartTime": {
          "date": {
            "year": 2026,
            "month": 6,
            "day": 16
          },
          "time": {
            "hours": 12
          }
        },
        "civilEndTime": {
          "date": {
            "year": 2026,
            "month": 6,
            "day": 16
          },
          "time": {
            "hours": 12,
            "minutes": 30
          }
        }
      },
      "energy": {
        "kcal": 95
      },
      "energyFromFat": {
        "kcal": 3
      },
      "totalCarbohydrate": {
        "grams": 25
      },
      "totalFat": {
        "grams": 0.3
      },
      "nutrients": [
        {
          "quantity": {
            "grams": 4.4,
            "userProvidedUnit": "GRAM"
          },
          "nutrient": "DIETARY_FIBER"
        },
        {
          "quantity": {
            "grams": 19,
            "userProvidedUnit": "GRAM"
          },
          "nutrient": "SUGAR"
        },
        {
          "quantity": {
            "grams": 0.5,
            "userProvidedUnit": "GRAM"
          },
          "nutrient": "PROTEIN"
        }
      ],
      "mealType": "LUNCH",
      "serving": {
        "amount": 1,
        "foodMeasurementUnit": "users/me/dataTypes/food-measurement-unit/dataPoints/food-measurement-unit-id"
      },
      "food": "users/user-id/dataTypes/food/dataPoints/food-id",
      "foodDisplayName": "Apple"
    }
  }
}

Xoá nhật ký dinh dưỡng

Để xoá một hoặc nhiều mục nhập nhật ký dinh dưỡng, hãy gửi yêu cầu POST đến phương thức batchDelete kèm theo tên tài nguyên của các mục nhập cần xoá.

Yêu cầu:

POST https://health.googleapis.com/v4/users/me/dataTypes/nutrition-log/dataPoints:batchDelete
Authorization: Bearer access-token
Content-Type: application/json

{
  "names": [
    "users/me/dataTypes/nutrition-log/dataPoints/data-point-id"
  ]
}

Các trường trong nhật ký dinh dưỡng

Để xem danh sách đầy đủ các trường và nội dung mô tả, hãy xem NutritionLog.

Lượng năng lượng

Biểu thị số đo năng lượng, tính bằng kilocalories (kcal). Để biết thông tin chi tiết, hãy xem EnergyQuantity.

{
  "kcal": 165
}

Số lượng trọng lượng

Biểu thị số đo trọng lượng, tính bằng gam. Để biết thông tin chi tiết, hãy xem WeightQuantity.

{
  "grams": 27.3
}

Hàm lượng chất dinh dưỡng

Đại diện cho một chất dinh dưỡng cụ thể và lượng đo được của chất đó. Để biết thông tin chi tiết, hãy xem NutrientQuantity.

{
  "nutrient": "PROTEIN",
  "quantity": {
    "grams": 31
  }
}

Giá trị dinh dưỡng

Để biết danh sách đầy đủ các loại chất dinh dưỡng được hỗ trợ, hãy xem Nutrient.

Đang phân phối

Biểu thị thông tin về khẩu phần cho một mục nhập nhật ký dinh dưỡng. Để biết thông tin chi tiết, hãy xem Serving.

{
  "amount": 1.5
}

Giá trị loại bữa ăn

Để biết danh sách đầy đủ các loại bữa ăn được hỗ trợ, hãy xem MealType.

Thực phẩm

Thực phẩm là một loại dữ liệu chỉ có thể đọc, đại diện cho một món ăn trong cơ sở dữ liệu về thực phẩm. Sử dụng các thao tác list và get để duyệt xem các loại thực phẩm có sẵn và truy xuất thông tin dinh dưỡng của các loại thực phẩm đó.

Liệt kê thực phẩm

Để liệt kê các loại thực phẩm, hãy gửi yêu cầu GET đến điểm cuối food dataPoints:

GET https://health.googleapis.com/v4/users/me/dataTypes/food/dataPoints
Authorization: Bearer access-token
Accept: application/json

Đơn vị đo lường thực phẩm

Đơn vị đo lường thực phẩm là một loại dữ liệu chỉ có thể đọc, đại diện cho các đơn vị đo lường dùng cho khẩu phần ăn (ví dụ: "cốc", "thìa canh" hoặc "miếng").

Liệt kê các đơn vị đo lường hiện có

Cách liệt kê các đơn vị đo lường hiện có:

GET https://health.googleapis.com/v4/users/me/dataTypes/food-measurement-unit/dataPoints
Authorization: Bearer access-token
Accept: application/json

Nhật ký về lượng nước uống

Nhật ký về lượng nước uống thể hiện lượng chất lỏng mà người dùng đã ghi lại. Không giống như thực phẩm (tham chiếu đến cơ sở dữ liệu Thực phẩm và đo lường lượng chất dinh dưỡng hoặc năng lượng nạp vào), các mục về lượng nước theo dõi thể tích chất lỏng cụ thể được tiêu thụ trong một khoảng thời gian nhất định.

Tạo nhật ký về lượng nước uống

Để tạo một mục nhập nhật ký về lượng nước nạp vào cơ thể, hãy gửi yêu cầu POST đến điểm cuối hydration-log dataPoints. Tất cả số lượng thể tích đều được chuyển đổi thành mililit ở định dạng API.

Yêu cầu

POST https://health.googleapis.com/v4/users/me/dataTypes/hydration-log/dataPoints
Authorization: Bearer access-token
Content-Type: application/json

{
  "hydrationLog": {
    "interval": {
      "startTime": "2026-06-16T14:00:00Z",
      "endTime": "2026-06-16T14:00:01Z"
    },
    "amountConsumed": {
      "milliliters": 500,
      "userProvidedUnit": "FLUID_OUNCE_US"
    }
  }
}

Phản hồi

{
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.devicesandservices.health.v4.DataPoint",
    "name": "users/user-id/dataTypes/hydration-log/dataPoints/data-point-id",
    "dataSource": {
      "recordingMethod": "UNKNOWN",
      "application": {
        "googleWebClientId": "google-web-client-id"
      },
      "platform": "GOOGLE_WEB_API"
    },
    "hydrationLog": {
      "interval": {
        "startTime": "2026-06-16T14:00:00Z",
        "startUtcOffset": "0s",
        "endTime": "2026-06-16T14:00:01Z",
        "endUtcOffset": "0s",
        "civilStartTime": {
          "date": {
            "year": 2026,
            "month": 6,
            "day": 16
          },
          "time": {
            "hours": 14
          }
        },
        "civilEndTime": {
          "date": {
            "year": 2026,
            "month": 6,
            "day": 16
          },
          "time": {
            "hours": 14,
            "seconds": 1
          }
        }
      },
      "amountConsumed": {
        "milliliters": 500,
        "userProvidedUnit": "FLUID_OUNCE_US"
      }
    }
  }
}

Cập nhật nhật ký về lượng nước uống

Để cập nhật mục nhập nhật ký về lượng nước uống, hãy gửi yêu cầu PATCH đến điểm cuối hydration-log dataPoints kèm theo mã nhận dạng của điểm dữ liệu.

Yêu cầu

PATCH https://health.googleapis.com/v4/users/me/dataTypes/hydration-log/dataPoints/data-point-id
Authorization: Bearer access-token
Content-Type: application/json

{
  "hydrationLog": {
    "interval": {
      "startTime": "2026-06-16T10:00:00Z",
      "endTime": "2026-06-16T10:00:01Z"
    },
    "amountConsumed": {
      "milliliters": 500
    }
  }
}

Phản hồi

{
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.devicesandservices.health.v4.DataPoint",
    "name": "users/user-id/dataTypes/hydration-log/dataPoints/data-point-id",
    "dataSource": {
      "recordingMethod": "UNKNOWN",
      "application": {
        "googleWebClientId": "google-web-client-id"
      },
      "platform": "GOOGLE_WEB_API"
    },
    "hydrationLog": {
      "interval": {
        "startTime": "2026-06-16T10:00:00Z",
        "startUtcOffset": "0s",
        "endTime": "2026-06-16T10:00:01Z",
        "endUtcOffset": "0s",
        "civilStartTime": {
          "date": {
            "year": 2026,
            "month": 6,
            "day": 16
          },
          "time": {
            "hours": 10
          }
        },
        "civilEndTime": {
          "date": {
            "year": 2026,
            "month": 6,
            "day": 16
          },
          "time": {
            "hours": 10,
            "seconds": 1
          }
        }
      },
      "amountConsumed": {
        "milliliters": 500
      }
    }
  }
}

Xoá nhật ký về lượng nước

Để xoá một hoặc nhiều mục nhập nhật ký về lượng nước nạp vào cơ thể, hãy gửi yêu cầu POST đến phương thức batchDelete.

Yêu cầu

POST https://health.googleapis.com/v4/users/me/dataTypes/hydration-log/dataPoints:batchDelete
Authorization: Bearer access-token
Content-Type: application/json

{
  "names": [
    "users/me/dataTypes/hydration-log/dataPoints/data-point-id"
  ]
}

Phản hồi

{
  "done": true,
  "response": {
    "@type": "type.googleapis.com/google.devicesandservices.health.v4.BatchDeleteDataPointsResponse",
    "dataPoints": [
      {
        "name": "users/user-id/dataTypes/hydration-log/dataPoints/data-point-id",
        "dataSource": {
          "recordingMethod": "UNKNOWN",
          "application": {
            "googleWebClientId": "google-web-client-id"
          },
          "platform": "GOOGLE_WEB_API"
        },
        "hydrationLog": {
          "interval": {
            "startTime": "2026-06-16T14:00:00Z",
            "startUtcOffset": "0s",
            "endTime": "2026-06-16T14:00:01Z",
            "endUtcOffset": "0s",
            "civilStartTime": {
              "date": {
                "year": 2026,
                "month": 6,
                "day": 16
              },
              "time": {
                "hours": 14
              }
            },
            "civilEndTime": {
              "date": {
                "year": 2026,
                "month": 6,
                "day": 16
              },
              "time": {
                "hours": 14,
                "seconds": 1
              }
            }
          },
          "amountConsumed": {
            "milliliters": 500,
            "userProvidedUnit": "FLUID_OUNCE_US"
          }
        }
      }
    ]
  }
}

Các trường trong nhật ký về lượng nước uống

Để xem danh sách đầy đủ các trường và nội dung mô tả, hãy xem HydrationLog.

Số lượng

Biểu thị số đo thể tích, tính bằng mililit. Để biết thông tin chi tiết, hãy xem VolumeQuantity.

{
  "milliliters": 250,
  "userProvidedUnit": "MILLILITER"
}

Giá trị đơn vị thể tích

Để xem danh sách đầy đủ các đơn vị thể tích được hỗ trợ, hãy xem VolumeUnit. Các giá trị phổ biến bao gồm MILLILITER, LITER, CUP_US và FLUID_OUNCE_US.

Nguyên tắc

  • Sử dụng món ăn đã xác định nếu có thể. API này tự động điền các trường thông tin dinh dưỡng, giúp giảm thiểu lỗi và đảm bảo tính nhất quán với cơ sở dữ liệu thực phẩm.
  • Bạn không thể cập nhật nhật ký dinh dưỡng được tạo từ thực phẩm ẩn danh sau khi tạo. Nếu bạn cần chỉnh sửa nhật ký thực phẩm ẩn danh, hãy xoá nhật ký đó rồi tạo một nhật ký mới.
  • Không giống như nhật ký dinh dưỡng thực phẩm ẩn danh, các mục nhập nhật ký cấp nước hoàn toàn có thể thay đổi và có thể được cập nhật sau khi tạo bằng yêu cầu PATCH.
  • Tất cả lượng chất dinh dưỡng trong mảng nutrients đều sử dụng gam làm đơn vị đo lường.
  • Trường energy và energyFromFat sử dụng kilocalories (kcal) làm đơn vị đo lường.
  • API này chuyển đổi và lưu trữ tất cả lượng nước uống vào theo đơn vị mililit. Trường userProvidedUnit không bắt buộc trong VolumeQuantity chỉ được dùng để hiển thị dành cho người dùng phía máy khách.
  • Yêu cầu HTTP DELETE trực tiếp đến các điểm dữ liệu hydration-log riêng lẻ sẽ trả về 404 Not Found. Sử dụng phương thức batchDelete để xoá các mục tài nguyên này.
  • Nhật ký về lượng nước uống sử dụng một khoảng thời gian ngắn, trong đó startTime và endTime thể hiện khoảng thời gian mà người dùng uống nước.