Google Sheets API v4 接收公共供稿的 HTTP 401 响应
Posted
技术标签:
【中文标题】Google Sheets API v4 接收公共供稿的 HTTP 401 响应【英文标题】:Google Sheets API v4 receives HTTP 401 responses for public feeds 【发布时间】:2016-09-15 20:44:24 【问题描述】:在针对公共(即“发布到网络”并与“网络上的任何人”共享)电子表格运行时,我无法从 Google Sheets API 的 v4 获得响应。
相关文档说明:
“如果请求不需要授权(例如对公共数据的请求),则应用程序必须提供 API 密钥或 OAuth 2.0 令牌,或两者兼有——无论哪种方式对您来说最方便。”
为了提供 API 密钥,文档指出:
“获得 API 密钥后,您的应用程序可以将查询参数 key=yourAPIKey 附加到所有请求 URL。”
因此,我应该能够在以下 URL 的公共电子表格中获得列出工作表的响应:
https://sheets.googleapis.com/v4/spreadsheets/spreadsheetId?key=myAPIkey
(显然,在路径和查询字符串中分别提供了 id 和 key)
但是,当我这样做时,我会收到 HTTP 401 响应:
error:
code: 401,
message: "The request does not have valid authentication credentials.",
status: "UNAUTHENTICATED"
其他人可以让它针对公共工作簿工作吗?如果没有,任何人都可以从 Google 方面监视此线程,或者发表评论或提供工作示例吗?
【问题讨论】:
您是否使用 GET 命令,其 URL 类似于:“GET sheet.googleapis.com/v4/spreadsheets/spreadsheetIdspreadsheetId?key=myAPIkey 然后发布它在 URL 导航栏中? 使用“https”方案,将“spreadsheetId”令牌替换为公共电子表格的 ID,并将“myAPIkey”令牌替换为我的项目的有效 API 密钥,是的. 你试过我更新的答案了吗? 【参考方案1】:我设法让这个工作。甚至一开始我也很沮丧。而且,这不是错误。我是这样做的:
-
首先,在您的 GDC 中启用这些功能以消除身份验证错误。
-Google Apps 脚本执行 API
-Google 表格 API
注意:确保您在 GDC 中使用的 Google 帐户必须与您在电子表格项目中使用的帐户相同,否则您可能会收到 "The API Key and the authentication credential are from different projects"
错误消息。
-
转到https://developers.google.com/oauthplayground,您将获得授权令牌。
在第 1 步中,选择 Google Sheets API v4 并选择
https://www.googleapis.com/auth/spreadsheets
范围,这样您就拥有机器人读取和写入权限。
单击授权 API 按钮。允许身份验证,您将继续执行第 2 步。
在第 2 步中,单击 兑换令牌的授权码 按钮。之后,继续第 3 步。
在第 3 步中,是时候粘贴您的 URL 请求了。由于默认服务器方法是 GET 继续并单击发送请求按钮。
注意:确保您的 URL 请求是 Spreadsheetv4 docs 中指定的。
这是我的示例 URL 请求:
https://sheets.googleapis.com/v4/spreadsheets/SPREADSHEET_ID?includeGridData=false
我收到了HTTP/1.1 200 OK
,它显示了我请求的数据。这适用于所有 Spreadsheetv4 服务器端进程。
希望这会有所帮助。
【讨论】:
我刚刚尝试了这种方法,但得到的结果与原始帖子中描述的相同。显然,正如 Sam 所指出的,这可能是一个已知问题。不过,如果你让它工作,请告诉我。 它仅在从 GDC 尝试时有效,我尝试使用 Curl 使用相同的令牌,但它失败了。 key=API KEY 方法也不起作用。我想知道它是否已修复! @wabbit 您是否收到诸如“权限不足”或“需要登录”之类的错误? “它不起作用”并没有描述问题。 @noogui 我尝试在 shell 上的命令中使用 GDC 生成的相同令牌,但它仍然显示为 UNAUTHENTICATED(代码:401)。类似于最初的问题中提到的 这到底是做什么的?好像只是在测试请求……【参考方案2】:我们最近修复了这个问题,它现在应该可以工作了。很抱歉给您带来麻烦,请重试。
文档必须共享给“知道链接的任何人”或“在网络上公开”。 (注意:与 v3 API 不同,“文件 -> 发布到网络”中的发布设置无关紧要。)
【讨论】:
谢谢,山姆。我会期待修复。 那么现在的解决方法是什么?这仍然不起作用,我找不到 v3 中有关如何实现此目的的任何文档。 @JonShrike -- 抱歉,目前唯一的解决方法是传递身份验证令牌......这不是一种解决方法。 @SamBerlin 在我看来仍然很糟糕 @sww314 -- 你提交的错误是指写作,这个问题是指阅读。读取请求只需一个 apikey 即可正常工作。【参考方案3】:这不是问题的解决方案,但我认为这是实现目标的好方法。在现场http://embedded-lab.com/blog/post-data-google-sheets-using-esp8266/ 我发现了如何使用 Google Apps 脚本更新电子表格。这是 GET 方法的示例。我将尝试向您展示 JSON 格式的 POST 方法。
如何发布: 创建 Google 电子表格,在标签 Tools > Script Editor 中粘贴以下脚本。通过输入适当的电子表格 ID 和工作表选项卡名称来修改脚本(脚本中的第 27 和 28 行)。
function doPost(e)
var success = false;
if (e != null)
var JSON_RawContent = e.postData.contents;
var PersonalData = JSON.parse(JSON_RawContent);
success = SaveData(
PersonalData.Name,
PersonalData.Age,
PersonalData.Phone
);
// Return plain text Output
return ContentService.createTextOutput("Data saved: " + success);
function SaveData(Name, Age, Phone)
try
var dateTime = new Date();
// Paste the URL of the Google Sheets starting from https thru /edit
// For e.g.: https://docs.google.com/---YOUR SPREADSHEET ID---/edit
var MyPersonalMatrix = SpreadsheetApp.openByUrl("https://docs.google.com/spreadsheets/d/---YOUR SPREADSHEET ID---/edit");
var MyBasicPersonalData = MyPersonalMatrix.getSheetByName("BasicPersonalData");
// Get last edited row
var row = MyBasicPersonalData.getLastRow() + 1;
MyBasicPersonalData.getRange("A" + row).setValue(Name);
MyBasicPersonalData.getRange("B" + row).setValue(Age);
MyBasicPersonalData.getRange("C" + row).setValue(Phone);
return true;
catch(error)
return false;
现在保存脚本并转到标签 发布 > 部署为 Web 应用。
执行应用程序为:Me xyz@gmail.com,
谁有权访问该应用:任何人,甚至是匿名的
然后您可以使用 Postman 应用进行测试。
或使用 UWP:
private async void Button_Click(object sender, RoutedEventArgs e)
using (HttpClient httpClient = new HttpClient())
httpClient.BaseAddress = new Uri(@"https://script.google.com/");
httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
httpClient.DefaultRequestHeaders.AcceptEncoding.Add(new System.Net.Http.Headers.StringWithQualityHeaderValue("utf-8"));
string endpoint = @"/macros/s/---YOUR SCRIPT ID---/exec";
try
PersonalData personalData = new PersonalData();
personalData.Name = "Jarek";
personalData.Age = "34";
personalData.Phone = "111 222 333";
HttpContent httpContent = new StringContent(JsonConvert.SerializeObject(personalData), Encoding.UTF8, "application/json");
HttpResponseMessage httpResponseMessage = await httpClient.PostAsync(endpoint, httpContent);
if (httpResponseMessage.IsSuccessStatusCode)
string jsonResponse = await httpResponseMessage.Content.ReadAsStringAsync();
//do something with json response here
catch (Exception ex)
public class PersonalData
public string Name;
public string Age;
public string Phone;
以上代码需要 NuGet Newtonsoft.Json。
结果:
【讨论】:
【参考方案4】:如果您的提要是公开的并且您正在使用 api 密钥,请确保您正在抛出一个 http GET 请求。如果是 POST 请求,您将收到此错误。 我也面临同样的情况。 使用获取数据 方法:电子表格.getByDataFilter 有 POST 请求
【讨论】:
以上是关于Google Sheets API v4 接收公共供稿的 HTTP 401 响应的主要内容,如果未能解决你的问题,请参考以下文章
使用 Sheets API v4 Java 阅读整个 Google 电子表格
如何使用 Google Sheets API V4 导入 CSV 文件
Google Sheets API v4 - 如何获得最后一行的价值?