gpt4 book ai didi

java - 尝试使用 Java 将 PDF 上传到 Mendeley 时收到 500 错误

转载 作者:行者123 更新时间:2023-11-30 05:42:09 27 4
gpt4 key购买 nike

我正在尝试编写 Java 代码以使用其文档 API 将文章 PDF 上传到 Mendeley,但我不断收到 500 错误。我是 Java 新手,所以我可能只是使用了错误的代码或库。最终,目标是通过 Mendeley 的文档 API 将文章 PDF 发送到 Mendeley,以便我可以检索有关该文章的元数据。

作为引用,这里是 Mendeley API 文档中提供的curl 代码,我试图在 Java 中复制它:

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 和 requests 库让它工作。当我使用错误的访问 token 时,我会收到 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();

最佳答案

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

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

事实证明这里有两个错误。第一个是 OpenJDK 中的错误(请参阅 https://bugs.openjdk.java.net/browse/JDK-8163921https://bugs.openjdk.java.net/browse/JDK-8177439 ) - 由于某种原因,如果您使用 HttpUrlConnection 但没有设置 Accept header ,那么当您创建请求。

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

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

现在一切都应该像您发出了curl请求一样工作(或者至少,这使它对我有用)!

请注意,我提到应该返回 400 错误(以及一条有助于您调试问题所在的有用消息)。不幸的是,我们这边有一个错误,这意味着当解析格式错误的默认 Accept header 时,会抛出一个未正确处理的异常。由于我们没有处理异常,因此我们使用的框架默认返回 500。我已经在内部为此提出了一个问题,所以希望这个问题将来能够得到解决。

最后,您发送请求的方式(即使用 HttpUrlConnection 类)虽然有效,但却是相当低级的 - 这使事情对您来说比应有的更加复杂。我建议使用一个库,它允许您发送请求而不必担心一些具体细节,例如 Jetty HttpClientApache HttpComponents library

希望对您有所帮助!

关于java - 尝试使用 Java 将 PDF 上传到 Mendeley 时收到 500 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55445684/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com