«Объект допускает только запись с заголовком JSON Content-Type» Java OneDrive Jersey - PullRequest
0 голосов
/ 15 февраля 2019

Я пытаюсь загрузить файл с помощью API из OneDrive (https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/driveitem_post_content?view=odsp-graph-online). Я использую Java и Jersey для этого, но я не смог этого сделать. Я получаю тот же ответ от API (Я пытался решить эту проблему около недели.) Это ошибка:

{
  "error": {
  "code": "BadRequest",
  "message": "Entity only allows writes with a JSON Content-Type header.",
  "innerError": {
      "request-id": "3c0ea4e0-cbcc-4f11-9ca3-fc3fbfdd50bc",
    "date": "2019-02-14T21:11:41"
    }
  }
}

Позвольте мне поделиться своим кодом:

 String metadataJson
    = "{"
    + "\"name\":\""+name+"\","
    + "\"file\":{},"
    + "\"@microsoft.graph.sourceUrl\":\"cid:content\","
    + "\"@microsoft.graph.conflictBehavior\":\"rename\""
    + "}";

FormDataContentDisposition fdcdMetadata =  FormDataContentDisposition.name("metadata").build();
FormDataBodyPart metadataPart = new FormDataBodyPart(fdcdMetadata, metadataJson, buildChildMultipart("application", "json", "metadata"));

    File tempFile = new File(this.temporaryFolderUri, tempFileName);
    FormDataContentDisposition fdcdContent = FormDataContentDisposition.name("content").build();
    FormDataBodyPart contentPart = new FormDataBodyPart(fdcdContent, tempFile, buildChildMultipart("plain", "text", "content"));
    MultiPart nestedMultipart = new MultiPart(buildParentMultipart())
            .bodyPart(metadataPart)
            .bodyPart(contentPart);

    return this.service.post(target, Entity.entity(nestedMultipart, nestedMultipart.getMediaType()));

..

public MediaType buildParentMultipart() {
    final Map<String, String> parameters = new HashMap<String, String>();
    parameters.put("boundary", "A100x");
    MediaType mediaType = new MediaType("multipart", "form-data", parameters);
    mediaType.withCharset("UTF-8");
    return mediaType;
}


public MediaType buildChildMultipart(String type, String  subType, String name) {
    final Map<String, String> parameters = new HashMap<String, String>();
    parameters.put("Content-ID", name);
    MediaType mediaType = new MediaType(type, subType, parameters);
    mediaType.withCharset("UTF-8");
    return mediaType;
}

Теперь код для отправки запроса на публикацию:

public JsonObject post(WebTarget target, Entity entity) throws InterruptedException, ExecutionException {
    return target.request(MediaType.APPLICATION_JSON).header(AUTHORIZATION_HEADER, getAccessToken())
            .header("Content-type", MediaType.APPLICATION_JSON)
            .header("accept", MediaType.APPLICATION_JSON)
            .buildPost(entity)
            .submit(JsonObject.class).get();
}

Я искал какое-либо решение на многих форумах, но мне не повезло. Я видел ту же проблему в проекте сNode.js, C # и Javascript, но не в Java-проектах (No OneDrive SDK для Java). Я проверил заголовки, типы контента, границы, но они вроде бы в порядке. Проблема, похоже, связана с частью метаданных, но яустановка типа контента, который просит MS. Не могли бы вы помочь мне, ребята? Заранее спасибо.

...