3

我正尝试使用POST REST调用将文件上载到OneDrive文件夹中。 我的应用程序能够与OneDrive进行通信。我得到的回应是The request entity body isn't a valid JSON object.Onedrive API文件使用Java上传

下面是我的代码,请让我知道代码的错误部分或我的方法。

public static void onedriveFileUpload() { 
     CloseableHttpClient httpClient = HttpClients.createDefault(); 
     HttpPost uploadFile = new HttpPost("https://apis.live.net/v5.0/folder.id"); 

     MultipartEntityBuilder builder = MultipartEntityBuilder.create(); 
     uploadFile.addHeader("Authorization", "Bearer access_token"); 
     builder.addPart("file", new FileBody(new File("Test.txt"), ContentType.APPLICATION_OCTET_STREAM, "Test.txt")); 

     builder.setMode(HttpMultipartMode.BROWSER_COMPATIBLE); 
     Charset chars = Charset.forName("utf-8"); 
     builder.setCharset(chars); 
     uploadFile.setEntity(builder.build()); 
     uploadFile.setHeader("Content-Type", "multipart/form-data"); 
     uploadFile.setHeader("charset", "UTF-8"); 
     uploadFile.setHeader("boundary", "AaB03x"); 
     HttpResponse response = null; 
    try { 
     response = httpClient.execute(uploadFile); 
     HttpEntity responseEntity = response.getEntity(); 
     String json = EntityUtils.toString(responseEntity); 
     System.out.println(json); 
    } catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

    } 

这是我从OneDrive获得的Json响应。

{ 
    "error": { 
     "code": "request_body_invalid", 
     "message": "The request entity body isn't a valid JSON object." 
    } 
} 
+0

像这样的错误最好用Fiddler调试,http://www.telerik.com/fiddler。在不知道请求内容的情况下,只会得到发送请求的错误。 – 2014-09-22 19:14:34

回答

0

如果要使用POST方法,则需要POST到/api.live.net/v5.0/folder.id/files。您的代码在文件夹ID后缺少/files部分。如果您仍然遇到麻烦,请显示实际HTTP请求的样子会有所帮助。

0

您应该发布https://apis.live.net/v5.0/:albumId/files/:fileName[.:format]。而不是MultipartEntity,请尝试使用ByteArrayEntity。示例:

public Photo uploadPhoto(String accessToken, String albumId, String format, byte[] bytes) throws IOException { 
    Photo newPhoto = null; 
    URI uri; 
    try { 
     uri = new URIBuilder().setScheme(DEFAULT_SCHEME) 
           .setHost(API_HOST) 
           .setPath("/" + albumId + "/files/" + 
             UUID.randomUUID().toString() + "." + format) 
           .addParameter("access_token", accessToken) 
           .addParameter("downsize_photo_uploads", "false") 
           .build(); 
    } catch (URISyntaxException e) { 
     e.printStackTrace(); 
     throw new IllegalStateException("Invalid album path"); 
    } 

    CloseableHttpClient httpClient = HttpClients.createDefault(); 
    try { 
     HttpPut httpPut = new HttpPut(uri); 
     ByteArrayEntity imageEntity = new ByteArrayEntity(bytes); 
     httpPut.setEntity(imageEntity); 
     Map<Object, Object> rawResponse = httpClient.execute(httpPut, new SomeCustomResponseHandler()); 
     if (rawResponse != null) { 
      newPhoto = new Photo(); 
      newPhoto.setName((String) rawResponse.get("name")); 
      newPhoto.setId((String) rawResponse.get("id")); 
      // TODO:: Do something else. 
     } 
    } catch (ClientProtocolException e) { 
     e.printStackTrace(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } finally { 
     httpClient.close(); 
    } 

    return newPhoto; 
} 

该代码是OneDrive4J的一个片段。查看https://github.com/nicknux/onedrive4j。今年早些时候,当我试图寻找OneDrive Java客户端时,我建立了它。