[英]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字符更新了我的代碼:
創建“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.