[英]Why can't I send a multipart/form-data request to Microsoft OneNote?
我正在修改软件以将客户端数据导出到Microsoft OneNote而不是本地html文件。 我也不是一个经验丰富的程序员,所以我一直在尝试自学这个API和这些协议。
我能够成功使用Apigee接口和hurl.it发送多部分POST请求并将页面上传到OneNote笔记本。
在hurl.it上,我包含两个标题:
“授权”,“myAuthCode”
“Content-Type”,“multipart / form-data; boundary = 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));
}
}
当我执行此代码时,我收到以下响应:
“code”:“20110”,“message”:“页面创建请求要求内容为多部分,并带有演示文稿部分。”
从此,我知道我已成功联系OneNote,并成功进行身份验证。
我相信我的错误与我在Java中设置标头的方式有关。 我不确定你是否被允许链接.header方法。 我所知道的另一种方法是将MultiValuedMap传递给.headers方法,尽管我不熟悉界面以及如何实现它。
OneNote开发中心有点无益,只告诉我我已经知道的东西,似乎已经包含在我的代码中。
编辑:
虽然问题仍然存在,但我用CRLF代替单个\\ n字符更新了我的代码:
创建“text / plain”实体。
我没有测试过,但我猜这会覆盖你在header()
方法中设置的Content-Type
。 您可以使用
Entity.entity(entity, MediaType)
创建通用实体,您可以在其中指定媒体类型。
另一件事,我不知道你正在使用什么JAX-RS实现,但任何实现应该有多部分支持,所以你不要手动处理正文的构建。 以下是使用Jersey的示例 。
您应该使用CRLF \\r\\n
而不是\\n
[尤其是在处理ms / windows时]。
它看起来像你缺少一个\\n
之初字符payload
和第2 \\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其余代码看起来不错
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.