为什么我不能向Microsoft OneNote发送multipart / form-data请求?

时间:2015-06-22 20:15:08

标签: java rest jax-rs multipartform-data onenote

我正在修改软件以将客户端数据导出到Microsoft OneNote而不是本地html文件。我也是一位经验丰富的程序员,所以我一直在尝试自学这个API和这些协议。

我能够成功使用the Apigee interfacehurl.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字符更新了我的代码,但问题仍然存在:

Updated Java Code OneNote Error Code

2 个答案:

答案 0 :(得分:1)

查看Entity.text()

  

创建&#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其余代码看起来不错