有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java OneDrive REST API为文件上载提供了400个无效谓词

我正在尝试使用RESTAPI将文件上载到OneDrive。下面的代码打开OneDrive主机的socket,并向其提供来自OneDrive doc中示例的有效负载,但OneDrive返回400状态并显示“Invalid Verb”消息

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

我尝试过获取、放置和发布到其他文件夹,但获取工作失败。在使用socket之前,我尝试使用Jersey的WebResource、java的HttpUrlConnection、apache的HttpClientcurl进行put和post。OneDrive根据谓词/库配对以不同的错误消息进行响应

我已经向本地服务器发送了请求,该服务器转储了负载,因此我可以验证socket代码是否没有问题。它从文档中发送确切的消息,但用控制字符替换空白

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) 个答案

  1. # 1 楼答案

    我不想回答我自己的问题,但我发现了一些有效的方法。这段代码使用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);
        }
    }