[英]The API package 'memcache' or call 'Get()' was not found
我正在研究可以在以下站点找到的Google Drive API示例: 使用服务帐户 , 插入文件和设置权限 。 您可能会猜到,我才刚刚开始使用Google API。 因此,我确信答案已经存在,但是我对该主题的了解还不足以解释这些发现。
无论如何,我已使用Google的示例代码成功为我的服务帐户连接到云端硬盘。 但是,我无法插入文件。 我收到以下错误:
com.google.apphosting.api.ApiProxy$CallNotFoundException: The API package 'memcache' or call 'Get()' was not found. at com.google.apphosting.api.ApiProxy$1.get(ApiProxy.java:162) at com.google.apphosting.api.ApiProxy$1.get(ApiProxy.java:160) at com.google.appengine.api.utils.FutureWrapper.get(FutureWrapper.java:86) at com.google.appengine.api.memcache.MemcacheServiceImpl.quietGet(MemcacheServiceImpl.java:26) at com.google.appengine.api.memcache.MemcacheServiceImpl.get(MemcacheServiceImpl.java:49) at com.google.appengine.api.appidentity.AppIdentityServiceImpl.getAccessToken(AppIdentityServiceImpl.java:188) at com.google.api.client.googleapis.extensions.appengine.auth.oauth2.AppIdentityCredential.intercept(AppIdentityCredential.java:93) at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:859) at com.google.api.client.googleapis.media.MediaHttpUploader.executeCurrentRequestWithoutGZip(MediaHttpUploader.java:545) at com.google.api.client.googleapis.media.MediaHttpUploader.executeCurrentRequest(MediaHttpUploader.java:562) at com.google.api.client.googleapis.media.MediaHttpUploader.executeUploadInitiation(MediaHttpUploader.java:519) at com.google.api.client.googleapis.media.MediaHttpUploader.resumableUpload(MediaHttpUploader.java:384) at com.google.api.client.googleapis.media.MediaHttpUploader.upload(MediaHttpUploader.java:336) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:418) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343) at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460) at DriveTest.GDrive.insertFile(GDrive.java:80) at DriveTest.GDrive.putFile(GDrive.java:58) at DriveTest.App.main(App.java:28) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) The API package 'memcache' or call 'Get()' was not found.
我上面引用的站点中的代码几乎是剪切粘贴的:
列出的第一行是导致错误的行。
File file = service.files().insert(body, mediaContent).execute();
package DriveTest;
import com.google.api.client.googleapis.extensions.appengine.auth.oauth2.AppIdentityCredential;
import com.google.api.client.googleapis.services.CommonGoogleClientRequestInitializer;
import com.google.api.client.googleapis.services.GoogleClientRequestInitializer;
import com.google.api.client.http.FileContent;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
import com.google.api.services.drive.model.File;
import com.google.api.services.drive.model.ParentReference;
import com.google.api.services.drive.model.Permission;
import java.io.IOException;
import java.net.URISyntaxException;
import java.security.GeneralSecurityException;
import java.util.ArrayList;
import java.util.Arrays;
public class GDrive {
private static GDrive instance=null;
private static Drive drive=null;
private static final String API_KEY = "ourkey";
protected GDrive() {}
public static GDrive getInstance() {
if(instance==null) {
instance=new GDrive();
}
return instance;
}
public void setDriveService() throws GeneralSecurityException,IOException, URISyntaxException {
if(drive==null) {
HttpTransport httpTransport = new NetHttpTransport();
JsonFactory jsonFactory = new JacksonFactory();
ArrayList<String> scopes=new ArrayList<String>();
scopes.add(DriveScopes.DRIVE);
AppIdentityCredential credential = new AppIdentityCredential.Builder(scopes).build();
GoogleClientRequestInitializer keyInitializer = new CommonGoogleClientRequestInitializer(API_KEY);
drive = new Drive.Builder(httpTransport, jsonFactory, null)
.setHttpRequestInitializer(credential)
.setGoogleClientRequestInitializer(keyInitializer)
.build();
}
}
public void putFile(String filename) throws Exception {
File theFile=this.insertFile(this.drive, "Report", "a report!","","application/vnd.ms-excel",filename);
Permission thePermission=this.setShare(this.drive, theFile.getId(),"someuser@somedomain.com","user","reader");
}
private File insertFile(Drive service, String title, String description,
String parentId, String mimeType, String filename) {
// File's metadata.
File body = new File();
body.setTitle(title);
body.setDescription(description);
body.setMimeType(mimeType);
// Set the parent folder.
if (parentId != null && parentId.length() > 0) {
body.setParents(
Arrays.asList(new ParentReference().setId(parentId)));
}
// File's content.
java.io.File fileContent = new java.io.File(filename);
FileContent mediaContent = new FileContent(mimeType, fileContent);
try {
File file = service.files().insert(body, mediaContent).execute();
// Uncomment the following line to print the File ID.
System.out.println("File ID: %s" + file.getId());
return file;
} catch (IOException e) {
System.out.println("An error occured: " + e);
return null;
}
}
/**
* Insert a new permission.
*
* @param service Drive API service instance.
* @param fileId ID of the file to insert permission for.
* @param value User or group e-mail address, domain name or {@code null}
"default" type.
* @param type The value "user", "group", "domain" or "default".
* @param role The value "owner", "writer" or "reader".
* @return The inserted permission if successful, {@code null} otherwise.
*/
private Permission setShare(Drive service, String fileId,
String value, String type, String role) throws Exception {
Permission newPermission = new Permission();
newPermission.setValue(value);
newPermission.setType(type);
newPermission.setRole(role);
try {
return service.permissions().insert(fileId, newPermission).execute();
} catch (IOException e) {
System.out.println("An error occurred: " + e);
}
return newPermission;
}
}
最后,我正在使用Maven处理依赖关系:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>DriveTest</groupId>
<artifactId>DriveTest</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>DriveTest</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client</artifactId>
<version>1.17.0-rc</version>
</dependency>
<dependency>
<groupId>com.google.api-client</groupId>
<artifactId>google-api-client-appengine</artifactId>
<version>1.17.0-rc</version>
</dependency>
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-drive</artifactId>
<version>v2-rev105-1.17.0-rc</version>
</dependency>
<dependency>
<groupId>com.google.http-client</groupId>
<artifactId>google-http-client-jackson</artifactId>
<version>1.17.0-rc</version>
</dependency>
<dependency>
<groupId>com.google.appengine</groupId>
<artifactId>appengine-api-1.0-sdk</artifactId>
<version>1.8.1</version>
</dependency>
</dependencies>
</project>
我确定我错过了一些东西,但是不确定那是什么。
谢谢。
好吧,我设法解决了这个问题,但答案并不完全令人满意。 根据有关服务帐户的Google SDK文档 ,有两种方法可以对其进行身份验证。
首先是创建一个证书(在上面的链接中详细介绍),并使用该证书和服务电子邮件帐户地址。 第二种是使用电子邮件帐户和api密钥。 第二种方法是我正在使用的方法。
该文档警告:
“注意:使用API密钥参数而不是使用Client ID和Client Secret方法对应用程序进行身份验证时,由于该方法的可信度较低,因此Google Drive API的所有特定于应用程序的功能都将被禁用。例如每个文件的Drive范围和“应用程序数据”文件夹无法使用。”
但是,我找不到有用的信息来详细说明为什么我收到提示此问题的错误。
因此,为了解决该问题,我改用了带有证书文件的电子邮件地址,并且效果很好。
这是直接用于链接的代码:
import com.google.api.client.googleapis.extensions.appengine.auth.oauth2.AppIdentityCredential;
import com.google.api.client.googleapis.services.CommonGoogleClientRequestInitializer;
import com.google.api.client.googleapis.services.GoogleClientRequestInitializer;
import com.google.api.client.http.HttpTransport;
import com.google.api.client.http.javanet.NetHttpTransport;
import com.google.api.client.json.JsonFactory;
import com.google.api.client.json.jackson.JacksonFactory;
import com.google.api.services.drive.Drive;
import com.google.api.services.drive.DriveScopes;
...
/** The API Key of the project */
private static final String API_KEY = "the_api_key_of_the_project";
/**
* Build and returns a Drive service object authorized with the
* application's service accounts.
*
* @return Drive service object that is ready to make requests.
*/
public static Drive getDriveService() throws GeneralSecurityException,
IOException, URISyntaxException {
HttpTransport httpTransport = new NetHttpTransport();
JsonFactory jsonFactory = new JacksonFactory();
AppIdentityCredential credential =
new AppIdentityCredential.Builder(DriveScopes.DRIVE).build();
GoogleClientRequestInitializer keyInitializer =
new CommonGoogleClientRequestInitializer(API_KEY);
Drive service = new Drive.Builder(httpTransport, jsonFactory, null)
.setHttpRequestInitializer(credential)
.setGoogleClientRequestInitializer(keyInitializer)
.build();
return service;
}
将此替换为我的setDriveService(),一切都很好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.