簡體   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