我正在尝试编写Java代码,使用文档API将文章PDF上传到Mendeley,但我一直收到500错误。我是Java的新手,所以我可能只是使用了错误的代码或库。最终,目标是通过文档API将文章PDF发送到Mendeley,以便我可以检索有关该文章的元数据。
作为参考,这里是我试图在Java中复制的Mendeley API文档中提供的curl代码:
curl 'https://api.mendeley.com/documents' \
-X POST \
-H 'Authorization: Bearer ACCESS_TOKEN' \
-H 'Content-Type: application/pdf' \
-H 'Content-Disposition: attachment; filename="example.pdf"' \
--data-binary @example.pdf
我能够使用Python和请求库来使其工作。当我使用错误的访问令牌时,我收到401错误,因此我知道API正在接收我的查询。返回的500错误不包括其他错误文本。
// setup connection
String url = "https://api.mendeley.com/documents";
URL obj = new URL(url);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("POST");
con.setDoOutput(true);
// set headers
String ACCESS_TOKEN = getApiValue("api_token");
con.setRequestProperty("Authorization", "Bearer " + ACCESS_TOKEN);
con.setRequestProperty("Content-Type", "application/pdf");
con.setRequestProperty("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
// send PDF
DataOutputStream wr = new DataOutputStream(con.getOutputStream());
File pdfFile = new File(fileName);
byte[] buf = new byte[8192];
InputStream pdfIS = new FileInputStream(pdfFile);
int c = 0;
while ((c = pdfIS.read(buf, 0, buf.length)) > 0) {
wr.write(buf, 0, c);
wr.flush();
}
wr.close();
pdfIS.close();
// get results
int responseCode = con.getResponseCode();
BufferedReader in = new BufferedReader(
new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
我是一名使用Java在Mendeley工作的软件工程师,所以希望我能够很好地回答这个问题。
顺便说一句,您的原始问题表明您收到了501个响应代码 - 但是,在查看过去7天的Mendeley日志并且没有看到任何501响应代码之后,并且在尝试了您发布的代码之后,我假设你的意思是你有500个响应代码:)
事实证明这里有两个错误。第一个是OpenJDK中的错误(请参阅https://bugs.openjdk.java.net/browse/JDK-8163921和https://bugs.openjdk.java.net/browse/JDK-8177439) - 由于某种原因,如果您使用HttpUrlConnection但未设置Accept标头,则在您发出请求时会插入“默认”Accept标头。
不幸的是,提供的默认标头无效!所以你应该返回400错误(错误请求)。要解决此问题,请添加以下代码行,这会为您的请求添加有效的Accept标头,从而防止插入格式错误的标头:
con.setRequestProperty("Accept", "*/*");
现在一切都应该好像你已经提出了一个卷曲请求(或者至少,它使它对我有用)!
请注意,我提到应该返回400错误(以及一个有用的排序消息,它可以帮助您调试出错的地方)。不幸的是,我们这边有一个错误,这意味着当解析格式错误的默认Accept标头时,抛出了一个未正确处理的异常。由于我们没有处理异常,我们使用的框架默认返回500。我已经为此内部提出了一张票,所以希望将来能够修好。
最后,你发送请求的方式(即使用HttpUrlConnection类)虽然有效,却是非常低级的 - 这使得事情比你必须要复杂得多。我建议使用一个允许您发送请求的库,而不必担心一些细节,例如Jetty HttpClient或Apache HttpComponents library
我希望有所帮助!