首页 文章

OneDrive REST API为文件上载提供400 Invalid Verb

提问于
浏览
1

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

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

我've tried GETting, PUTting and POSTing to other folders and the GETs work but PUTs and POSTs fail. Before using the socket I tried PUTs and POSTs using Jersey' s WebResource ,java的 HttpUrlConnection ,apache的 HttpClientcurl . OneDrive根据动词/库配对响应不同的错误消息 .

我已经将请求发送到转储有效负载的本地服务器,因此我可以验证套接字代码没有问题 . 它从doc发送确切的消息,但是用控制字符替换了空格 .

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();
    }
}

1 回答

  • 2

    我讨厌回答我自己的问题,但我发现了一些有用的东西 . 此代码使用Apache的HttpClient将文件上传到OneDrive和PUT .

    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);
        }
    }
    

相关问题