如何使用OneNote API创建新的NoteBook

时间:2014-08-12 19:23:52

标签: c# post onenote

当我尝试创建新的Notebook时,我收到“错误请求”错误400。下面是我的代码,我认为它是PagesEndPoint Uri,但我尝试了所有组合。我可以使用apigee控制台应用程序,但无法确定如何制作C#Windows应用程序发布消息。

async public Task<StandardResponse> CreateNewNotebook(string newNotebookName)
        {

            Uri PagesEndPoint = new Uri("https://www.onenote.com/api/v1.0/notebooks?notebookName="+newNotebookName.ToString());
            var client = new HttpClient();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            if (IsAuthenticated)
            {
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authClient.Session.AccessToken);
            }

            string date = GetDate();
            string simpleHtml = "<html>"+"<head>"+"<title>A simple page created with an image1 on it</title>" +"<meta name=\"created\" content=\"" + date + "\" />" +
                                "</head>" +"<body>" +"<h1>This is a page with an image on it</h1>" +"</body>" +"</html>";
            HttpResponseMessage response;
            HttpRequestMessage createMessage = new HttpRequestMessage(HttpMethod.Post, PagesEndPoint)
            {
                Content = new StringContent(simpleHtml, System.Text.Encoding.UTF8, "text/html")
            };

            response = await client.SendAsync(createMessage);
            tbResponse.Text = response.ToString();
            return await TranslateResponse(response);


        }

我尝试过这个新代码,但仍然无法正常工作。文档的链接显示了要使用的元素,但没有显示如何使用它们来制作C#方法。

这是我的最新代码。

async public Task<StandardResponse> CreateJsonNotebook(string newNotebookName)
        {

            string postData = "{name: \"NewNotebookName\"}";

            var client = new HttpClient();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            if (IsAuthenticated)
            {
                client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authClient.Session.AccessToken);
            }

           StreamWriter requestWriter;
           var webRequest = System.Net.WebRequest.Create("https://www.onenote.com/api/v1.0/notebooks") as HttpWebRequest;

           HttpResponseMessage response;
           response = await client.SendAsync(postData);
           tbResponse.Text = response.ToString();
           return await TranslateResponse(response);

        }

3 个答案:

答案 0 :(得分:2)

上面粘贴的最新代码有一些不正确之处。 这是我工作的修改版本:

    public async Task<StandardResponse> CreateJsonNotebook(string newNotebookName)
    {
        var client = new HttpClient();
        string postData = "{name: \"" + newNotebookName + "\"}";
        client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
        if (IsAuthenticated)
        {
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer",
                _authClient.Session.AccessToken);
        }

        StreamWriter requestWriter;
        var webRequest = new HttpRequestMessage(HttpMethod.Post, "https://www.onenote.com/api/v1.0/notebooks")
        {

            Content = new StringContent(postData, Encoding.UTF8, "application/json")
        };

        HttpResponseMessage response;
        response = await client.SendAsync(webRequest);
        return await TranslateResponse(response);
    }

请注意:

  • 我没有结合使用HttpClient和HttpWebRequest。
  • 在创建HttpWebRequest.Content时,我将mediaType设置为&#34; application / json&#34;
  • client.SendAsync()也使用了HttpRequestMessage而不是postData字符串。

答案 1 :(得分:1)

你是对的 - 网址不太正确。您实际上无法同时创建页面和笔记本 - 它们需要两个不同的调用。

要创建笔记本,您应发布的网址为:

https://www.onenote.com/api/v1.0/notebooks

使用正文的内容创建笔记本,该内容应为JSON。 (确保在标题中包含CONTENT-TYPE: application/json

身体看起来像:

{
  name: "New Notebook Name"
}

然后,您可以在笔记本中创建一个带有响应ID的部分。获得新部分的ID后,您可以将页面发布到该部分。

可在此处找到更多信息:http://msdn.microsoft.com/en-us/library/office/dn790583(v=office.15).aspx

答案 2 :(得分:0)

您调用API的方式不正确。您不应该在端点中放置notebookName查询参数。相反,您应该使用JSON正文发布到https://www.onenote.com/api/v1.0/notebooks。 JSON正文应该是

{name:“新笔记本名称”}

您可以查看此blog post作为示例。

- 詹姆斯