OAuth,OAuthConfig,& Google Apps脚本(Fusion Table API - SQL插入问题)

时间:2013-03-29 06:15:07

标签: sql oauth google-apps-script google-fusion-tables sql-insert

我正在开发一个谷歌应用程序脚本函数,它将一行插入融合表。我的大多数融合表接口工作正常,但这是我第一次尝试sql'POST'查询。基于文档here我应该能够将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"
 }
}

一旦我想到这一点,我就需要在我的代码中复制playground操作,我认为这将是这样的:

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错误)。根据我之前的经验here,我认为这意味着我的有效载荷仍有问题。对此有任何建议将非常感激。

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()函数和此函数的整体布局与我用于在融合表中添加列的函数相同(可以正常工作)。

2 个答案:

答案 0 :(得分:2)

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

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

您也可以在POST正文中使用sql = ... 。在这种情况下,您必须设置 ContentType必须是application / x-www-form-urlencoded 。在一个请求中,您只能使用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 reference

答案 1 :(得分:0)

SUCCESS!经过大量的研究,我已经解决了这个问题。它不是有效载荷或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. 请求的'service'参数不同(“fusion”与“fusiontables”)。
  3. qpi查询网址不同。 (“www.google.com/fusiontables/api/query”与“www.googleapis.com/fusiontables/v1/query”。
  4. 经过一些实验,我确定了......

    1. 假设的编码与我的错误无关。
    2. 服务参数也无关紧要。我已经在各种文档中看到过,其中一个似乎都有用。
    3. 令人沮丧的是,这就是问题所在。这令人沮丧,因为api documentation说使用那个不工作的那个。显然,www.googleapis.com/fusiontables/v1/query用于OAuth2.0。 OAuthConfig(我在GAS中使用的bult-in授权工具)尚未迁移到2.0,因此文档失效了。我已提交迁移OAuthConfig here的功能请求。如果你也想要解决这个问题,请给那个帖子一些爱。