0

我在尝试创建新笔记本时收到“错误请求”错误 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);

        }
4

3 回答 3

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 设置为“application/json”
  • client.SendAsync() 也使用了 HttpRequestMessage 而不是 postData 字符串。
于 2014-08-13T17:41:54.750 回答
1

你是对的 - URL 不太正确。你实际上不能同时创建一个页面和一个笔记本——它们需要两个不同的调用。

要创建笔记本,您应该发布到的 URL 是:

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

于 2014-08-12T21:41:27.903 回答
0

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

{ name: "新笔记本名称" }

您可以查看此博客文章作为示例。

- 詹姆士

于 2014-08-12T21:43:26.630 回答