问题描述
我有一个 React 应用程序,允许用户输入特定的 Google 文档,然后我们分析其内容。对于第 1 步,选择文档,我使用 this nifty npm package,它还会返回给我一个“OAuth 令牌”,我认为它是一个 String*
,我可以用它来进行 API 调用。我将返回的令牌和 Picker API 返回的数据设置为组件中的状态变量,如下所示
@main def prog(c:Char,n:Int,rest:String*) =
println(s"$c:$n and ${rest.length} other args")
然后我尝试调用 Drive API export function 以在此函数中下载所述文件
access_token
但是,我在执行此操作时收到 401 错误。有人可以指出我在哪里丢失身份验证吗?非常感谢
在下面编辑我的整个组件
<GooglePicker clientId={process.env.REACT_APP_GOOGLE_CLIENT_ID}
developerKey={process.env.REACT_APP_GOOGLE_API_KEY}
scope={ScopES}
onAuthenticate={(token: any) => {
setGoogletoken(token)
}}
onChange={(data: any) => {
setGoogleData(data);
nextOnboardingStage();
}}
onAuthFailed={(data: any) => console.log('on auth Failed:',data)}
multiselect={true}
navHidden={true}
authImmediate={false}
mimeTypes={['application/vnd.google-apps.document']}
viewId={'DOCS'}>
<MyCustomButton />
</GooglePicker>
编辑
正如@Tanaike 所说,我需要在我的请求中包含 MimeType,工作功能如下
const downloadGoogleDoc = async (authToken: string,fileID: string) => {
const res = await axios.get(`https://www.googleapis.com/drive/v3/files/${fileID}/export`,{
headers: {
'Authorization': `token ${authToken}`
}
});
console.log(res);
};
解决方法
我相信你的目标和你的情况如下。
- 您想知道
401
错误的原因。 - 根据您的脚本,我认为您可能想要下载不是 Google 文档文件(文档、电子表格、幻灯片等)的文件。
- 因为下载 Google Docs 文件时,端点不正确。使用Drive API v3中的“文件:导出”方法时,需要使用
mimeType
进行导出。 - 但从您的回复中,我了解到您想使用“文件:导出”的方法下载 Google 文档文件。
- 因为下载 Google Docs 文件时,端点不正确。使用Drive API v3中的“文件:导出”方法时,需要使用
- 您的访问令牌可用于从 Google 云端硬盘下载文件。
修改点:
-
当我看到您的以下脚本时,我注意到除了端点之外的一个修改点。
const res = await axios.get(`https://www.googleapis.com/drive/v3/files/${fileID}/export`,{ headers: { 'Authorization': `token ${authToken}` } });
- 在这种情况下,
token
不正确。请修改为Bearer
。我认为这就是错误401
的原因。
- 在这种情况下,
-
当使用
catch
时,可以检索错误信息。 -
如果下载二进制文件,则直接检索二进制数据。那时,当使用
responseType: 'arrayBuffer'
和responseType: 'blob'
时,数据分别作为数组缓冲区和blob检索。
当以上几点反映到你的脚本中时,它变成如下。
修改后的脚本:
从:const res = await axios.get(`https://www.googleapis.com/drive/v3/files/${fileID}/export`,{
headers: {
'Authorization': `token ${authToken}`
}
});
到:
const mimeType = "###"; // Please set the mimeType.
const res = await axios.get(`https://www.googleapis.com/drive/v3/files/${fileID}/export?mimeType=${mimeType}`,{
// responseType: `arrayBuffer`,// or 'blob'
headers: {
'Authorization': `Bearer ${authToken}`
}
}).catch(err => console.log(err.response));
console.log(res); // or res.data
注意:
-
在这个修改后的脚本中,它假设您的访问令牌可用于从 Google Drive 下载文件。所以请注意这一点。
-
当您使用“文件:导出”方法时,请使用Google Docs文件作为文件ID。请注意这一点。 Ref