我有一个应用程序,允许我使用API密钥从Google电子表格中读取数据。我只是对这个地址进行HTTP GET并获得数据响应。
https://sheets.googleapis.com/v4/spreadsheets/18soCZy9H4ZGuu**********BeHlNY1lD8at-Pbjmf8c/values/Sheet1!A1?key=AIzaSyAYJ***********pB-4iKZjYf4y0vhXP8OM
但是当我尝试使用HTTP PUT写入数据来执行相同的操作
时https://sheets.googleapis.com/v4/spreadsheets/18soCZy9H4ZGuu**********BeHlNY1lD8at-Pbjmf8c/values/Sheet1!A4?valueInputOption=RAW?key=AIzaSyAYJ***********pB-4iKZjYf4y0vhXP8OM
它给我401错误。 用于发出PUT请求的代码:
using (WebClient wc = new WebClient())
{
byte[] res = wc.UploadData(link, "PUT", Encoding.ASCII.GetBytes(textBox1.Text));
MessageBox.Show(Encoding.Default.GetString(res));
}
此外,电子表格完全公开,任何人都可以在没有身份验证的情况下进行读写操作。我的猜测是我无法使用API密钥将数据写入电子表格,只有这样才能使用OAuth。
更新 所以我刚刚尝试使用Google.Apis.Sheets.v4来编写值,现在我几乎100%确定API Key无法用于将数据写入Google Spreadsheet。那么,我将使用OAuth 2.0。
答案 0 :(得分:3)
好吧,也许你是对的,这里的问题是API_KEY本身。
如果您查看Sheets API documentation,则说明您的应用程序发送到Google表格API的每个请求都需要向Google标识您的应用程序。有两种方法可以识别您的应用:使用OAuth 2.0 token
(也授权请求)和/或使用应用程序API key
。以下是如何确定使用哪些选项:
如果请求需要授权(例如请求个人的私人数据),则应用程序必须为请求提供OAuth 2.0令牌。应用程序还可以提供API密钥,但它不必提供。
如果请求不需要授权(例如公共数据请求),则应用程序必须提供API密钥或OAuth 2.0令牌,或两者兼而有之 - 无论哪种选项最方便你。
因此意味着OAuth 2.0 token或API密钥在您的情况下将起作用,因为该文件是公共的。但问题出在你正在做的PUT请求中,我们可以假设API密钥没有使用它。但是,我们有替代方案,那就是OAuth。
我在这里也找到了一个相关的SO question可能对你有帮助。
答案 1 :(得分:1)
对于仍然希望得到一个简单答案的人来说,似乎不会有一个 - 任何写入工作表,无论工作表权限如何,都需要OAuth2:
'这是故意行为。虽然公开表是匿名可读的,但由于各种原因目前不支持匿名编辑。
在此背景下,“任何人”==拥有Google帐户的任何人。 HERE
答案 2 :(得分:0)
此处未提及的一种选择是改为使用服务帐户。服务帐户就像用户,但不隶属于任何人。而是将它们附加到项目中。
服务帐户具有电子邮件地址和私钥。两者都可用于创建JWTClientAuth,并且可用于在实例化API时对其进行身份验证或对每个请求进行身份验证。
服务帐户的优点是它的工作方式类似于API KEY-无需要求用户将URL复制到浏览器,然后再将代码复制回应用程序-但因为它可以充当经过身份验证的用户,可以将服务帐户的电子邮件地址作为编辑者添加到Google表格中。有了此功能,应用程序就可以对工作表具有完全的写访问权,而不必处理授权码,刷新令牌和复制/粘贴。
您可以看到一个Python示例Python With Google Sheets Service Account Step By Step和一个Node.js示例Accessing Google APIs Using Service Account in Node.js。我按照以下示例进行设置。
由于您使用的是C#,因此您可能会发现Writing to Google Sheets API Using .NET and a Service Account会有所帮助。
此方法从JSON文件读取服务帐户凭据,然后实例化SheetsService:
private void ConnectToGoogle() {
GoogleCredential credential;
// Put your credentials json file in the root of the solution and make sure copy to output dir property is set to always copy
using (var stream = new FileStream(Path.Combine(HttpRuntime.BinDirectory, "credentials.json"),
FileMode.Open, FileAccess.Read)) {
credential = GoogleCredential.FromStream(stream).CreateScoped(_scopes);
}
// Create Google Sheets API service.
_sheetsService = new SheetsService(new BaseClientService.Initializer() {
HttpClientInitializer = credential, ApplicationName = _applicationName
});
}
然后,您可以使用Google Sheets .NET Client Library写入数据。