web-dev-qa-db-ja.com

エラー「フィールド名が必要です」-Google Analytics API

Google Analytics API v3のAPI呼び出しをしようとしています。単純な読み取り専用呼び出しは問題なく機能しますが、データビュー(または任意の更新メソッド)を更新しようとすると、常に次の応答が返されます。

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "required",
    "message": "Field name is required."
   }
  ],
  "code": 400,
  "message": "Field name is required."
 }
}

これは、 API Explorer を使用している場合にも当てはまります。読み取り専用のリクエストが機能するため、アカウント、プロパティ、およびビューIDに関するエラーは無視できると思います。そして、「フィールド」は指定するだけなので、応答に何を含めるかは、エラーがリクエスト本文にあると仮定します。最小限の作業例を作成するために、構造化エディターに制限しました。これにより、変更する設定のキーと値のペアを選択できます。

{
 "siteSearchQueryParameters":"search"
}

ただし、エラーは同じままです。 request bodymanagement.prilfe.resourceオブジェクト を提供するように要求する仕様に関しては、ドキュメントがかなり不足しているようです。

誰かが有効なリクエストボディがどのように見える必要があるかを見せてくれますか(これが私のエラーがある場合)?

2
SomewhereDave

@SomewhereDaveは私を正しい軌道に乗せました。誰かが同じ問題に遭遇した場合、ここでそれを解決しました。

警告:googleapis Node.jsライブラリを使用し、JWT(サービス間資格情報)を介して認証し、GoogleアナリティクスAPI v.3用にグローバルクライアントを構成しています

  1. (アカウントとWebプロパティIDを知っていると仮定)、analytics.management.webproperties.get呼び出しを行って、プロパティの既存のJSONを取得します。
  2. JSON、accountId、webpropertyIDをanalytics.management.webproperties.update呼び出しに渡します。
  3. JSONで必要なプロパティ名を更新します。
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
}

response.dataは、すべてのプロパティを含む更新されたJSONを返します。

1
Julia

明らかに、all可能なキーの値を含むJSONオブジェクトをリクエストボディとして提供する必要があります。したがって、ビューの名前を変更する場合は、ID、通貨、タイムゾーンなども変更せずに指定します。

これを達成する最も簡単な方法は、最初にビューに get request を使用し、結果のJSONに対して変更するキーを変更し、更新リクエストで使用することだと思います。

これは、ビューの更新のために完全なリクエストボディがどのように見えるかです

{
  "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"
  }
}

変更する変数キーの値を単純に変更し、PUTリクエストの--data 'JSON goes here'に入れます。

これは、可能なすべてのフィールドに値を提供する必要がある理由でもあります。

PUTメソッドは、指定されたRequest-URIで囲まれたエンティティを保存することを要求します。 Request-URIが既存のリソースを参照している場合、囲まれたエンティティは、Originサーバーに存在するエンティティの修正バージョンと見なされる必要があります。 Request-URIが既存のリソースを指しておらず、そのURIが要求ユーザーエージェントによって新しいリソースとして定義できる場合、OriginサーバーはそのURIでリソースを作成できます。

詳細 here および here

エンドポイントはおそらく、個々のフィールドを更新するのではなく、単に既存の構成をオーバーライドするだけです。

あまり役に立たないオーバーヘッドを提供する必要があるのは一種の奇妙なことであり、ドキュメントのどこにも記載されていません。外部から見ると、ビュー、プロパティ、アカウントIDで十分だと思います。

0
SomewhereDave