J'essaie de passer des appels d'API à l'API Google Analytics v3. Les appels simples en lecture seule fonctionnent très bien, mais lorsque j'essaie de mettre à jour des vues de données (ou une méthode de mise à jour), je finis toujours par obtenir la réponse suivante:
{
"error": {
"errors": [
{
"domain": "global",
"reason": "required",
"message": "Field name is required."
}
],
"code": 400,
"message": "Field name is required."
}
}
Cela est vrai même en utilisant API Explorer . Étant donné que les demandes en lecture seule fonctionnent, je pense que les erreurs concernant les identifiants de compte, de propriété et de vue peuvent être ignorées. Et comme "les champs" ne spécifient que ce qu'il faut inclure dans une réponse, je suppose que l'erreur concerne le corps de la demande. Pour produire un exemple de travail minimal, je me suis limité à l'éditeur structuré , qui vous permet de sélectionner des paires clé-valeur pour la préférence que vous souhaitez modifier, par exemple:
{
"siteSearchQueryParameters":"search"
}
Cependant, l'erreur est toujours la même. La documentation semble plutôt rare en ce qui concerne les spécifications corps de la demande vous demandant de fournir un objet objet management.prilfe.resource , qui n'est pas bien documenté.
Est-ce que quelqu'un peut me montrer à quoi un corps de requête valide doit ressembler (si c'est là que réside mon erreur)?
@SomewhereDave m'a mis sur la bonne voie. Si quelqu'un se heurte au même problème, voici comment je l'ai résolu.
Mises en garde: J'utilise la bibliothèque googleapis
Node.js, je m'authentifie via JWT (informations d'identification service à service) et je dispose d'un client global configuré pour l'API Google Analytics v.3.
analytics.management.webproperties.get
pour obtenir le JSON existant des propriétés.analytics.management.webproperties.update
.const getPropertyJson = async (account, property) => {
const params = {
accountId:account,
webPropertyId:property,
}
const result = await analytics.management.webproperties.get(params)
return result
}
const updateExistingProperty = async (account, property, propertyJson) => {
const params = {
accountId:account,
webPropertyId:property,
requestBody: propertyJson
}
params.requestBody.industryVertical = 'REFERENCE'
const result = await analytics.management.webproperties.update(params)
return result
}
Le response.data
renverra le JSON mis à jour avec toutes les propriétés.
Apparemment, vous devez fournir un objet JSON en tant que corps de la demande, y compris des valeurs pour toutes les clés possibles. Ainsi, si vous souhaitez modifier le nom de votre vue, indiquez également l'identifiant, la devise, le fuseau horaire, etc.
Je suppose que le moyen le plus simple d'y parvenir consiste à utiliser get request pour la vue en premier, à modifier les clés à modifier pour le JSON résultant et à les utiliser avec votre demande de mise à jour.
Voici à quoi devrait ressembler un corps de requête complet pour une mise à jour de vue
{
"id": "123456789",
"kind": "analytics#profile",
"selfLink": "https://www.googleapis.com/analytics/v3/management/accounts/12345678/webproperties/UA-12345678-1/profiles/123456789",
"accountId": "12345678",
"webPropertyId": "UA-12345678-1",
"internalWebPropertyId": "111111111",
"name": "My view",
"currency": "USD",
"timezone": "America/Los_Angeles",
"websiteUrl": "http://mygreatwebsite.org",
"type": "WEB",
"permissions": {
"effective": [
"COLLABORATE",
"EDIT",
"MANAGE_USERS",
"READ_AND_ANALYZE"
]
},
"created": "2018-08-13T15:17:29.661Z",
"updated": "2018-08-13T15:17:29.661Z",
"eCommerceTracking": false,
"parentLink": {
"type": "analytics#webproperty",
"href": "https://www.googleapis.com/analytics/v3/management/accounts/12345678/webproperties/UA-12345678-1"
},
"childLink": {
"type": "analytics#goals",
"href": "https://www.googleapis.com/analytics/v3/management/accounts/12345678/webproperties/UA-12345678-1/profiles/123456789/goals"
}
}
Modifiez simplement les valeurs des clés variables que vous souhaitez modifier et insérez-les dans --data 'JSON goes here'
de votre demande PUT.
Cela pourrait également être la raison pour laquelle vous devez fournir des valeurs pour tous les champs possibles:
La méthode PUT demande à ce que l'entité incluse soit stockée sous l'URI de demande fourni. Si l'URI de demande fait référence à une ressource déjà existante, l'entité incluse DEVRAIT être considérée comme une version modifiée de celle résidant sur le serveur d'origine. Si Request-URI ne pointe pas vers une ressource existante et que cet URI peut être défini en tant que nouvelle ressource par l'agent utilisateur demandeur, le serveur d'origine peut créer la ressource avec cet URI. "
Le noeud final remplace probablement simplement les configurations existantes au lieu de mettre à jour des champs individuels.
Il est un peu étrange que vous soyez obligé de fournir autant de frais généraux inutiles et cela n’est indiqué nulle part dans la documentation. D'un point de vue extérieur, la vue, la propriété et l'identifiant du compte suffiraient.