2017-05-24 5 views
0

J'utilise Guzzle pour envoyer une requête HTTP à Gmail API.Guzzle Envoie une requête HTTP à l'API Gmail, 'Type de ressource invalide: objet'

il déclenche l'exception Uncaught 'InvalidArgumentException' avec le message 'Type de ressource non valide: objet' Il semble que j'ai alimenté GuzzleHttp\Psr7\Request() Classe par erreur?

require_once __DIR__.'/vendor/autoload.php'; 
    $client = new Google_Client(); 
    $client->setScopes("https://www.googleapis.com/auth/gmail.readonly"); 
    putenv('GOOGLE_APPLICATION_CREDENTIALS=sample.json'); 
    $client->useApplicationDefaultCredentials(); 
    // returns a Guzzle HTTP Client 
    $httpClient = $client->authorize(); 
    $data = new stdClass; 
    $data-> topicName ='projects/sample.com:sample/topics/topic'; 
    $data-> labelIds = ["INBOX"]; 
    $data-> labelFilterAction = 'include'; 
    $request = new GuzzleHttp\Psr7\Request('POST','https://www.googleapis.com/gmail/v1/users/[email protected]/watch',['Content-type'=>'application/json'],$data); 
    $response = $httpClient->send($request); 
    var_dump($response); 

//------------output---------------------- 
Uncaught exception 'InvalidArgumentException' with message 'Invalid resource type: object' 

Merci à Andrew Nolan et Denis Solakovic, maintenant $request semble en format.

Voici la mise à jour: J'utilise un justificatif de compte de service pour regarder de nouveaux messages. Est-ce que quelqu'un sait où j'ai mal fait? Merci beaucoup.

require_once __DIR__.'/vendor/autoload.php'; 
$client = new Google_Client(); 
$client->setScopes("https://www.googleapis.com/auth/gmail.readonly"); 
putenv('GOOGLE_APPLICATION_CREDENTIALS=sample.json'); 
$client->useApplicationDefaultCredentials(); 
$gmailService = new Google_Service_Gmail($client); 
// returns a Guzzle HTTP Client 
$httpClient = $client->authorize(); 
$data = new stdClass; 
$data-> topicName ='projects/sample.com:sample/topics/topic'; 
$data-> labelIds = ["INBOX"]; 
$data-> labelFilterAction = 'include'; 
$data = json_encode((array)$data); 
$request = new GuzzleHttp\Psr7\Request('POST', 'https://www.googleapis.com/gmail/v1/users/[email protected]/watch',["Content-type" =>"application/json"],$data); 
$response = $httpClient->send($request); 
echo ($response->getBody()); 

//--------------output--------------------- 
{ "error": { "errors": [ { "domain": "global", "reason": "failedPrecondition", "message": "Bad Request" } ], "code": 400, "message": "Bad Request" } } 
+1

vous devez json_encode vos données. Vous envoyez GuzzleHttp \ Psr7 \ Request un objet mais il s'attend à ce que json. –

+1

Comme mentionné par @AndrewNolan vous envoyez une requête avec en-tête qui indique application/json, vous devriez donc convertir votre objet de demande $ en JSON: '$ json = json_encode ((tableau) $ request);' –

Répondre

0

ok, je l'ai maintenant, j'ai raté cette étape:

vous devez accorder des privilèges à publier

ServiceAccount: [email protected] à Cloud Pub/Sub Developer Console permissions interface

puis le code par envoi directe requête HTTP avec Guzzle:

$client = new Google_Client(); 
$client->setAuthConfig('xxxx-b2838442f7ad.json'); // downloaded json file. 
$client->setScopes(array("https://www.googleapis.com/auth/gmail.readonly")); 
$user_to_impersonate = '[email protected]'; //very important 
$client->setSubject($user_to_impersonate); //important 
$httpClient = $client->authorize(); 
$data = new stdClass; 
$data-> topicName ='projects/sample.com:sample/topics/topic'; 
$data-> labelIds = ["INBOX"]; 
$data-> labelFilterAction = 'include'; 
$data = json_encode($data); 
$request = new GuzzleHttp\Psr7\Request('POST', 'https://www.googleapis.com/gmail/v1/users/[email protected]/watch',["Content-type" =>"application/json"],$data); 
$response = $httpClient->send($request); 
echo($response->getBody()); 


// ------------------output----------------------------------- 
    { "historyId": "31325", "expiration": "1496503166524" } 

ou le code par Classes Gmail -Ce est plus difficile, vous devez regarder dans User.php et WatchRequest.php, sinon this article, il n'y avait aucune chance pour un amateur comme moi:

require_once __DIR__.'/vendor/autoload.php'; 
$client = new Google_Client(); 
$client->setAuthConfig('xxxx-b2838442f7ad.json'); // downloaded json file. 
$client->setScopes(array("https://www.googleapis.com/auth/gmail.readonly")); 
$user_to_impersonate = '[email protected]'; //very important 
$client->setSubject($user_to_impersonate); //important 
$watchreq = new Google_Service_Gmail_WatchRequest; 
$watchreq->setLabelIds(array('INBOX')); 
$watchreq->setTopicName('projects/sample.com:sample/topics/topic'); 
$watchreq->setLabelFilterAction('include'); 
$gmailService = new Google_Service_Gmail($client); 
$response =$gmailService->users->watch('me', $watchreq); 
echo($response->expiration)."<br/>"; 
echo($response->historyId); 

//---------------------output-------------------------- 

1496505109513 
31331