如何通过 SQL API 将超过 ~1,500 个字符写入融合 table 单元格

How to write more than ~1,500 characters to a fusion table cell via the SQL API

我有一个 AppEngine 应用程序使用 Google API Python 客户端通过 OAuth 访问 Fusion Tables API。当尝试 运行 UPDATE 命令时,API 客户端将我的整个 SQL 语句放入 URL.

中的查询字符串中

所以当我像这样写 SQL 语句时...

UPDATE <table ID> SET <column> = 'some really long piece of text...' WHERE ROWID = '1'

...我接到这样的 API 电话:

POST https://www.googleapis.com/fusiontables/v1/query?sql=UPDATE+<table ID>+SET+<column>+%3D+%27some+really+long+piece+of+text...%27+WHERE+ROWID+%3D+%271%27&alt=json

所有这一切都适用于大多数情况。但是当我向该单元格写入超过 ~1,500 个字符(取决于其中有多少是我必须转义的特殊字符)时,我遇到了错误。 The answer to another question says the limit to the number of characters in a cell is 1,000,000. I'm assuming this may be because the URL is getting just way too long (for something in the pipeline from AppEngine to the Fusion Tables API servers), maybe kind of like the issue addressed in this question.

对于其他 API,我习惯于在 POST 请求的表单数据中发送参数,而不是查询字符串,这使 URL 的大小保持在可管理的范围内。但是 Fusion Tables API docs 似乎表明查询字符串是正确的位置,并且不应在请求正文中发送任何内容。 API 客户端似乎尽职尽责地遵循这种模式(实际上将其用作所有 Google APIs 的默认行为??)。

所以我的问题有三个:

  1. 有谁知道 URL 是否会像我怀疑的那样变得太长?
  2. 查询字符串真的是发送 SQL 语句的唯一地方吗?或者如果我找到一种方法将它包含在请求正文中,API 会接受吗?
  3. 如果查询字符串真的是唯一的方法而且它确实会变得太长,是否有另一种方法可以 post 大字符串来融合 table 单元格?

所以我试了一下。数字 2 的答案是您 CAN 将查询作为表单数据放入请求 body 并且 API 将接受它(与文档建议的相反).我从 App Engine 到 Fusion Tables 的请求现在看起来像这样:

import httplib2
import urllib

value = 'Some really long string...'

# http is an instance of httplib2.Http
http.request('https://www.googleapis.com/fusiontables/v1/query?alt=json',
             method='POST',
             body=urllib.urlencode({
               'sql': unicode('UPDATE <table ID>' +
                              ' SET <column>=\'' + value + '\'' + 
                              ' WHERE ROWID = \'1\'').encode('utf-8')
             }),
             headers={'Content-Type': 'application/x-www-form-urlencoded'})

请注意,我认为 Content-Type header 是必需的,但没有它我还没有尝试过。

我还在其中留下了一些 unicode 和 UTF-8 编码的东西,因为对于需要支持几千个字符的人来说,其中一些字符可能是 non-ascii 和 urllib.urlencode 不喜欢 non-ascii 个字符...

如果有人有更多信息,我仍然希望能回答第 1 条和第 3 条问题,但这目前似乎对我有用。我很好奇为什么在请求中使用表单数据 body 从一开始就不是 Fusion Tables 团队的默认方法...