我正在开发一个谷歌应用程序脚本函数,它将一行插入融合表。我的大多数融合表接口工作正常,但这是我第一次尝试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()函数和此函数的整体布局与我用于在融合表中添加列的函数相同(可以正常工作)。
答案 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}
然后我将工作库的日志与我自己的日志进行了比较,发现了三个不同之处。
经过一些实验,我确定了......