0

我正在开发一个谷歌应用程序脚本函数,它将在融合表中插入一行。我的大多数融合表界面都可以正常工作,但这是我第一次尝试 sql 'POST' 查询。根据此处的文档,我应该能够将 sql 语句放在 POST 正文中。我已将自己简化为OAuth Playground进行故障排除,但我不断收到以下错误。我一直在尝试使用 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 Playground 中工作。但是,我仍在为代码中的请求而苦苦挣扎。运行代码时我收到重复的授权请求(或调试时出现一般 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() 函数和该函数的整体布局与我用来在融合表中添加列的函数相同(有效)。

4

2 回答 2

2

文档有问题,缺少一些细节。

您可以在请求 url中使用 sql=... 参数。ContentType 标头通常是 application/json 但 API 也可能接受其他 ContentType。在这种情况下,您的 URL 长度限制为 2048 个字符。

您还可以在 POST body 中使用 sql=... 。在这种情况下,您必须将ContentType 设置为 application/x-www-form-urlencoded。您在 1 个请求中限制为 500 个 INSERT 语句。

另一种选择是使用 importRows 方法。在这里,您将使用CSV 作为 POST 正文。在这种方法中,您会受到 100MB 上传数据的限制。ContentType 必须是 "application/octet-stream"。请注意:网址与上述网址不同: https: //www.googleapis.com/upload/fusiontables/v1/tables/tableId/import。此外,如果您在正文中提供非 UTF-8 字符,则必须提供&encoding=... url 参数此处的更多详细信息:importRows 参考

于 2013-03-29T13:19:38.967 回答
0

成功!经过大量研究,我已经解决了这个问题。这不是有效负载或 contentType 问题(事实上,我发现 .fetch 自动默认为“application/x-www-form-urlencoded”编码)。问题在于授权。我使用 James Ferreira 的 Fusion Table Library 作为模型,并将其插入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. 请求的“服务”参数不同(“fusion”与“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(我在 GAS 中使用的内置授权工具)尚未迁移到 2.0,因此存在文档失效。我已在此处提交了迁移 OAuthConfig 的功能请求。如果您也希望它得到解决,请给该线程一些爱。
于 2013-03-30T20:28:59.680 回答