Search code examples
gmailgmail-api

Gmail REST api batch support for getting messages


We need to switch from google client library to Gmail REST api in our project, and I've encountered a problem with batch() because it is not available in REST api - you can only get list of ids of messages and then get each message one by one using it's id. If we use that gmail library everything seems to be clear. We create a batch object and then queue each GET request inside of it. We don't have to care how it's implemented inside. At the moment I'm trying to do some POC and I'm testing these suggestions https://developers.google.com/gmail/api/guides/batch with Postman but with no luck..

I'm getting 400 bad request. How should a proper request body look like in Postman (or other application)? The next step will be implementing multipart request in Java and sending POST using RestTemplate but I need to present some POC in Postman first.

I'm setting it like on this screenshot -> Postman

What am I doing wrong?:)


Solution

  • You are close. Here is a working example:

    Request

    POST https://www.googleapis.com/batch
    Content-Type: multipart/mixed; boundary="foo_bar"
    Authorization: Bearer {ACCESS_TOKEN}
    
    --foo_bar
    Content-Type: application/http
    
    GET /gmail/v1/users/me/messages/152d10540c21bd07
    
    --foo_bar
    Content-Type: application/http
    
    GET /gmail/v1/users/me/messages/152d1050d666d7ad
    
    --foo_bar--
    

    Response

    --batch_7Xp52oGIwpA_AAEAc7ERnGU
    Content-Type: application/http
    
    HTTP/1.1 200 OK
    ETag: "A-DdBGA6g-wV4rIZCu5Hcm3JQpY/w2hzEg9kqXFH7AEJ-oSc-y10HNQ"
    Content-Type: application/json; charset=UTF-8
    Date: Thu, 11 Feb 2016 16:02:06 GMT
    Expires: Thu, 11 Feb 2016 16:02:06 GMT
    Cache-Control: private, max-age=0
    Content-Length: 2809
    
    {
     "id": "152d10540c21bd07",
     "threadId": "152d1050d666d7ad",
     "labelIds": [
      "SENT",
      "INBOX",
      "IMPORTANT"
     ],
     "snippet": "Likewise buddy.", ...
    }
    
    --batch_7Xp52oGIwpA_AAEAc7ERnGU
    Content-Type: application/http
    
    HTTP/1.1 200 OK
    ETag: "A-DdBGA6g-wV4rIZCu5Hcm3JQpY/7v2nqQFBDmEHVvEQoboiwSidilE"
    Content-Type: application/json; charset=UTF-8
    Date: Thu, 11 Feb 2016 16:02:06 GMT
    Expires: Thu, 11 Feb 2016 16:02:06 GMT
    Cache-Control: private, max-age=0
    Content-Length: 1752
    
    {
     "id": "152d1050d666d7ad",
     "threadId": "152d1050d666d7ad",
     "labelIds": [
      "SENT",
      "INBOX",
      "IMPORTANT"
     ],
     "snippet": "Nice to meet you.", ...
    }
    
    --batch_7Xp52oGIwpA_AAEAc7ERnGU--
    

    You don't have to specify the host in each part of the batch, and giving the access token in the Authorization header is enough. You don't have to specify the Content-Length yourself, and don't forget to wrap you boundary string with ".

    Then you just have to parse the JSON of each part and you are done.