OneDrive REST API 为文件上传提供 400 个无效动词

OneDrive REST API gives 400 Invalid Verb for file upload

我正在尝试使用 REST API 将文件上传到 OneDrive。下面的代码打开一个到 OneDrive 主机的套接字,并向其提供 OneDrive doc 示例中的有效负载,但 OneDrive returns 一个带有 "Invalid Verb" 消息的 400 状态。

我知道访问令牌有效,因为 GET 调用有效。访问令牌具有以下范围:wl.offline_accesswl.skydrive_update.

我已尝试对其他文件夹执行 GET、PUT 和 POST,GET 有效,但 PUT 和 POST 失败。在使用套接字之前,我尝试使用 Jersey 的 WebResource、java 的 HttpUrlConnection、apache 的 HttpClientcurl 进行 PUT 和 POST。 OneDrive 根据 verb/library 配对使用不同的错误消息进行响应。

我已将请求发送到转储有效负载的本地服务器,因此我可以验证套接字代码没有问题。它正在发送来自文档的确切消息,但空格替换为控制字符。

import java.io.PrintWriter;
import java.net.Socket;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class OneDriveUploadTest {

    public static void main(String[] args) throws Exception {
        String accessToken = "...";

        // this works
        // String data = "GET https://apis.live.net/v5.0/me/skydrive/files?access_token="+accessToken+"\r\n\r\n";

        // this fails
        String data = "POST https://apis.live.net/v5.0/me/skydrive/files?access_token="+accessToken+"\r\n\r\n--A300x\r\nContent-Disposition: form-data; name=\"file\"; filename=\"HelloWorld.txt\"\r\n\nContent-Type: application/octet-stream\r\nHello, World!\r\n--A300x--\r\n\r\n";

        // this also fails
        // String data = "PUT https://apis.live.net/v5.0/me/skydrive/files/HelloWorld.txt?access_token="+accessToken+"\r\n\r\nHello, World!\r\n\r\n"; 

        SSLSocketFactory socketFactory = (SSLSocketFactory) SSLSocketFactory.getDefault();
        Socket socket = (SSLSocket) socketFactory.createSocket("apis.live.net", 443);
        PrintWriter sout = new PrintWriter(socket.getOutputStream());
        sout.print(data); 
        sout.flush();
        InputStream sin = socket.getInputStream(); 
        BufferedReader rd = new BufferedReader(new InputStreamReader(sin));
        String line;
        while ((line = rd.readLine()) != null) {
            System.out.println("got: " + line);
        }
        sin.close();
        sout.close();
        socket.close();
    }
}

我不想回答我自己的问题,但我发现了一些有用的东西。此代码使用 Apache 的 HttpClient 通过 PUT 将文件上传到 OneDrive。

import java.io.File;
import org.apache.http.client.HttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.HttpResponse;
import org.apache.http.entity.FileEntity;
import org.apache.http.client.methods.HttpPut;

public class OneDriveHttpClientUpload {
    public static void main(String[] args) throws Exception {
        String accessToken = "...";
        String url = "https://apis.live.net/v5.0/me/skydrive/files/HelloWorld.txt?access_token="+accessToken;
        HttpClient apClient = HttpClients.createDefault();
        HttpPut httpPut = new HttpPut(url);
        FileEntity file = new FileEntity(new File("testfile.txt"));
        httpPut.setEntity(file);
        HttpResponse ret = apClient.execute(httpPut);
    }
}