繁体   English   中英

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

[英]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字符更新了我的代码:

更新了Java代码OneNote错误代码

看看Entity.text()

创建“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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM