尝试使用Java将PDF上载到Mendeley时收到500错误

问题描述 投票:1回答:1

我正在尝试编写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 api pdf httpurlconnection mendeley
1个回答
1
投票

我是一名使用Java在Mendeley工作的软件工程师,所以希望我能够很好地回答这个问题。

顺便说一句,您的原始问题表明您收到了501个响应代码 - 但是,在查看过去7天的Mendeley日志并且没有看到任何501响应代码之后,并且在尝试了您发布的代码之后,我假设你的意思是你有500个响应代码:)

事实证明这里有两个错误。第一个是OpenJDK中的错误(请参阅https://bugs.openjdk.java.net/browse/JDK-8163921https://bugs.openjdk.java.net/browse/JDK-8177439) - 由于某种原因,如果您使用HttpUrlConnection但未设置Accept标头,则在您发出请求时会插入“默认”Accept标头。

不幸的是,提供的默认标头无效!所以你应该返回400错误(错误请求)。要解决此问题,请添加以下代码行,这会为您的请求添加有效的Accept标头,从而防止插入格式错误的标头:

con.setRequestProperty("Accept", "*/*");

现在一切都应该好像你已经提出了一个卷曲请求(或者至少,它使它对我有用)!

请注意,我提到应该返回400错误(以及一个有用的排序消息,它可以帮助您调试出错的地方)。不幸的是,我们这边有一个错误,这意味着当解析格式错误的默认Accept标头时,抛出了一个未正确处理的异常。由于我们没有处理异常,我们使用的框架默认返回500。我已经为此内部提出了一张票,所以希望将来能够修好。

最后,你发送请求的方式(即使用HttpUrlConnection类)虽然有效,却是非常低级的 - 这使得事情比你必须要复杂得多。我建议使用一个允许您发送请求的库,而不必担心一些细节,例如Jetty HttpClientApache HttpComponents library

我希望有所帮助!

© www.soinside.com 2019 - 2024. All rights reserved.