คู่มือนี้มีหลักเกณฑ์ในการย้ายข้อมูล API การรายงานหลัก เวอร์ชัน 3 ไปยัง Analytics Reporting API เวอร์ชัน 4
เกริ่นนำ
หากต้องการใช้ประโยชน์จากฟีเจอร์ใหม่ ที่เปิดตัวใน Analytics Reporting API v4 ให้ย้ายข้อมูลโค้ดเพื่อใช้ API คู่มือนี้แสดงคำขอใน Core Reporting API v3 และคำขอที่เทียบเท่าใน Analytics Reporting API v4 เพื่อให้การย้ายข้อมูลง่ายขึ้น
การย้ายข้อมูล Python
หากคุณเป็นนักพัฒนาซอฟต์แวร์ Python ให้ใช้ไลบรารีศูนย์ช่วยเหลือ GAV4 บน GitHub เพื่อแปลงคำขอ Google Analytics Core Reporting API v3 เป็นคำขอ Analytics Reporting API v4
ปลายทาง
Core Reporting API v3 และ Analytics Reporting API v4 มีปลายทางและเมธอด HTTP ที่ต่างกัน ดังนี้
ปลายทาง v3
GET https://www.googleapis.com/analytics/v3/data/ga
ปลายทาง v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
ตัวอย่างต่อไปนี้จะเปรียบเทียบคำขอใน v3 และคำขอที่เทียบเท่าในเวอร์ชัน 4
v3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&start-date=2015-11-01&end-date=2015-11-06 \
&metrics=ga:users&dimensions=ga:pagePath
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
"viewId":"XXXX",
"dateRanges":[
{
"startDate":"2015-11-01",
"endDate":"2015-11-06"
}],
"metrics":[
{
"expression":"ga:users"
}],
"dimensions": [
{
"name":"ga:pagePath"
}]
}]
}
ไลบรารีของไคลเอ็นต์และบริการการค้นพบ
หากใช้ Python, JavaScript หรือไลบรารีของไคลเอ็นต์อื่นๆ ที่ใช้บริการค้นพบของ Google คุณต้องระบุตำแหน่งของเอกสารการค้นพบสำหรับ Reporting API v4
Python
from apiclient import discovery
...
# Build the Analytics Reporting API v4 authorized service object.
analyticsReporting = discovery.build(
'analyticsreporting',
'v4',
http=http,
discoveryServiceUrl='https://analyticsreporting.googleapis.com/$discovery/rest')
JavaScript
gapi.client.load(
'https://analyticsreporting.googleapis.com/$discovery/rest',
'v4'
).then(...)
ไลบรารีของไคลเอ็นต์ Java และ PHP สร้างขึ้นไว้ล่วงหน้า แต่คุณสามารถใช้บริการการค้นพบและโปรแกรมสร้าง Google APIs เพื่อสร้างไลบรารีดังกล่าวได้
คำขอ
ข้อมูลอ้างอิง API v4 อธิบายโครงสร้างของเนื้อหาคำขอโดยละเอียด ส่วนต่อไปนี้จะอธิบายการย้ายข้อมูลพารามิเตอร์คำขอ v3 ไปยังพารามิเตอร์คำขอ v4
ดูรหัส
ใน v3 พารามิเตอร์ ids
ที่ยอมรับ "รหัสตาราง" จะอยู่ในรูปแบบ ga:XXXX
โดยที่ XXXX
คือรหัสข้อมูลพร็อพเพอร์ตี้ (โปรไฟล์) ใน v4 จะมีการระบุรหัสข้อมูลพร็อพเพอร์ตี้ (โปรไฟล์) ในช่อง viewId
ในเนื้อหาคำขอ
ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ ids
ในคำขอ v3 กับช่อง viewId
ในคำขอ v4
v3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
"viewId":"XXXX",
...
}]
}
ช่วงวันที่
Analytics Reporting API v4 ช่วยให้คุณระบุช่วงวันที่ได้หลายช่วงในคำขอเดียว ช่อง dateRanges
จะใช้รายการออบเจ็กต์ DateRange
ใน v3 คุณใช้พารามิเตอร์ start-date
และ end-date
เพื่อระบุช่วงวันที่ในคำขอ
ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ start-date
และ end-date
ในคำขอ v3 กับช่อง dateRanges
ในคำขอ v4
v3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&start-date=2015-11-01&end-date=2015-11-06 \
...
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
"viewId":"XXXX",
"dateRanges":[
{
"startDate":"2015-11-01",
"endDate":"2015-11-06"
}],
....
}]
}
เมตริก
พารามิเตอร์ metrics
v3 สอดคล้องกับช่อง metrics
v4 ที่ใช้รายการออบเจ็กต์เมตริก
ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ metrics
ในคำขอ v3 กับช่อง metrics
ในคำขอ v4
v3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&start-date=2015-11-01&end-date=2015-11-06 \
&metrics=ga:users,ga:sessions \
...
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
"viewId":"XXXX",
"dateRanges":[
{
"startDate":"2015-11-01",
"endDate":"2015-11-06"
}],
"metrics":[
{
"expression":"ga:users"
},{
"expression":"ga:sessions"
}],
...
}]
}
ขนาด
พารามิเตอร์ dimensions
v3 สอดคล้องกับช่อง dimensions
v4 ที่ใช้รายการออบเจ็กต์มิติข้อมูล
ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ dimensions
ในคำขอ v3 กับช่อง dimensions
ในคำขอ v4
v3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&dimensions=ga:country,ga:browser&... \
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
...
"dimensions": [
{
"name":"ga:country"
},{
"name":"ga:browser"
}],
...
}]
}
กำลังจัดเรียง
พารามิเตอร์ sort
v3 เทียบเท่ากับช่อง v4 orderBys
ที่จะใช้รายการออบเจ็กต์ OrderBy
ใน v4 หากต้องการจัดเรียงผลลัพธ์ตามค่ามิติข้อมูลหรือเมตริก ให้ทำดังนี้
- ระบุชื่อหรือชื่อแทนในช่อง
fieldName
- ระบุลำดับการจัดเรียง (
ASCENDING
หรือDESCENDING
) ผ่านช่องsortOrder
ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ sort
ในคำขอ v3 กับช่อง orderBy
ในคำขอ v4 ทั้ง 2 แบบจะจัดเรียงผู้ใช้ตามลำดับตัวอักษรจากมากไปน้อยและแหล่งที่มา
v3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&sort=-ga:users,ga:source
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
...
"orderBys": [
{
"fieldName": "ga:users",
"sortOrder": "DESCENDING"
},{
"fieldName": "ga:source"
}],
}]
}
ระดับการสุ่มตัวอย่าง
พารามิเตอร์ samplingLevel
v3 สอดคล้องกับช่อง v4 samplingLevel
ใน v3 ค่า samplingLevel
ที่ยอมรับคือ FASTER
, HIGHER_PRECISION
และ DEFAULT
และใน v4 ค่า samplingLevel
ที่ยอมรับคือ SMALL
, LARGE
และ DEFAULT
โปรดทราบว่า FASTER
ใน v3 ได้เปลี่ยนเป็น SMALL
ใน v4 และ HIGHER_PRECISION
เป็น LARGE
ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ samplingLevel
ในคำขอ v3 กับช่อง samplingLevel
ในคำขอ v4
v3
https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX ...\
samplingLevel=HIGHER_PRECISION
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
...
"samplingLevel": "LARGE"
}]
}
กลุ่ม
พารามิเตอร์ segment
v3 จะสอดคล้องกับช่อง v4
segments
ที่ใช้รายการออบเจ็กต์กลุ่ม
รหัสกลุ่ม
ใน v4 หากต้องการขอกลุ่มตามรหัสกลุ่ม ให้สร้างออบเจ็กต์ Segment และระบุรหัสผ่านช่อง segmentId
ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ segment
ในคำขอ v3 กับช่อง segments
ในคำขอ v4
v3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&segment=gaid::-11
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests": [{
...
"viewId": "XXXX",
"segments": [{
"segmentId": "gaid::-11"
}]
}]
}
กลุ่มแบบไดนามิก
ใน v4 ให้ใช้ช่อง segments
ที่มีออบเจ็กต์ DynamicSegment เพื่อแสดงการกำหนดกลุ่มที่ซับซ้อนมากขึ้น
ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ segment
ในคำขอ v3 กับช่อง segments
ที่มีออบเจ็กต์ DynamicSegment
ในคำขอ v4
v3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&segment=sessions::condition::ga:medium==referral
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests": [{
...
"segments": [{
"dynamicSegment": {
"name": "segment_name",
"sessionSegment": {
"segmentFilters": [{
"simpleSegment": {
"orFiltersForSegment": [{
"segmentFilterClauses": [{
"dimensionFilter": {
"dimensionName": "ga:medium",
"operator": "EXACT",
"expressions": [ "referral" ]
}
}]
}]
}
}]
}
}
}]
}]
}
คุณสามารถรวมเงื่อนไขและลำดับไว้ในกลุ่มได้ ดังนี้
v3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&segment=users::condition::ga:revenue>10;sequence::ga:deviceCategory==desktop->>ga:deviceCategory==mobile
v4
"reportRequests": [{
"dateRanges": [
{ "endDate": "2014-11-30", "startDate": "2014-11-01" }
],
"metrics": [
{"expression": "ga:pageviews"},
{"expression": "ga:sessions"}
],
"viewId": "XXXX",
"dimensions":[{"name":"ga:medium"}, {"name":"ga:segment"}],
"segments": [{
"dynamicSegment": {
"name": "segment_name",
"userSegment": {
"segmentFilters": [{
"simpleSegment": {
"orFiltersForSegment": [{
"segmentFilterClauses": [{
"metricFilter": {
"metricName": "ga:sessions",
"operator": "GREATER_THAN",
"comparisonValue": "10"
}
}]
}]
}
},
{
"sequenceSegment": {
"segmentSequenceSteps": [{
"orFiltersForSegment": [{
"segmentFilterClauses": [{
"dimensionFilter": {
"dimensionName": "ga:deviceCategory",
"operator": "EXACT",
"expressions": ["desktop"]
}
}]
}],
"matchType": "PRECEDES"
},{
"orFiltersForSegment": [{
"segmentFilterClauses": [{
"dimensionFilter": {
"dimensionName": "ga:deviceCategory",
"operator": "EXACT",
"expressions": ["mobile"]
}
}]
}]
}]
}
}]
}
}
}]
}]
ไวยากรณ์กลุ่ม v3 ใน v4
ช่อง segmentId ใน API v4 รองรับไวยากรณ์ของกลุ่มใน API v3
ตัวอย่างต่อไปนี้แสดงวิธีที่ช่อง segmentId
ในคำขอที่เทียบเท่าใน v4 รองรับพารามิเตอร์ segment
ในคำขอ v3
v3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&segment=sessions::condition::ga:medium==referral
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests": [{
...
"viewId": "XXXX",
"segments": [{
"segmentId": "sessions::condition::ga:medium==referral"
}]
}]
}
ฟิลเตอร์
v4 ใช้ dimensionFilterClauses
ในการกรองมิติข้อมูลและ metricFilterClauses
เพื่อกรองเมตริก dimensionFilterClauses
มีรายการออบเจ็กต์ DimensionFilter และ metricFilterClauses
มีรายการออบเจ็กต์ MetricFilter
ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ filters
ในคำขอ v3 กับช่อง dimensionFilterClauses
ในคำขอ v4
v3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga:XXXX \
&start-date=2015-06-01&end-date=2015-07-31&metrics=ga:users& \
dimensions=ga:browser&filters=ga:browser==Firefox
v4
"reportRequests": [{
"dateRanges": [
{ "endDate": "2014-11-30", "startDate": "2014-11-01" }
],
"metrics": [
{"expression": "ga:pageviews"},
{"expression": "ga:sessions"}
],
"viewId": "XXXX",
"dimensions":[{"name":"ga:browser"}, {"name":"ga:country"}],
"dimensionFilterClauses": [{
"filters": [{
"dimension_name": "ga:browser",
"operator": "EXACT",
"expressions": ["Firefox"]
}]
}]
}]
ไวยากรณ์ตัวกรอง v3 ใน v4
แม้ว่าช่อง filtersExpression ใน v4 จะรองรับไวยากรณ์ filters
ใน v3 ให้ใช้ dimensionFilterClauses
และ metricFilterClauses
เพื่อกรองมิติข้อมูลและเมตริก
ตัวอย่างต่อไปนี้แสดงวิธีที่ช่อง filtersExpression
ในคำขอที่เทียบเท่าใน v4 รองรับพารามิเตอร์ filters
ในคำขอ v3
v3
GET https://www.googleapis.com/analytics/v3/data/ga?ids=ga%XXXX \
&filters=ga:browser==Firefox
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests": [{
...
"filtersExpression": "ga:browser==Firefox"
}]
}
แถวว่าง
พารามิเตอร์ include-empty-rows
v3 สอดคล้องกับช่อง includeEmptyRows
ใน v4 พารามิเตอร์ v3 มีค่าเริ่มต้นเป็น true ขณะที่ใน v4 ช่องจะใช้ค่าเริ่มต้นเป็น false หากไม่ได้กำหนดค่าใน v3 คุณจะต้องตั้งค่า
เป็น true ใน v4
ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ include-empty-rows
ในคำขอ v3 กับช่อง includeEmptyRows
ในคำขอ v4
v3
https://www.googleapis.com/analytics/v3/data/ga? ...\
&include-empty-rows=true
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
...
"includeEmptyRows": "true",
}]
}
การใส่เลขหน้า
v4 ใช้ช่อง pageToken
และ pageSize
เพื่อใส่เลขหน้าผ่านผลการค้นหาจำนวนมาก ได้รับ pageToken
จากพร็อพเพอร์ตี้ nextPageToken
ของออบเจ็กต์การตอบกลับ
ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ start-index
และ max-results
ในคำขอ v3 กับช่อง pageToken
และ pageSize
ในคำขอ v4
v3
https://www.googleapis.com/analytics/v3/data/ga? ...\
&start-index=10001&max-results=10000
v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet
{
"reportRequests":[
{
...
# Taken from `nextPageToken` of a previous response.
"pageToken": "10000",
"pageSize": "10000",
}]
}
พารามิเตอร์มาตรฐาน
Analytics Reporting API v4 รองรับพารามิเตอร์การค้นหามาตรฐานส่วนใหญ่ใน API v3 ยกเว้นพารามิเตอร์ userIp
และ callback
ตัวอย่างต่อไปนี้จะเปรียบเทียบพารามิเตอร์ quotaUser
ในคำขอ v3 กับพารามิเตอร์นั้นในคำขอ v4
ปลายทาง v3
GET https://www.googleapis.com/analytics/v3/data/ga?quotaUser=1X3F2F2
ปลายทาง v4
POST https://analyticsreporting.googleapis.com/v4/reports:batchGet?quotaUser=1X3F2F2
การตอบกลับ
เนื่องจาก V4 ช่วยให้คุณส่งออบเจ็กต์ ReportRequest หลายรายการในคําขอ HTTP รายการเดียว คุณจึงได้รับอาร์เรย์ของออบเจ็กต์รายงานในการตอบสนอง สำหรับทุก ReportRequest ที่ส่ง คุณจะได้รับ Report ที่เกี่ยวข้องในการตอบสนอง
รายงาน
รายงาน v4 มีช่องระดับบนสุด 3 ช่อง ได้แก่ columnHeader
, data
และ nextPageToken
เนื่องจากตัวการตอบกลับ V4 ไม่ได้รวมการตอบสนองต่อพารามิเตอร์การค้นหาทั้งหมดเหมือนกับการตอบกลับ v3 แอปพลิเคชันไคลเอ็นต์จึงต้องเพิ่มพารามิเตอร์นั้นไปยัง ReportRequest เพื่อรับการตอบสนองต่อพารามิเตอร์การค้นหาที่เฉพาะเจาะจง
เราได้ระบุ nextPageToken
ในส่วนการใส่เลขหน้าไปแล้ว ตอนนี้เรามาดูออบเจ็กต์ columnHeader กันก่อน
ส่วนหัวของคอลัมน์
ส่วนหัวของคอลัมน์ประกอบด้วยรายการ
มิติข้อมูล
ที่มีชื่อและออบเจ็กต์ MetricHeader
ซึ่งมีรายการออบเจ็กต์ MetricHeaderEntry แต่ละออบเจ็กต์ MetricHeaderEntry
ระบุเมตริก name
และ type
(สกุลเงิน เปอร์เซ็นต์ ฯลฯ)
ซึ่งจะช่วยจัดรูปแบบเอาต์พุต
ตัวอย่างต่อไปนี้จะเปรียบเทียบช่อง columnHeaders
ในการตอบกลับ v3 กับช่อง columnHeader
ในการตอบสนอง v4
v3
"columnHeaders": [
{
"name":"ga:source",
"columnType":"DIMENSION",
"dataType":"STRING"
},{
"name":"ga:city",
"columnType":"DIMENSION",
"dataType":"STRING"
},{
"name":"ga:sessions",
"columnType":"METRIC",
"dataType":"INTEGER"
},{
"name":"ga:pageviews",
"columnType":
"METRIC",
"dataType":"INTEGER"
}
]
v4
"columnHeader": {
"dimensions": [
"ga:source",
"ga:city"
],
"metricHeader": {
"metricHeaderEntries": [
{
"name": "ga:pageviews",
"type": "INTEGER"
},
{
"name": "ga:sessions",
"type": "INTEGER"
}
]
}
},
แถวรายงาน
Core Reporting API v3 จะแสดงข้อมูลรายงานในอาร์เรย์ rows ซึ่งมีมิติข้อมูลและเมตริกที่ขอ
Analytics Reporting API v4 จะแสดงผลข้อมูลรายงานในออบเจ็กต์ ReportRow ซึ่งมีอาร์เรย์ของมิติข้อมูลและอาร์เรย์ของออบเจ็กต์ DateRangeValues โดยแต่ละช่วงมีช่วงวันที่ 1 หรือ 2 ช่วงตามแผนภาพต่อไปนี้
แถว
v3
"rows": [
[
"google",
"Philadelphia",
"60",
"5"
],
[
"google",
"Johnstown",
"21",
"1"
],
[
"google",
"Progress",
"7",
"1"
]
],
v4
"rows": [
{
"dimensions": [
"google",
"Philadelphia"
],
"metrics": [
{
"values": [
"60",
"5"
]
}
]
},
{
"dimensions": [
"google",
"Johnstown"
],
"metrics": [
{
"values": [
"21",
"1"
]
}
]
},
{
"dimensions": [
"google",
"Progress"
],
"metrics": [
{
"values": [
"7",
"1"
]
}
]
}
],
ข้อมูลที่สุ่มตัวอย่างมา
หากผลลัพธ์ได้รับการสุ่มตัวอย่าง
Core Reporting API v3 จะแสดงช่องบูลีน
containsSampledData
ซึ่งตั้งค่าเป็น true
Analytics Reporting API v4 จะไม่แสดงบูลีนหากข้อมูลเป็นการสุ่มตัวอย่าง แต่ API จะแสดงผลช่อง samplesReadCounts
และ samplingSpaceSizes
หากผลลัพธ์ไม่ได้มาจากการสุ่มตัวอย่าง ระบบจะไม่กำหนดฟิลด์เหล่านี้
ตัวอย่าง Python ต่อไปนี้แสดงวิธีคํานวณว่ารายงานมีข้อมูลตัวอย่างหรือไม่
def ContainsSampledData(report):
"""Determines if the report contains sampled data.
Args:
report (Report): An Analytics Reporting API v4 response report.
Returns:
bool: True if the report contains sampled data.
"""
report_data = report.get('data', {})
sample_sizes = report_data.get('samplesReadCounts', [])
sample_spaces = report_data.get('samplingSpaceSizes', [])
if sample_sizes and sample_spaces:
return True
else:
return False
ด้านล่างคือตัวอย่างการตอบกลับซึ่งมีข้อมูลที่สุ่มตัวอย่างจากคำขอที่มีช่วงวันที่ 2 ช่วง ผลลัพธ์คำนวณจากตัวอย่างเกือบ 500,000 รายการของขนาดพื้นที่การสุ่มตัวอย่างประมาณ 15 ล้านเซสชัน ดังนี้
{
"reports":
[
{
"columnHeader": {
...
},
"data": {
...
"samplesReadCounts": [ "499630","499630"],
"samplingSpaceSizes": ["15328013","15328013"],
}
}
]
}
การแยกวิเคราะห์การตอบกลับ V4
โค้ดตัวอย่างต่อไปนี้จะแยกวิเคราะห์และพิมพ์การตอบกลับ Analytics Reporting API v4
Python
def printResponse(self, response):
"""Parses and prints the Analytics Reporting API v4 response"""
for report in response.get('reports', []):
columnHeader = report.get('columnHeader', {})
dimensionHeaders = columnHeader.get('dimensions', [])
metricHeaders = columnHeader.get('metricHeader', {}).get('metricHeaderEntries', [])
rows = report.get('data', {}).get('rows', [])
for row in rows:
dimensions = row.get('dimensions', [])
dateRangeValues = row.get('metrics', [])
for header, dimension in zip(dimensionHeaders, dimensions):
print header + ': ' + dimension
for i, values in enumerate(dateRangeValues):
print 'Date range (' + str(i) + ')'
for metricHeader, value in zip(metricHeaders, values.get('values')):
print metricHeader.get('name') + ': ' + value
Java
public static void printResponse(GetReportsResponse response) {
for (Report report: response.getReports()) {
ColumnHeader header = report.getColumnHeader();
List<String> dimensionHeaders = header.getDimensions();
List<MetricHeaderEntry> metricHeaders = header.getMetricHeader().getMetricHeaderEntries();
List<ReportRow> rows = report.getData().getRows();
for (ReportRow row: rows) {
List<String> dimensions = row.getDimensions();
List<DateRangeValues> metrics = row.getMetrics();
for (int i = 0; i < dimensionHeaders.size() && i < dimensions.size(); i++) {
System.out.println(dimensionHeaders.get(i) + ": " + dimensions.get(i));
}
for (int j = 0; j < metrics.size(); j++) {
System.out.print("Date Range (" + j + "): ");
DateRangeValues values = metrics.get(j);
for (int k = 0; k < values.size() && k < metricHeaders.size(); k++) {
System.out.println(metricHeaders.get(k).getName() + ": " + values.get(k));
}
}
}
}
}
การจัดการข้อผิดพลาด
เนื่องจากรูปแบบการตอบสนองต่อข้อผิดพลาดใน v4 แตกต่างจากใน v3 โปรดอัปเดตโค้ดให้จัดการการตอบกลับข้อผิดพลาด v4
ตัวอย่างต่อไปนี้จะเปรียบเทียบการตอบกลับข้อผิดพลาดใน v3 และการตอบกลับข้อผิดพลาดที่เทียบเท่าใน v4
v3
{
"error": {
"errors": [
{
"domain": "global",
"reason": "insufficientPermissions",
"message": "User does not have sufficient permissions for this profile.",
}
],
"code": 403,
"message": "User does not have sufficient permissions for this profile."
}
}
v4
{
"error": {
"code": 403,
"message": "User does not have sufficient permissions for this profile.",
"status": "PERMISSION_DENIED",
"details": [
{
"@type": "type.googleapis.com/google.rpc.DebugInfo",
"detail": "[ORIGINAL ERROR] generic::permission_denied: User does not have sufficient permissions for this profile. [google.rpc.error_details_ext] { message: \"User does not have sufficient permissions for this profile.\" }"
}
]
}
}