Google Contacts API call return Response ok, но пустой JSON

В настоящее время создается приложение Laravel, которое использует пакет Socialite для успешной аутентификации пользователей с использованием их учетных данных Google. Однако я пытаюсь сделать запрос GET к серверу Google, чтобы получить список контактов данного пользователя, я немного экспериментировал на Google oAuth 2 Playground и пытался эмулировать тот же запрос внутри своего приложения. Я создал следующую функцию:

public function getContactList()
{

$client = new \GuzzleHttp\Client();

$email = \Auth::user()->email;

$token = \Session::get('token');

$json = $client->get('https://www.google.com/m8/feeds/contacts/default/full/',  [

    'headers' => [

        'Authorization' => 'Bearer ' . $token,

    ],
]);

dd($json);

return $json;

}

После бесконечной борьбы за то, чтобы обойти запрещенные ответы, я наконец получил положительный ответ, но он бесполезен, в теле ничего нет, декодирование с помощью Json_decode дает null, вот ответ:

Response {#198 ▼
  -reasonPhrase: "OK"
  -statusCode: 200
  -effectiveUrl: "https://www.google.com/m8/feeds/contacts/default/full/"
  -headers: array:11 [▼
    "expires" => array:1 [▼
      0 => "Mon, 30 Mar 2015 15:19:52 GMT"
    ]
    "date" => array:1 [▼
      0 => "Mon, 30 Mar 2015 15:19:52 GMT"
    ]
    "cache-control" => array:1 [▶]
    "vary" => array:2 [▶]
    "content-type" => array:1 [▶]
    "x-content-type-options" => array:1 [▶]
    "x-frame-options" => array:1 [▶]
    "x-xss-protection" => array:1 [▶]
    "content-length" => array:1 [▶]
    "server" => array:1 [▶]
    "alternate-protocol" => array:1 [▶]
  ]
  -headerNames: array:11 [▼
    "expires" => "Expires"
    "date" => "Date"
    "cache-control" => "Cache-Control"
    "vary" => "Vary"
    "content-type" => "Content-Type"
    "x-content-type-options" => "X-Content-Type-Options"
    "x-frame-options" => "X-Frame-Options"
    "x-xss-protection" => "X-XSS-Protection"
    "content-length" => "Content-Length"
    "server" => "Server"
    "alternate-protocol" => "Alternate-Protocol"
  ]
  -body: Stream {#197 ▼
    -stream: :stream {@8 ▼
      wrapper_type: "PHP"
      stream_type: "TEMP"
      mode: "w+b"
      unread_bytes: 0
      seekable: true
      uri: "php://temp"
      options: []
    }
    -size: null
    -seekable: true
    -readable: true
    -writable: true
    -uri: "php://temp"
    -customMetadata: []
  }
  -protocolVersion: "1.1"
}

Что я могу изменить или что мне нужно изменить, чтобы получить полный список контактов вместо пустого ответа 200?

ОБНОВЛЕНИЕ. Я провел несколько тестов, чтобы проверить точность моих запросов, и обнаружил, что указанный выше запрос действительно возвращает канал ATOM, что может быть проблемой. Когда я делал запросы к Drive API, которые возвращали ответы JSON, я мог без каких-либо проблем извлечь соответствующие данные, просто проанализировав их с помощью json_decode. Какую функцию мне нужно использовать для анализа данных ATOM в PHP, чтобы получить их?


person ferenan    schedule 30.03.2015    source источник
comment
google.com/ Atom - это xml на основе.   -  person Shaun Bramley    schedule 30.03.2015
comment
Я знаю, что Atom основан на XML, мой вопрос: как я могу извлечь xml / atom из тела объекта $ json в строку?   -  person ferenan    schedule 31.03.2015
comment
Если ваш канал ATOM встроен в ответ json, вы можете просто использовать функцию декодирования json PHP php.net/manual/en/function.json-decode.php   -  person Shaun Bramley    schedule 31.03.2015


Ответы (2)


Вы пробовали добавить параметр alt = json в свой запрос GET? Вот так :

$response = $client->get('https://www.google.com/m8/feeds/contacts/default/full?alt=json',  [
 'headers' => [
   'Authorization' => 'Bearer ' . $token,
 ],
]);

Я пытался получить API контактов в JSON, и, похоже, это правильный способ: https://developers.google.com/google-apps/contacts/v3/reference#contacts-query-параметры-ссылка

person Philippe Sultan    schedule 23.07.2015

Вы получаете Response объект от Guzzle. Для объекта Response доступен json метод, поэтому вы должны иметь возможность:

$response = $client->get('https://www.google.com/m8/feeds/contacts/default/full/',  [
    'headers' => [
        'Authorization' => 'Bearer ' . $token,
    ],
]);

echo $response->json();

Источник: http://guzzle.readthedocs.org/en/latest/http-messages.html#id2

person Ben Harold    schedule 30.03.2015