1

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

我可以毫无问题地使用 LiveConnect 进行 OAuth 舞蹈,并且正在发布一个简单的多部分示例以证明一切正常,然后再开始添加更多附件等

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

Content-Length: 48

{
  "Message": "Malformed multipart message"
}

问题是,据我所知,这还不是。

我已经逐个字符地检查了该文档的标题,它看起来很好。我还三次检查了本文档中的所有调试建议,但我看不出有什么问题。

  • 我已经编码了 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--
4

2 回答 2

2

我通过Apigee 控制台对此进行了一些调试。如果您将零件名称“534a5a9ca709c”替换为其他名称(我只使用了“NewPart”),则请求成功通过。

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

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

如果您在Apigee 控制台中尝试此操作,请确保更新消息正文和标头中的部分名称,因为它们需要匹配。

- 詹姆斯(@jmslau

于 2014-04-13T14:33:12.317 回答
1

感谢@JamesLau-MSFT,他让我走上了正确的道路。

其实边界是好的。如果在最终边界之后有换行符或一些文本,我可以让它发布上面指定的确切内容

您会注意到 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

我不是多方面专家,但我确实在RFC中对此进行了研究:

最后一个正文部分之后的封装边界是一个显着的分隔符,表示后面不会有其他正文部分。这样的分隔符与前面的分隔符相同,只是在行尾添加了两个连字符:

 --gc0p4Jq0M2Yt08jU534c0p--  

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

更新:

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

于 2014-04-14T21:49:24.910 回答