我正在尝试使用REST API将文件上传到OneDrive . 下面的代码打开一个到OneDrive主机的套接字,并从OneDrive doc中的示例中提供有效负载,但OneDrive返回400状态,带有"Invalid Verb"消息 .
我知道访问令牌是有效的,因为GET调用有效 . 访问令牌具有以下范围: wl.offline_access
, wl.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的 HttpClient
和 curl
. 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 回答
我讨厌回答我自己的问题,但我发现了一些有用的东西 . 此代码使用Apache的HttpClient将文件上传到OneDrive和PUT .