谷歌驱动API V3如何正确转义查询参数?

时间:2018-04-17 12:20:11

标签: go encoding google-drive-api

鉴于:使用名称空间的文件夹

访问Google云端硬盘

问题:查询:

name='07 Dirname' and mimeType='application/vnd.google-apps.folder' and '0B22uLx7BCvv9T0FWRmNaREY4VEE' in parents and trashed=false

不适用于API,但如果dir中没有空格,则会起作用。 但是,如果您从提供提示的API-Explorer运行它,则查询会起作用:此参数是URL编码的

但是,当我使用 url.QueryEscape url.PathEscape 对名称字段进行编码时,找不到该文件夹​​。据我所知,没有必要编码整个查询,只需要参数,但是如何?

THX。

2 个答案:

答案 0 :(得分:0)

查询需要进行双重编码才能工作,因此首先在上面给出的搜索中调用url.QueryEscape,然后再在查询字符串上调用url.QueryEscape。

如果你使用Chrome devtools查看API Explorer,你会看到双重编码的值,尽管页面本身有误导性的显示。

e.g。像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}

这样的东西

答案 1 :(得分:0)

我找到了访问此目录无效的原因。这是默认范围:

  

https://www.googleapis.com/auth/drive.file对文件的每个文件访问权限   由应用创建或打开。文件授权是在a上授予的   基于每个用户,并在用户取消对应用程序的授权时撤消。

但是要访问不是由应用程序创建的文件夹,我需要这个:

  

https://www.googleapis.com/auth/drive完整,宽松的访问范围   所有用户的文件,不包括Application Data文件夹。请求   只有在严格必要时才适用。

可以通过设置配置范围来请求:

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))
}