Проблемы с добавлением сеансов и информации в Google Fit REST Api с помощью JS

Итак, я достаточно новичок в использовании API с Js, но я изо всех сил пытаюсь понять, как работает API Google Fit. Я пытаюсь добавить новые данные тренировки в API, добавляя сеанс и некоторые данные об интенсивности (сердечных пунктах) сеанса. Я могу заставить сеанс отображаться правильно, но постоянно сталкиваюсь с ошибками, когда пытаюсь создать источник данных и добавить к нему точку для сеанса. Мы были бы очень признательны, если бы кто-нибудь мог помочь мне исправить мой код для достижения этой цели или мог бы направить меня к более подробному примеру аналогичного кода, поскольку документы API не кажутся слишком подробными с примерами и т. Д. Заранее спасибо.

Вот 3 вызова API, которые я написал до сих пор: один для создания DataSource, один для DataPoint и один для сеанса. Сеанс работает правильно и добавляет сеанс продолжительностью 1 час для правильной активности, но я не могу заставить работать какие-либо другие запросы API.

Источник данных :

``gapi.client.fitness.users.dataSources.create({
             "userId":"me",
             "resource": {
                "application": {
                "name": "LittleWorkouts"
              },
              "dataType": {"field":[{
                "format": "floatPoint",
                "name": "com.google.heart_minutes"
              }],


                "name": "com.google.heart_minutes"
              },
              "device": {
                "manufacturer": "op",
                "model": "6",
                "type": "phone",
                "uid": "1000019",
                "version": "1"
              },
              "type": "raw"
             }
         })
        .then(function(response) {
                // Handle the results here (response.result has the parsed body).
                console.log("Response", response);
              },
              function(err) { console.error("Execute error 1", err); });
``

Точка данных:

``
    gapi.client.fitness.users.dataSources.datasets.patch({
      "dataSourceId":"raw:com.google.heart_minutes:292824132082:op:6:1000019",
      "userId": "me",
      "datasetId": "1592087806561000000-1592287806561000000",
      "resource": {
  "minStartTimeNs": "1592087806561000000",
  "maxEndTimeNs": "1592287806561000000",
  "dataSourceId": "raw:com.google.heart_minutes:292824132082:op:6:1000019",
  "point": [
    {
      "startTimeNanos": "1592087806561000000",
      "endTimeNanos": "1592287806561000000",
      "value": [
        {
          "fpVal": 89.1
        }
      ],
      "dataTypeName": "com.google.heart_minutes"
    }
  ]
}
    })
        .then(function(response) {
                // Handle the results here (response.result has the parsed body).
                console.log("Response", response);
              },
              function(err) { console.error("Execute error 2", err); });
``

Сессия:

``gapi.client.fitness.users.sessions.update({
            "userId":"me",
            "sessionId": "someSessionId19",
            "id": "someSessionId19",
            "name": "Awesome Workout19",
            "description": "A very intense workout",
            "startTimeMillis": new Date().getTime() - 3600000,
            "endTimeMillis": new Date().getTime(),
            "version": 1,
            "lastModifiedToken": "exampleToken",
            "application": {
                "detailsUrl": "http://example.com",
                "name": "LittleWorkouts",
                "version": "1.0"
            },
            "activityType": 21,
            "activeTimeMillis": 3600000
            }).then((res) => {console.log(res)});
            console.log('res')
        //request.execute((res) => {console.log(res);console.log('executrd')})


        console.log(auth2.currentUser.get().getBasicProfile().getGivenName());

        var request2 = gapi.client.fitness.users.sessions.list({
            "userId":"me"
        }).then((res) => {console.log(res)})
``

Сообщение об ошибке

{сообщение: "Невозможно получить источник данных для набора данных: raw: com.google.heart_minutes: 292824132082: op: 6: 1000019", домен: "global", причина: "invalidArgument"}


person Ben Cooper    schedule 16.06.2020    source источник
comment
Укажите, что невозможно заставить работать другие запросы API.   -  person DaImTo    schedule 16.06.2020
comment
@DaImTo хорошо, я получил это для запроса источника данных: message: Invalid DataType: data_stream_id: raw: com.google.heart_minutes: 108881196053: op: 6: 1000019↵type: RAWdata_type {name: com.google.heart_minutesfield {name: com. google. op: 6: 1000019 статус: INVALID_ARGUMENT   -  person Ben Cooper    schedule 16.06.2020
comment
Этот API действительно предназначен для использования с мобильными устройствами. Вы действительно пытаетесь использовать его с javascript? Все создано для данных, поступающих с телефона или часов. Не уверен, что хочу спросить, но каковы именно ваши намерения в отношении того, что кто-то собирается войти на веб-сайт и щелкнуть ссылку, указывающую, что он начал тренировку, а затем щелкнуть еще раз, когда она закончится?   -  person DaImTo    schedule 16.06.2020
comment
@DaImTo Да, идея заключалась в том, чтобы пользователь завершил тренировку, а затем продолжительность тренировки и тип тренировки были бы записаны в Google Fit, мои извинения, если бы это не было предполагаемым использованием API, это было бы невозможно в все? Большое спасибо за ответ, я ценю это :)   -  person Ben Cooper    schedule 16.06.2020
comment
Можете ли вы переформатировать сообщение об ошибке так, чтобы оно соответствовало формату ответа? На данный момент сложно разобрать его на части.   -  person Andy Turner    schedule 16.06.2020


Ответы (2)


Похоже, возможно, вы пытаетесь передать неправильные поля для типа данных: если вы хотите использовать стандартный тип данных (например, com.google.heart_minutes), вы должны либо передать точные поля стандартного типа данных ( поле следует назвать интенсивностью); или просто передайте имя типа данных, и серверная часть заполнит их за вас.

Итак, если вы измените тип данных на

"dataType": {"name": "com.google.heart_minutes"}

Он должен работать.

Затем вам нужно использовать идентификатор источника данных, возвращенный из этого запроса, для точек данных.

person Andy Turner    schedule 16.06.2020
comment
Это здорово и исправляет первую ошибку, теперь я получаю эту ошибку только в запросе набора данных: сообщение: Невозможно получить источник данных для набора данных: raw: com.google.heart_minutes: 292824132082: op: 6: 1000019 status: INVALID_ARGUMENT Большое спасибо за ответ! - person Ben Cooper; 16.06.2020
comment
@BenCooper, пожалуйста, покажите ответ, который возвращается при создании источника данных. Я не верю, что часть 29282... правильная. Откуда вы взяли этот идентификатор источника данных? - person Andy Turner; 16.06.2020
comment
Я считаю, что ваша догадка была правильной, я использовал старый идентификатор источника данных, он работал, когда я использовал новый, поскольку я создавал новый источник данных для каждого сеанса, я думаю, в этом нет необходимости? а я должен просто продолжать использовать старую? Большое спасибо - person Ben Cooper; 17.06.2020
comment
Нет, вам не следует создавать новый источник данных для каждого сеанса. - person Andy Turner; 17.06.2020
comment
Большое спасибо за помощь, я добавил ответ своего окончательного рабочего кода :) - person Ben Cooper; 17.06.2020

Замечательно, поэтому после некоторой поддержки в комментариях у меня есть рабочий код для добавления нового сеанса с данными из ранее определенного источника данных с использованием 3 вызовов API. Первый вызов - создать источник данных, и его нужно запустить только один раз. Второй и третий затем добавляют точку данных к набору данных и соответственно создают новый сеанс тренировки. Вот окончательный рабочий код:

Источник данных:

/*
         gapi.client.fitness.users.dataSources.create({
             "userId":"me",
             "resource": {
                "application": {
                "name": "LittleWorkouts"
              },
              "dataType": {
                "name": "com.google.heart_minutes"
              },
              "device": {
                "manufacturer": "op",
                "model": "6",
                "type": "phone",
                "uid": "1000020",
                "version": "1"
              },
              "type": "raw"
             }
         })
        .then(function(response) {
                // Handle the results here (response.result has the parsed body).
                console.log("Response", response);
              },
              function(err) { console.error("Execute error 1", err); });
  */

Данные и набор данных:

gapi.client.fitness.users.dataSources.datasets.patch({
      "dataSourceId":"raw:com.google.heart_minutes:108881196053:op:6:1000020",
      "userId": "me",
      "datasetId": z,
      "resource": {
  "minStartTimeNs": workoutStartTime * 1000000,
  "maxEndTimeNs": workoutEndTime * 1000000,
  "dataSourceId": "raw:com.google.heart_minutes:108881196053:op:6:1000020",
  "point": [
    {
        "originDataSourceId": "raw:com.google.heart_minutes:108881196053:op:6:1000020",
      "value": [
        {
          "fpVal": 8
        }
      ],
      "dataTypeName": "com.google.heart_minutes",
      "endTimeNanos": workoutEndTime * 1000000,
      "startTimeNanos": workoutStartTime * 1000000,
    }
  ]
}
    })
        .then(function(response) {
                // Handle the results here (response.result has the parsed body).
                console.log("Response", response);
              },
              function(err) { console.error("Execute error 2", err); });

Сессия:

gapi.client.fitness.users.sessions.update({
            "userId":"me",
            "sessionId": id,
            "id": id,
            "name": "Morning Workout",
            "description": "A very intense workout",
            "startTimeMillis": workoutStartTime,
            "endTimeMillis": workoutEndTime,
            "version": 1,
            "lastModifiedToken": "exampleToken",
            "application": {
                "detailsUrl": "http://example.com",
                "name": "LittleWorkouts",
                "version": "1.0"
            },
            "activityType": 21,
            "activeTimeMillis": workoutEndTime - workoutStartTime
            }).then((res) => {console.log(res)});
            console.log('res')
person Ben Cooper    schedule 17.06.2020