courses.list Google Classroom API возвращает JSON, который не соответствует описанию API

У нас есть сообщение от пользователя о том, что в нашей интеграции с Google классом не все работает правильно. Немного покопавшись, мы попросили пользователя отправить файл HAR со всей информацией о сети, когда они используют наш API. В нем мы обнаружили, что запрос мы делаем:

 gapi.client.request({
   root: 'https://classroom.googleapis.com',
   path: 'v1/courses',
   params: {
     'pageSize': 1,
     'teacherId': 'me'
   }
 })

возвращает ответ с набором свойств nextPageToken, но без набора свойств курсов.

Ниже приведена фактическая запись из файла HAR (без заголовка авторизации):

{
    "startedDateTime": "2016-03-25T21:08:16.672Z",
    "time": 957.9219999995985,
    "request": {
      "method": "GET",
      "url": "https://content-classroom.googleapis.com/v1/courses?pageSize=1&teacherId=me",
      "httpVersion": "unknown",
      "headers": [
        {
          "name": "X-Goog-Encode-Response-If-Executable",
          "value": "base64"
        },
        {
          "name": "X-Origin",
          "value": "https://www.lucidpress.com"
        },
        {
          "name": "X-ClientDetails",
          "value": "appVersion=5.0%20(X11%3B%20CrOS%20x86_64%207834.61.0)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F49.0.2623.95%20Safari%2F537.36&platform=Linux%20x86_64&userAgent=Mozilla%2F5.0%20(X11%3B%20CrOS%20x86_64%207834.61.0)%20AppleWebKit%2F537.36%20(KHTML%2C%20like%20Gecko)%20Chrome%2F49.0.2623.95%20Safari%2F537.36"
        },
        {
          "name": "User-Agent",
          "value": "Mozilla/5.0 (X11; CrOS x86_64 7834.61.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.95 Safari/537.36"
        },
        {
          "name": "Referer",
          "value": "https://content-classroom.googleapis.com/static/proxy.html?sensitive_query_string?"
        },
        {
          "name": "X-JavaScript-User-Agent",
          "value": "google-api-javascript-client/1.1.0-beta"
        },
        {
          "name": "X-Referer",
          "value": "https://www.lucidpress.com"
        }
      ],
      "queryString": [
        {
          "name": "pageSize",
          "value": "1"
        },
        {
          "name": "teacherId",
          "value": "me"
        }
      ],
      "cookies": [],
      "headersSize": -1,
      "bodySize": 0
    },
    "response": {
      "status": 200,
      "statusText": "",
      "httpVersion": "unknown",
      "headers": [
        {
          "name": "date",
          "value": "Fri, 25 Mar 2016 21:08:18 GMT"
        },
        {
          "name": "content-encoding",
          "value": "gzip"
        },
        {
          "name": "x-content-type-options",
          "value": "nosniff"
        },
        {
          "name": "server",
          "value": "ESF"
        },
        {
          "name": "x-frame-options",
          "value": "SAMEORIGIN"
        },
        {
          "name": "vary",
          "value": "Origin"
        },
        {
          "name": "vary",
          "value": "X-Origin"
        },
        {
          "name": "vary",
          "value": "Referer"
        },
        {
          "name": "content-type",
          "value": "application/json; charset=UTF-8"
        },
        {
          "name": "status",
          "value": "200"
        },
        {
          "name": "alternate-protocol",
          "value": "443:quic,p=1"
        },
        {
          "name": "cache-control",
          "value": "private"
        },
        {
          "name": "alt-svc",
          "value": "quic=\":443\"; ma=2592000; v=\"31,30,29,28,27,26,25\""
        },
        {
          "name": "content-length",
          "value": "198"
        },
        {
          "name": "x-xss-protection",
          "value": "1; mode=block"
        }
      ],
      "cookies": [],
      "content": {
        "size": 206,
        "mimeType": "application/json",
        "text": "{\n  \"nextPageToken\": \"some_string_token_sensitive?"\n}\n"
      },
      "redirectURL": "",
      "headersSize": -1,
      "bodySize": -1,
      "_transferSize": 448
    },
    "cache": {},
    "timings": {
      "blocked": 2.4730000004638,
      "dns": -1,
      "connect": -1,
      "send": 0.8660000003146702,
      "wait": 953.5609999984446,
      "receive": 1.0220000003754421,
      "ssl": -1
    }
  },

Я попросил пользователя заполнить запрос через "Попробуйте!" область в описании API без pageSize установлена ​​в 1 и возвращает правильный формат. Нам также не удалось воспроизвести с помощью наших тестовых аккаунтов, и мы не слышали никаких других сообщений о подобных проблемах.

Кто-нибудь еще сталкивался с этим или есть какие-либо идеи о том, что может происходить?

1 ответ

В ответе JSON ничего не отформатировано. pageSize устанавливает максимальное количество результатов, которое должен возвращать API, а не минимальное. Ваш код должен обрабатывать случай, когда nextPageToken установлен, но courses не путем получения следующей страницы, пока не вернется курс.

Из любопытства, почему вы выбираете только один курс?

Другие вопросы по тегам