Обновление файла метаданных в sharepoint online через REST API

#node.js #sharepoint

#node.js #sharepoint

Вопрос:

Я загружаю файл в sharepoint и пытаюсь обновить его метаданные, но на последнем шаге я всегда получаю ошибку 400.

Насколько я понимаю, sharepoint обрабатывает только списки и элементы. «Папка» — это список, а метаданные и файлы внутри являются элементами. И «файл» — это список, а его метаданные — элементы.

В документации об обновлении метаданных говорится о том, чтобы сделать запрос POST на:

  • https: // {site_url} / _api / web / списки / GetByTitle (‘{list_title}’) / элементы ({item_id})

Обновление файлов должно выполняться методом PUT (не допускается СЛИЯНИЕ), но обновление метаданных должно выполняться специально методом MERGE. Я пробовал оба, и оба потерпели неудачу.

Это мой текущий запрос на обновление метаданных, но я продолжаю получать сообщение об ошибке 400.

 var data = {        
    "__metadata": {
        "type":type
    },
    "Description":"lorem ipsum"
    };
var headerToken = {
    headers: {
        'Authorization':'Bearer '   token                        
        , 'X-HTTP-Method':'MERGE'
        , 'Accept':'application/json;odata=verbose'
        , 'Content-Type':'application/json;odata=verbose'
        , 'Content-Length':JSON.stringify(data).length
        , 'If-Match': etag
        , 'X-RequestDigest': digest
    }
};
try {        
    var response = await axios.post(          
        'https://{site_url}/_api/web/lists/GetByTitle("' MY_FOLDER '")/items(' id ')'
        , JSON.stringify(data)
        , headerToken
        );
    return response;
}
 

тип, etag и id получаются из ответа на загрузку файла, а дайджест — из запроса к конечной точке contextinfo. MY_FOLDER является тестовой библиотекой и на данный момент является константой.

Ответ №1:

Вам нужно использовать одинарные кавычки в getbytitle.

 "https://{site_url}/_api/web/lists/GetByTitle('" MY_FOLDER "')/items(" id ")"
 

Обновлено:

 <script src="https://ajax.aspnetcdn.com/ajax/jQuery/jquery-1.9.1.min.js" type="text/javascript"></script>
<script>
$(document).ready(function () {
UpdateFolder()
function UpdateFolder(){  
    $.ajax({  
    url: _spPageContextInfo.webAbsoluteUrl   "/_api/web/lists/GetByTitle('Doc')/items(30)",  
    type: "POST",  
    headers: {  
        "accept": "application/json;odata=verbose",  
        "X-RequestDigest": $("#__REQUESTDIGEST").val(),  
        "content-Type": "application/json;odata=verbose",  
        "IF-MATCH": "*",  
        "X-HTTP-Method": "MERGE"  
    },  
    data: "{__metadata:{'type':'SP.Data.DocItem'},test:'test'}",  
    /*where Title is column name and add your desired new data*/  
    success: function(data) {  
        console.log(data);  
    },  
    error: function(error) {  
        alert(JSON.stringify(error));  
    }  
});
}
})
</script>
 

Комментарии:

1. Я пробовал как одинарные, так и двойные кавычки, и я всегда получаю «ошибка 400».

2. Мой тестовый код js для вашей справки. Где вы используете этот свой код? SPFX?

3. Я использовал эту ссылку. Мой код должен использоваться на внешних серверах (без установленного sharepoint). Именно по этой причине я должен запросить contextinfo, чтобы получить значение X-RequestDigest.