我正在修改软件以将客户端数据导出到Microsoft OneNote而不是本地html文件。我也不是一位经验丰富的程序员,所以我一直在尝试自学这个API和这些协议。
我能够成功使用the Apigee interface和hurl.it发送多部分POST请求并将页面上传到OneNote笔记本。
在hurl.it上,我包含两个标题:
"授权"," myAuthCode"
" Content-Type"," multipart / form-data;边界= NEWPART"
虽然这些接口工作正常,但我无法在我的Java项目中复制该过程。
这是我的测试代码:
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.MediaType;
public class Main {
public static void main(String[] args) {
String tokenString = "LONG_TOKEN_STRING"
Client client = ClientBuilder.newClient();
Entity<String> payload = Entity.text("--NewPart\n" +
"Content-Disposition: form-data; name=\"Presentation\"\n" +
"Content-Type: application/xhtml+xml\n" +
"<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n" +
"<html xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"en-us\">\n" +
" <head>\n" +
... //the rest of the POST request body is in here
...
"</body></html>\n" +
"--NewPart--\n" +
".\n");
Response response = client.target("https://www.onenote.com/api/v1.0/pages")
.request(MediaType.TEXT_PLAIN_TYPE)
.header("Authorization", "Bearer " + tokenString)
.header("Content-Type", "multipart/form-data; boundary=NewPart")
.post(payload);
System.out.println("status: " + response.getStatus());
System.out.println("headers: " + response.getHeaders());
System.out.println("body: \n" + response.readEntity(String.class));
}
}
当我执行此代码时,收到以下响应:
&#34;代码&#34;:&#34; 20110&#34;,&#34;消息&#34;:&#34;页面创建请求要求内容为多部分,并带有演示文稿部分。& #34;
据此,我知道我已成功联系OneNote并成功进行身份验证。
我认为我的错误与我在Java中设置标头的方式有关。我不确定你是否允许链接.header方法。我唯一知道的另一种方法是将MultiValuedMap传递给.headers方法,虽然我不熟悉界面以及如何实现它。
OneNote开发中心有点无益,只告诉我我已经知道并且似乎包含在我的代码中。
编辑:
我已使用 CRLF 代替单个\ n字符更新了我的代码,但问题仍然存在:
答案 0 :(得分:1)
创建&#34; text / plain&#34;实体。
我还没有通过测试,但我猜这会覆盖您在Content-Type
方法中设置的header()
。你可以使用
Entity.entity(entity, MediaType)
创建一个通用实体,您可以在其中指定媒体类型。
另一件事,我不知道您正在使用的JAX-RS实现,但任何实现都应该具有多部分支持,因此您不必手动处理正文的构建。 Here is an example using Jersey
答案 1 :(得分:0)
您应该使用 CRLF \r\n
而不是\n
[尤其是在处理ms / windows时]。
您似乎在\n
的开头错过了payload
个字符,并且在\n
之后错过了第二 \n
"Content-Type: application/xhtml+xml\n"
来源:
http://www.w3.org/Protocols/rfc1341/7_2_Multipart.html
https://www.ietf.org/rfc/rfc2046.txt
PS其余代码看起来不错