OAuth的起,OAuthConfig,与谷歌Apps脚本(融合表API - SQL插入问题)(

2019-08-18 04:38发布

我正在开发,将插入一行到一个融合表一个谷歌的Google Apps脚本功能。 我的大部分融合表的接口工作正常,但这个是我在一个SQL“POST”查询的第一次尝试。 根据相关文档在这里我应该能够把POST体内的SQL语句。 我自己降低到OAuth园地进行故障排除和我不断收到以下错误。 我一直在试图使用SQL INSERT语句sql=INSERT INTO {fusionId} (HeadingName) VALUES (ValueOne)和我已经试过这句话的各种变化都无济于事。 请帮我确定正确的语法或方法来做到这一点。

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "required",
    "message": "Required parameter: sql",
    "locationType": "parameter",
    "location": "sql"
   }
  ],
  "code": 400,
  "message": "Required parameter: sql"
 }
}

有一次,我想出解决办法,然后我需要复制我的代码,(我认为)内的操场操作将是这个样子:

function fusionRequest(methodType, sql, oAuthFields) {
  OAL.googleAuth(oAuthFields);
  var options =
    {
      oAuthUseToken : "always",
      oAuthServiceName : 'fusiontables',
      method : "POST",
      payload : "sql=INSERT INTO {fusionId} (Heading) VALUES (ONE)",
      contentType : "application/json"
    };
Logger.log(options)
  var fetchResult = UrlFetchApp.fetch(oAuthFields.queryUrl, options);
  return JSON.parse(fetchResult.getContentText());  
}

我一直在想这也可能是与内容类型的问题,但我很茫然。 请帮忙。

更新#1使用三亚的意见,我是能够得到在OAuth游乐场工作的要求。 不过,我仍然在代码请求挣扎。 运行的代码(或调试时,一般OAuth错误)时,我得到授权的一再要求。 从我以前的经验在这里 ,我相信这意味着,还有什么毛病我的有效载荷。 在这个任何建议,将不胜感激。

var oAuthFields = {
  'clientId' : '523606257547.apps.googleusercontent.com',
  'scope' : 'https://www.googleapis.com/auth/fusiontables',
  'fetchUrl' : 'https://www.googleapis.com/fusiontables/v1/',
  'clientSecret' : 'L-f8DgwK4rs7Qmw9k5IFL7lZ',
  'fusionId' : '1b4kT_aYRfNBy8ZPtSZqhQUqVSVIYj_QWiBmjXXI',
  'service' : 'fusiontables',
  'queryUrl' : 'https://www.googleapis.com/fusiontables/v1/query/'
};
function fusionRequest(methodType, sql, oAuthFields) {
  OAL.googleAuth(oAuthFields);
  var options =
    {
      oAuthUseToken : "always",
      oAuthServiceName : 'fusiontables',
      method : "POST",
      payload : "sql=INSERT INTO {fusion id} (\'Heading\') VALUES (\'ONE\')",
      contentType : "application/x-www-form-urlencoded"
    };
  var fetchResult = UrlFetchApp.fetch(oAuthFields.queryUrl, options);
  return JSON.parse(fetchResult.getContentText());  
}

对于背景下,这一功能的googleAuth()函数和整体布局是一样的,因为我可以用它在融合表中添加列(工作)的功能。

Answer 1:

该文档是错误的,并有一些细节丢失。

您可以使用sql = ...参数中的URL请求 。 将contentType头通常是application / JSON但是API可能接受其他CONTENTTYPES了。 在这种情况下,你在2048个字符的URL长度的限制。

您还可以使用SQL = ... 在POST体 。 在这种情况下,你必须设置contentType都必须应用程序/ x-WWW的形式,进行了urlencoded。 您被限制为500个INSERT语句在1个请求。

另一种选择是使用importRows方法。 在这里,您将使用CSV作为POST主体 。 在这种方法中你被100MB上传数据的限制。 所述的ContentType必须是“应用程序/八位字节流”。 小心:网址超过上述不同: https://www.googleapis.com/upload/fusiontables/v1/tables/tableId/import 。 此外,如果你的身体提供非UTF-8字符,必须给出一个与编码= ... URL参数的更多细节在这里: importRows参考



Answer 2:

成功! 经过大量的研究,我已经解决了这个问题。 这不是一个有效载荷或问题的contentType(事实上,我发现.fetch自动默认为“应用程序/ x WWW的形式进行了urlencoded”编码)。 这个问题是与授权。 我用詹姆斯·费雷拉融合表库作为模型和插入Logger.log(UrlFetchApp.getRequest(url, fetchArgs))的前UrlFetchApp.fetch(url, fetchArgs).getContentText()在我的代码和库的两者。

//log entry for library
{oAuthServiceName=fusion, useIntranet=false, followRedirects=true, oAuthUseToken=always, payload=sql=INSERT INTO 1b4kT_aYRfNBy8ZPtSZqhQUqVSVIYj_QWiBmjXXI ('Heading', 'Heading 2') VALUES ('NONE','TWO'), method=POST, validateHttpsCertificates=true, contentType=application/x-www-form-urlencoded, url=https://www.google.com/fusiontables/api/query}

//log entry for my code
{oAuthServiceName=fusiontables, useIntranet=false, followRedirects=true, oAuthUseToken=always, payload=sql=INSERT+INTO+1b4kT_aYRfNBy8ZPtSZqhQUqVSVIYj_QWiBmjXXI+('Heading',+'Heading+2')+VALUES+('NONE','TWO'), method=POST, validateHttpsCertificates=true, contentType=application/x-www-form-urlencoded, url=https://www.googleapis.com/fusiontables/v1/query}

然后我比较了工作库的日志是我自己的,发现三个差异。

  1. 我的想法是对sql语句编码的差异(“INSERT INTO”与“INSERT INTO +”)。
  2. 请求的“服务”参数是不同的(“融合”与“fusiontables”)。
  3. 该QPI查询网址是不同的。 ( “www.google.com/fusiontables/api/query” 与“www.googleapis.com/fusiontables/v1/query)。

一些实验后,我决定...

  1. 假想的编码是不相关的我的错误。
  2. 服务参数也无关紧要。 我有不同的文档中看到两个,要么一个似乎工作。
  3. 无奈的是,这是问题。 因为这是令人沮丧的API文档说,使用一个不工作。 显然,www.googleapis.com/fusiontables/v1/query是与OAuth2.0的使用。 的OAuthConfig尚未迁移到2.0(我使用的气体bult-在授权工具),所以有文档的流逝。 我已经提交了功能要求迁移的OAuthConfig 这里 。 请给该线程一些爱,如果你也希望它来解决。


文章来源: OAuth, OAuthConfig, & Google Apps Script (Fusion Table API - SQL Insert Problems)