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 表格上次编辑日期
使用 Sheets API v4 Java 阅读整个 Google 电子表格
如何使用 Google Sheets API python 将下拉列表添加到 google sheet