0
votes

I upload a file to sharepoint and trying to update its metadata, but I always get error 400 in last step.

As far as I understand, sharepoint only handles lists and items. A "folder" is a list and both metadata and files inside are items. And a "file" is a list and its metadata are items.

Documentation about updating metadata say about to make a POST request to:

  • https: // {site_url} / _api / web / lists / GetByTitle ('{list_title}') / items ({item_id})

Updating files must be done by PUT method (not MERGE allowed), but updating metadata must be done specifically by MERGE method. I have tried both, and both failed.

This is my current updating metadata request, but I'm continuing getting an error 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;
}

type, etag and id are get from uploading file response and digest is get from a request to contextinfo endpoint. MY_FOLDER is a test library and at this moment is a constant.

1

1 Answers

0
votes

You need to use single quotes in getbytitle.

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

Updated:

<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>