Как исправить ошибку BadRequest «Невозможно прочитать полезную нагрузку JSON-запроса» при создании папки OneDrive? - PullRequest
1 голос
/ 25 июня 2019

Я создаю диалог в Google Sheets, который генерирует и загружает отчет в OneDrive.Пользователю может потребоваться создать папку в OneDrive через диалоговое окно.Однако при выполнении запроса API я получаю сообщение об ошибке «BadRequest».

Я попытался выполнить запрос в командной строке Windows с помощью Curl.Я также пытался использовать чистый JS вместо языка Google Script.Я могу выполнять другие действия, такие как поиск в OneDrive и загрузка файлов.

// The GS code

var auth = "Bearer " + acc;

var options = {
    "method": "post",
    "headers": {
        "Authorization": auth,
        "Content-Type": "application/json"
    },
    "payload": {
        "name": "Test Folder",
        "folder": {},
        "@name.conflictBehavior": "rename"
    },
    "muteHttpExceptions": true
};

var reqUrl = "https://graph.microsoft.com/v1.0/me/drive/root/children";
var response = UrlFetchApp.fetch(reqUrl, options);
var json = JSON.parse(response);
Logger.log(json); 



// The JS code

function onAuthSuccess(acc) {
    var pNum = document.getElementById("projectnum").value;
    var pName = document.getElementById("address").value;
    var reqUrl = "https://graph.microsoft.com/v1.0/me/drive/root/children";
    var reqBody = {
        "name": "Test Folder",
        "folder": {},
        "@microsoft.graph.conflictBehavior": "rename"
    };
    var auth = "Bearer " + acc;

    var xhr = new XMLHttpRequest();
    xhr.onreadystatechange = function() {
        console.log(xhr.responseText);
    }
    xhr.open("POST", reqUrl, true);
    xhr.setRequestHeader("Authorization", auth);
    xhr.setRequestHeader("Content-Type", "application/json");
    xhr.send(reqBody);
}



// The successful Curl command

// curl "https://graph.microsoft.com/v1.0/me/drive/root/children" -X POST -H "Content-Type: application/json" -H %acc% -d "{'name':'Test Folder', 'folder':{}, '@microsoft.graph.conflictBehavior':'rename'}"

Команда Curl дает ожидаемый результат, который заключается в создании новой папки с именем «Test Folder» в нашем корневом каталоге OneDrive.

Приведенный выше код GS и JS выдает следующее сообщение об ошибке:

{
    error = {
        code = BadRequest,
        innerError = {
            date = 2019 - 06 - 24 T20: 40: 52,
            request - id = #####################
        },
        message = Unable to read JSON request payload.Please ensure Content - Type header is set and payload is of valid JSON format.
    }
}

1 Ответ

1 голос
/ 25 июня 2019

В вашем коде есть основная проблема: у вас нет правильного JSON (даже если ваш заголовок говорит об этом).

var reqBody = {
    "name": "Test Folder",
    "folder": {},
    "@microsoft.graph.conflictBehavior": "rename"
};

Это обычный объект javascript. Выполнение .toString() на этом просто даст вам "[object Object]". Вам необходимо закодировать его в USVString (в основном, в обычную строку), для документов XHR . Итак, чтобы превратить его во что-то, что обрабатывает метод XHR#send(), сделайте это:

var reqBody = JSON.stringify({
    "name": "Test Folder",
    "folder": {},
    "@microsoft.graph.conflictBehavior": "rename"
});

Результатом является строка:

'{"name":"Test Folder","folder":{},"@microsoft.graph.conflictBehavior":"rename"}'

, что гораздо удобнее:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...