给定:使用名称中包含空格的某些文件夹对Google云端硬盘进行工作访问
问题:查询:
name='07 Dirname' and mimeType='application/vnd.google-apps.folder' and '0B22uLx7BCvv9T0FWRmNaREY4VEE' in parents and trashed=false
不适用于 API,但如果目录中没有空间,则有效。但是,如果您从 API 资源管理器运行它,该查询确实有效,该资源管理器提供提示:此参数是 URL 编码的。
但是,当我使用 url 对名称字段进行编码时。查询转义或网址。找不到 PathEscape 文件夹。据我了解,没有必要对整个查询进行编码,只需对参数进行编码,但是如何编码?
感谢。
查询需要双重编码才能工作,因此请调用 url。QueryEscape 首先在上面给出的搜索上,然后再次在查询字符串上。
如果您查看带有Chrome开发工具的API资源管理器,尽管页面本身显示具有误导性,但您会看到双重编码值。
例如,类似https://content.googleapis.com/drive/v3/files?q=name%3D%2707+Dirname%27+and+mimeType%3D%27application%2Fvnd.google-apps.folder%27+and+%270B22uLx7BCvv9T0FWRmNaREY4VEE%27+in+parents+and+trashed%3Dfalse&key={APIKEY}
我找到了访问此目录不起作用的原因。这是默认范围,即:
https://www.googleapis.com/auth/drive.file 按文件访问文件 由应用创建或打开。文件授权授予于 基于每用户,并在用户取消对应用的授权时被吊销。
但是要访问不是由应用程序创建的文件夹,我需要这个:
https://www.googleapis.com/auth/drive 完整、宽松的访问范围 用户的所有文件,但"应用程序数据"文件夹除外。请求 仅在绝对必要时才使用此范围。
可以通过设置配置的范围来请求,如下所示:
func establishConnection() (*drive.Service, error) {
b, err := ioutil.ReadFile("client_secret.json")
if err != nil {
logrus.Fatalf("Unable to read client secret file: %v", err)
}
// If modifying these scopes, delete your previously saved client_secret.json.
config, err := google.ConfigFromJSON(b, drive.DriveScope)
if err != nil {
logrus.Fatalf("Unable to parse client secret file to config: %v", err)
}
return drive.New(getClient(config))
}