OneNote API“格式错误的多部分消息”

时间:2014-04-13 10:06:36

标签: onenote

我正在编写一个库来与新的OneNote API进行交互。

我可以使用LiveConnect进行OAuth跳舞没有问题,并且在我开始添加其他附件之前发布一个简单的多部分示例来证明一切正常

无论我尝试什么,我总能得到:

Content-Length: 48

{
  "Message": "Malformed multipart message"
}

问题是,它并不是我所知道的。

我已经通过字符检查this document的标题来查看请求正文字符,看起来很好。我还对this document中的所有调试建议进行了三重检查,我看不出有什么问题。

  • 我编写了HTML UTF-8
  • 我正在使用一个库来构建主体,并通过视觉解析(见下文)
  • 我发布到https://www.onenote.com/api/v1.0/pages
  • 标题看起来不错,边界,内容类型等。

原始请求如下,是否有一些明显我错过的东西?

POST /api/v1.0/pages HTTP/1.1
Host: www.onenote.com
User-Agent: {myLibrary}
Authorization: Bearer {mytoken}
Content-Length: 416
Content-Type: multipart/form-data; boundary=534a5a9ca709c

--534a5a9ca709c
Content-Type: text/html
Content-Disposition: form-data; name="Presentation"

<!DOCTYPE html>
        <html>
          <head>
            <title>onenote test page</title>
            <meta name="created" content="2014-04-13T10:36:28+01:00"/>
          </head>
          <body>
            <p>Hello OneNote World</p>
          </body>
        </html>
--534a5a9ca709c--

2 个答案:

答案 0 :(得分:2)

我通过Apigee console调试了一下。如果您用其他东西替换您的零件名称“534a5a9ca709c”(我只使用“NewPart”),请求将成功完成。

您应该能够使用“534a5a9ca709c”作为部件名称,因此这似乎是我们最终的错误。我们将调查它为什么会发生,但与此同时,您可以使用解决方法。

更新:这与零件名称无关。正如Darren指出的那样,你需要确保在结束部分名称后面有一个新行(例如“--534a5a9ca709c - ”)。

如果您在Apigee console中尝试此操作,请确保更新邮件正文和标题中的部分名称,因为它们需要匹配。

- 詹姆斯(@jmslau

答案 1 :(得分:1)

感谢@ JamesLau-MSFT让我走上正轨。

实际上边界很好。玩Apigee我可以让它发布上面指定的确切内容如果有最后一个边界后的换行符或一些文字

您会注意到APIgee中的默认OneNote示例页面在结束边界后面有一个点

这有效:

--534a5a9ca709c
Content-Type: text/html
Content-Disposition: form-data; name="Presentation"

<!DOCTYPE html>
        <html>
          <head>
            <title>onenote test page</title>
            <meta name="created" content="2014-04-13T10:36:28+01:00"/>
          </head>
          <body>
            <p>Hello OneNote World</p>
          </body>
        </html>
--534a5a9ca709c--
Blah Blah

我不是多部分专家,但我确实在the RFC

中进行了深入研究
  

最后一个身体部位后面的封装边界是a   区分分隔符,表示没有其他正文部分   跟随。这样的分隔符与之前的分隔符相同   在行尾添加两个连字符:

 --gc0p4Jq0M2Yt08jU534c0p--  
     

在第一个封装边界之前,似乎还有额外信息的空间   在最后的边界之后。通常应留下这些区域   空白,实现应该忽略之前出现的任何内容   第一个边界或最后一个边界。

更新:

最终边界之后的换行要求似乎已被删除。