2016-08-09 5 views
0

Я создаю интеграцию между Google и Salesforce, для этого я APEX. Из-за потока и способа работы Salesforce мне пришлось создать учетную запись службы и войти в нее, используя это.Проблемы с Google REST API

У меня теперь проблема; Я вхожу в систему: все хорошо, затем я делаю вторую выноску, чтобы попытаться получить две последние созданные записи на моем Диске: я получаю только 1 файл - PDF с текстом приветствия и информацией о том, как использовать диск. .

Так что я сделал немного тестирования и обнаружил следующее:

  1. Если я использую this и Аутентифицировать с помощью OAuth 2.0 я не получаю никаких проблем, и я могу получить все документы, Я хочу получить.
  2. Если я получаю маркер доступа и добавить его к этому URL: https://www.googleapis.com/oauth2/v1/tokeninfo?access_token=xxxx я получаю ответ давая мне знать, что мой маркер правильно, и что у меня есть правильный объем, необходимый (см ниже)
    { 
     
    "issued_to": "1234567890", 
     
    "audience": "1234567890", 
     
    "scope": "https://www.googleapis.com/auth/drive https://www.googleapis.com/auth/drive.appdata https://www.googleapis.com/auth/drive.file https://www.googleapis.com/auth/drive.metadata https://www.googleapis.com/auth/drive.metadata.readonly https://www.googleapis.com/auth/drive.photos.readonly https://www.googleapis.com/auth/drive.readonly https://www.googleapis.com/auth/drive.scripts", 
     
    "expires_in": 3493, 
     
    "access_type": "offline" 
     
    }

Есть ли у кого-нибудь идеи, что я могу делать неправильно? Я использовал учетную запись службы, чтобы начать начальное подключение, для которого я активировал «Включить делегирование доменов Google Apps», я также установил как можно больше разрешений, чтобы позволить пользователю в основном просматривать и изменять все

-------- Update --------

фрагменты кода

Метод построения выноски:

public void getRecentImages(){ 
    Integration_Settings__c settings = Integration_Settings__c.getValues('Google APIs'); 

    String endpoint = settings.Endpoint_URL__c + '/drive/v3/files' + 
     '?corpus=user' + 
     '&orderBy=createdTime' + 
     '&pageSize=2'; 

    Map<String, String> headers = new Map<String, String>(); 
    headers.put('Authorization', 'Bearer ' + accessToken); 
    headers.put('Content-Type', 'application/json'); 
    headers.put('Charset', 'UTF-8'); 

    String method = 'GET'; 

    HttpResponse res = doCallout(endpoint, method, null, headers); 

    System.debug(res.getBody()); 

    JSONParser parser = JSON.createParser(res.getBody()); 

    // New instance of GoogleFiles 
    Google.GoogleFiles response; 

    // Try/Catch 
    try { 
     // Parse JSON into response 
     response = (Google.GoogleFiles)parser.readValueAs(Google.GoogleFiles.class); 

     System.debug(response); 
    } catch(Exception e){ 
     System.debug(e.getLineNumber() + ' - ' + e.getMessage()); 
    } 
} 

Способ сделать выноски:

public HttpResponse doCallout(String endpoint, String method, String body, Map<String, String> headers){ 
    // Instataite new instance of Http 
    Http h = new Http(); 

    // Instatiate new instace of HttpRequest 
    HttpRequest req = new HttpRequest(); 

    // Set Endpoint URL 
    req.setEndpoint(endpoint); 

    // Set Method Type 
    req.setMethod(method); 

    // Set Body 
    if(body != null) 
     req.setBody(body); 

    // If there are headers set Headers 
    if(headers != null && headers.size() > 0) 
     for(String s : headers.keySet()) 
      req.setHeader(s, headers.get(s)); 

    // Return HttpResponse 
    return h.send(req); 
} 

-------- Update 2 --------

JSON, который возвращается в условном обозначении Salesforce и Почтальон:

{ 
    "kind": "drive#fileList", 
    "files": [ 
    { 
     "kind": "drive#file", 
     "id": "0B_07cXloqOyRc3RhcnRlcl9maWxl", 
     "name": "Getting started", 
     "mimeType": "application/pdf" 
    } 
    ] 
} 

JSON, который возвращается из https://developers.google.com/drive/v3/reference/files/list:

{ 
    "kind": "drive#fileList", 
    "nextPageToken": "xxxxxx", 
    "files": [ 
    { 
     "kind": "drive#file", 
     "id": "xxxxxx", 
     "name": "xxxxxx", 
     "mimeType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 
    }, 
    { 
     "kind": "drive#file", 
     "id": "xxxxxx", 
     "name": "xxxxxx", 
     "mimeType": "application/vnd.google-apps.folder" 
    }, 
    { 
     "kind": "drive#file", 
     "id": "xxxxxx", 
     "name": "xxxxxx", 
     "mimeType": "application/vnd.google-apps.spreadsheet" 
    }, 
    { 
     "kind": "drive#file", 
     "id": "0B34hDNHXoLmVTFZ1VXhzbHRkUmc", 
     "name": "Osney Media - 00038156", 
     "mimeType": "application/vnd.google-apps.folder" 
    }, 
    { 
     "kind": "drive#file", 
     "id": "xxxxxx", 
     "name": "xxxxxx", 
     "mimeType": "application/vnd.google-apps.folder" 
    }, 
    { 
     "kind": "drive#file", 
     "id": "xxxxxx", 
     "name": "xxxxxx", 
     "mimeType": "application/vnd.google-apps.folder" 
    }, 
    { 
     "kind": "drive#file", 
     "id": "xxxxxx", 
     "name": "xxxxxx", 
     "mimeType": "application/vnd.google-apps.folder" 
    }, 
    { 
     "kind": "drive#file", 
     "id": "xxxxxx", 
     "name": "xxxxxx", 
     "mimeType": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" 
    }, 
    { 
     "kind": "drive#file", 
     "id": "xxxxxx", 
     "name": "xxxxxx", 
     "mimeType": "application/vnd.google-apps.folder" 
    }, 
    { 
     "kind": "drive#file", 
     "id": "xxxxxx", 
     "name": "xxxxxx", 
     "mimeType": "application/vnd.google-apps.folder" 
    }, 
    { 
     "kind": "drive#file", 
     "id": "xxxxxx", 
     "name": "xxxxxx", 
     "mimeType": "application/vnd.google-apps.folder" 
    }, 
    ETC...... 
    ] 
} 
+0

Вы упомянули: «Затем я делаю вторую выноску, чтобы попытаться получить две последние созданные записи на моем Диске». Пожалуйста, уточните, как вы на самом деле это сделали. Пожалуйста, поделитесь блоком кода. – some1

+0

@ some1 код добавлен! – Timothy

+0

Во-первых, вы можете использовать только [область] (https://developers.google.com/drive/v3/web/about-auth#what_scope_or_scopes_does_my_app_need) 'https: // www.googleapis.com/ auth/drive', он уже имеет полное разрешение на доступ к файлам. Если вы используете полномочия домена для домена, то правильно делегировать этот орган, используя учетную запись службы. Поэтому я предлагаю дважды проверить, выполняете ли вы правильные шаги при создании [учетной записи службы] (https://developers.google.com/identity/protocols/OAuth2ServiceAccount) – KENdi

ответ

0

Исправление должно заключаться в обновлении правил совместного доступа к соответствующим папкам для совместного использования контента с учетной записью службы ... a глупый способ сделать это, поскольку он должен иметь широкую делегацию ... но это жизнь.

0

Чтобы получить 2 самых последних документов, вам необходимо будет указать & orderBy = createdTime% 20desc.

Без % 20desc, вы получите первые 2 документа, созданные.

Кстати, вы можете включить дополнительные параметры поиска с помощью & q = .... для фильтрации других нежелательных файлов, например.только список созданных в определенных папках или принадлежащих определенным пользователям, и, возможно, также trashed% 3Dfalse

+0

Спасибо за этот комментарий! Моя проблема, даже без этих фильтров - ничего не вернет ... возвращается только документ Getting started. Никакие другие документы не возвращаются ... Вчера я даже создал новый Google Doc для тестирования, и он не был возвращен. – Timothy

+0

Я добавил в ответе JSON как выноски Google, так и выноски Salesforce/PostMan. – Timothy

+0

Как вы создали новый Google Doc, является ли он доступ к учетной записи службы? – some1

Смежные вопросы