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

尝试使用Java将PDF上载到Mendeley时收到500错误,java,api,pdf,httpurlconnection,mendeley,Java,Api,Pdf,Httpurlconnection,Mendeley,我试图编写Java代码,使用Mendeley的文档API将一篇文章PDF上传到Mendeley,但我一直收到一个500错误。我是Java新手,所以可能只是使用了错误的代码或库。最终,目标是通过Mendeley的文档API向其发送一篇PDF文章,以便我能够检索关于该文章的元数据 作为参考,下面是我试图在Java中复制的Mendeley API文档中提供的curl代码: curl 'https://api.mendeley.com/documents' \ -X POST \ -H

我试图编写Java代码,使用Mendeley的文档API将一篇文章PDF上传到Mendeley,但我一直收到一个500错误。我是Java新手,所以可能只是使用了错误的代码或库。最终,目标是通过Mendeley的文档API向其发送一篇PDF文章,以便我能够检索关于该文章的元数据

作为参考,下面是我试图在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错误不包括其他错误文本

//设置连接
字符串url=”https://api.mendeley.com/documents";
URL obj=新URL(URL);
HttpURLConnection con=(HttpURLConnection)obj.openConnection();
con.setRequestMethod(“POST”);
con.设置输出(真);
//设置标题
字符串访问令牌=getApiValue(“api令牌”);
con.setRequestProperty(“授权”、“承载人”+访问令牌);
con.setRequestProperty(“内容类型”、“应用程序/pdf”);
con.setRequestProperty(“内容处置”、“附件;文件名=\”“+文件名+”\”);
//发送PDF
DataOutputStream wr=新的DataOutputStream(con.getOutputStream());
文件pdfFile=新文件(文件名);
字节[]buf=新字节[8192];
InputStream pdfIS=新文件InputStream(pdfFile);
int c=0;
而((c=pdfIS.read(buf,0,buf.length))>0){
wr.write(buf,0,c);
wr.flush();
}
wr.close();
pdfIS.close();
//取得成果
int responseCode=con.getResponseCode();
BufferedReader in=新的BufferedReader(
新的InputStreamReader(con.getInputStream());
字符串输入线;
StringBuffer响应=新的StringBuffer();
而((inputLine=in.readLine())!=null){
追加(inputLine);
}
in.close();

我是一名使用Java在门德雷工作的软件工程师,希望我能很好地回答这个问题

另一方面,您最初的问题表明您获得了501个响应代码——然而,在过去7天查看了Mendeley日志后,没有看到任何501个响应代码,在尝试了您发布的代码后,我认为您的意思是您获得了500个响应代码:)

原来这里有两个虫子在起作用。第一个是OpenJDK中的一个bug(请参阅和)-出于某种原因,如果您使用HttpUrlConnection但没有设置Accept头,那么在发出请求时会插入一个“默认”Accept头

很遗憾,提供的默认标头无效!因此,应该返回400错误(错误请求)。 要解决此问题,请添加以下代码行,这将向请求中添加有效的Accept标头,从而防止插入格式错误的默认标头:

con.setRequestProperty("Accept", "*/*");
现在,一切都应该像您提出了卷曲请求一样工作(或者至少,这使它适合我)

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

最后,您发送请求的方式(即使用HttpUrlConnection类)在工作时是相当低级的—这使您的事情比必须的要复杂一些。我建议使用一个库,它允许您发送请求,而不必担心一些细节,例如


我希望这有帮助

如果有帮助,您的代码(在底部)拼写错误了
resposne
。@customcommander注意到。谢谢你的接受标题修复工作!谢谢感谢您提供有关Http库的指导。我一定去看看。