0

我正在尝试使用 Mendeley API 下载附加到资源(文档)的文件。我在这里关注开发人员文档: https ://dev.mendeley.com/methods/#downloading-a-file 看起来应该相当简单。我已经弄清楚了 Oauth 流程,并且能够从 Mendeley 库中提取所有文档。我还可以获取给定文档的附件 ID。

当我尝试使用该 ID 检索文件(在本例中为 pdf)时,它失败了。我已将参数复制到邮递员,它在那里工作正常。但是,当我尝试在我的 Ruby-on-rails 应用程序中使用 javascript 执行此操作时,它失败了。

我是 javascript 的新手,所以我很可能会遗漏一些明显的东西。

这是javascript代码片段:

downloadFile = (json) => {
        this.getAuthCode();
        this.provideToken = (token) => {
            const access_token = token;
            var myHeaders = new Headers();
            myHeaders.append("Authorization", `Bearer ${access_token}`);
            var requestOptions = {
                method: 'GET',
                headers: myHeaders,
            };
            fetch(`https://api.mendeley.com/files/${json[0].id}`, requestOptions).then(resp => {
                console.log(resp)
            })
        }
    }

json 参数是与文档关联的文件数组。在 Mendeley 服务器重定向到相关文件的 AWS S3 存储 URL 之前,它似乎工作正常。这是 Chrome 开发者控制台输出:

 `Response {type: "cors", url: "https://mendeley-files.s3.amazonaws.com/31/9f/319f…09d6b8443d1e734fad70c551e37a0a3497b42c69fd0796c91", redirected: true, status: 400, ok: false, …}
body: (...)
bodyUsed: false
headers: Headers
__proto__: Headers
ok: false
redirected: true
status: 400
statusText: "Bad Request"
type: "cors"
url: "https://mendeley-files.s3.amazonaws.com/31/9f/319fe16b678cc65092ef5aa732b3e4c137f272f3?response-content-disposition=attachment%3Bfilename%3D%222003-Psychometric_properties_of_student_ratings_of_instruction_in_online_and_on-campus_courses.pdf%22&response-content-type=application%2Fpdf&X-Amz-Security-Token=IQoJb3JpZ2luX2VjEOz%2F%2F%2F%2F%2F%2F%2F%2F%2F%2FwEaCWV1LXdlc3QtMSJIMEYCIQCP0qEL1EJeGKIBVmxX2FaPIZftcmqiW%2FzgDY5ysRs25AIhAMM6q3YzWSubSnuuXOs9gi8voOZ%2BRrkQS343IkihJka1KvYDCDUQAhoMMTA4MTY2MTk0NTA1Igx2zsOuUuv1h6V8cw0q0wMNdVy5izfbA30MysjiNXG3V%2F21aHfn2xXF8ZKq74%2FAbDUbTzKfFWuN79ARNbEyeGinrXdlRXb%2FlEP9ZRgb6xh1%2BtCBtpqT8esZmdZcERC%2Fpup8dtd8q%2BWeCxVKVIyYZffZJvJW1wQOONhMJnfpb751Lr1pTN%2BAu38q8Dky8sOB%2B%2FyH0xOXbP5S0IFErM0B1Ac7eJLOTLrrzwuQ17Z1ZF%2FN5ZenKtV5rrIRR8RU0%2FnzY6EQip1LIHy7l%2F0rN9srGyM1n3fT5trqKL7H6mi79ZlbN0RJ%2FZAtO6pWTL6DbpFzrlCTt6fI%2B2UqdEDrVBO4QT8ROYnd8dYd%2F3hrB1%2BOjuugRDRE6tUehgn9lnFWUndww0XHOWUq8GWAOImeBts7fazUmcCv8lzhH09FYwbcaOKghr6HhJko5UUpeGV4TjMVCA1wUZ4G3DBBVTUIKBLbve0oWFexVFj2J380neGXywdPbEzUcp5o6N%2FEGOW5nMJHlwIquMDubiwgrQ5ANES6RhuO%2BBQTHuy9JdL2KrfhEHA3UJBm6T4Azg1XgEIpXo84Hs7cc2x7ewZ6CPUyzXcc%2Bx72u1o6RwoE12AKdp%2BwqZK4NnFmn6jXKKCSShgmVuqUr3ARVTDmy%2Bb1BTruAQmSrzEXqXzi5Ut4AWjWCEMvw4mB5Yk8W6v5V6YTRtwp8ebqI9Q4hzfMT62ko1AQsBwhKX8anZTIvDVpImcjbUQnaWVGKehj0OGVOb%2FnCn3JXZRq2bCKfQ2Mf7YxlWSHIy9CWqZiW4uTpdSfk5kOOnYQhrKhHQJc%2BM%2F7BldOy72AVgikcmvQdR3k315KNwh%2BJ96ci4LvRa%2BiXw5stATLCQCSKWPYCRonCighfGxNoAyWvvuTkjaQe3bm6X64Giwm2qyyAso05hnC3gotbefpEFNjx2%2Brgm2G%2FzNwdKkr2I%2BFy%2BnGXVNNG2ruh2DMVOw%3D&X-Amz-Algorithm=AWS4-HMAC-SHA256&X-Amz-Date=20200511T205618Z&X-Amz-SignedHeaders=host&X-Amz-Expires=600&X-Amz-Credential=ASIARSLZVEVE5V2CTSJF%2F20200511%2Fus-east-1%2Fs3%2Faws4_request&X-Amz-Signature=96b2a6673ab742909d6b8443d1e734fad70c551e37a0a3497b42c69fd0796c91"
__proto__: Response
arrayBuffer: ƒ arrayBuffer()
blob: ƒ blob()
body: (...)
bodyUsed: (...)
clone: ƒ clone()
formData: ƒ formData()
headers: (...)
json: ƒ json()
ok: (...)
redirected: (...)
status: (...)
statusText: (...)
text: ƒ text()
type: (...)
url: (...)
constructor: ƒ Response()
Symbol(Symbol.toStringTag): "Response"
get body: ƒ body()
get bodyUsed: ƒ bodyUsed()
get headers: ƒ headers()
get ok: ƒ ok()
get redirected: ƒ redirected()
get status: ƒ status()
get statusText: ƒ statusText()
get type: ƒ type()
get url: ƒ url()
__proto__: Object`

它清楚地找到了正确的文件,但无法下载。当我在邮递员中运行它时,它会下载文件。

我尝试添加在 Postman 中显示为“隐藏”的各种标题,但我得到的响应基本相同。对此的任何想法或方向将不胜感激。注意安全!

4

1 回答 1

1

参考文档:https ://dev.mendeley.com/code/core_quick_start_guides.html#file_download

这对我有用:

async function getFile(fileId) {
  const url = `https://api.mendeley.com/files/${fileId}`;
  const res = await superagent.get(url).auth(accessToken, { type: 'bearer' });
  const [fileUrl] = res.redirects;
  return fileUrl;
}
于 2020-07-31T23:37:12.070 回答