3

Я пытаюсь загрузить файл в папку OneDrive с помощью вызова POST REST. Мое приложение может общаться с OneDrive. Ответ, который я получаю: The request entity body isn't a valid JSON object.Загрузка файла API Onedrive с использованием 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(); 
    } 

    } 

Вот ответ Json, который я получаю от OneDrive.

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

Ошибки, подобные этому, лучше всего отлаживаются с помощью Fiddler, http://www.telerik.com/fiddler. Не зная содержимого запроса, он будет получать информацию о том, что не так с запросом, как отправлено. –

ответ

0

Если вы хотите использовать метод POST, вам нужно POST для /api.live.net/v5.0/folder.id/files. В вашем коде отсутствует номер /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 Client.

Смежные вопросы