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)에서 가장 잘 디버깅됩니다. 요청의 내용을 알지 못하면 전송 된 요청의 무엇이 잘못되었는지를 알 수 있습니다. –

답변

0

POST 방법을 사용하려면 /api.live.net/v5.0/folder.id/files으로 POST해야합니다. 코드에서 폴더 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 클라이언트를 찾으려고 할 때 이것을 만들었습니다.