SharePoint Rest Api - 403 при попытке обновить элемент списка - PullRequest
0 голосов
/ 19 февраля 2019

Из библиотеки C # мне нужно использовать SP rest Api, чтобы загрузить документ в библиотеку документов, а затем установить его свойства.

У меня почти все работает, выполнив следующую последовательность вызовов:

  1. Публикация в / contextinfo для получения FormDigestValue
  2. Публикация бинарного файла в / Files / Add, включая дайджест в свойстве заголовка X-RequestDigest
  3. Get / ListItemAllFields дайджеств свойстве заголовка X-RequestDigest

Следующим вызовом является сообщение в _api / web / lists / GetByTitle ('имя библиотеки') / Items (157)

Тот же дайджестзначение включено в свойство заголовка X-RequestDigest, как показано ниже:

POST 

https://xxx.uk/_api/web/lists/GetByTitle('AssetMgmtEfilesDemo')/Items(157) HTTP/1.1
Accept: application/json, application/xml; odata=verbose
X-HTTP-Method: MERGE
IF-MATCH: *
X-RequestDigest: 0x01426A9818F7145E12BC2E99246C7E00AC1A3905D27204C783107FDDE806D2629171FAD8DCC61008E109DD9948BEB4208DC62107B2336B1228ABA143A2D5B3C6,19 Feb 2019 15:20:44 -0000
Content-Type: application/json; charset=utf-8
Host: xxx.uk
Content-Length: 359
Expect: 100-continue

{  
   __metadata":{
                    "type":"SP.Data.AssetMgmtEfilesDemoItem"
   },
   "UPRN":"U1",
   "KeystoneDocType":"Document"
}

Моя проблема в том, что для этого запроса я получаю ответ "403 запрещено".

Может кто-нибудьвидите, где я ошибся?

Ответы [ 2 ]

0 голосов
/ 20 февраля 2019

Пример кода для вашей ссылки, вызов API Rest в коде C #, ссылка System.Web.Extensions dll:

using System.Net;
using System.IO;
using System.Web.Script.Serialization;
static void Main(string[] args)
        {
            UpdateListItem();
        }
        public static string GetFormDigest()
        {
            string formDigest = null;

            string resourceUrl = "http://sp/sites/dev/_api/contextinfo";
            HttpWebRequest wreq = HttpWebRequest.Create(resourceUrl) as HttpWebRequest;
            wreq.UseDefaultCredentials = true;
            wreq.Method = "POST";
            wreq.Accept = "application/json;odata=verbose";
            wreq.ContentLength = 0;
            wreq.ContentType = "application/json";
            string result;
            WebResponse wresp = wreq.GetResponse();

            using (StreamReader sr = new StreamReader(wresp.GetResponseStream()))
            {
                result = sr.ReadToEnd();
            }

            var jss = new JavaScriptSerializer();
            var val = jss.Deserialize<Dictionary<string, object>>(result);
            var d = val["d"] as Dictionary<string, object>;
            var wi = d["GetContextWebInformation"] as Dictionary<string, object>;
            formDigest = wi["FormDigestValue"].ToString();

            return formDigest;

        }

        public static void UpdateListItem()
        {
            string result = string.Empty;
            Uri uri = new Uri("http://sp/sites/dev/_api/web/lists/getbytitle('AssetMgmtEfilesDemo')/items(1)");
            HttpWebRequest wreq = (HttpWebRequest)WebRequest.Create(uri);
            wreq.Credentials = CredentialCache.DefaultNetworkCredentials;

            wreq.Method = "POST";
            wreq.Accept = "application/json; odata=verbose";
            wreq.ContentType = "application/json; odata=verbose";
            wreq.Headers.Add("X-HTTP-Method", "MERGE");
            wreq.Headers.Add("IF-MATCH", "*");
            wreq.Headers.Add("X-RequestDigest", GetFormDigest());

            string stringData = "{'__metadata': { 'type': 'SP.Data.AssetMgmtEfilesDemoItem' }, 'Title': 'UpdatedViaRest','UPRN':'U1','KeystoneDocType':'Image'}";
            wreq.ContentLength = stringData.Length;
            StreamWriter writer = new StreamWriter(wreq.GetRequestStream());
            writer.Write(stringData);
            writer.Flush();

            WebResponse wresp = wreq.GetResponse();
            using (StreamReader sr = new StreamReader(wresp.GetResponseStream()))
            {
                result = sr.ReadToEnd();
            }


        }

enter image description here

0 голосов
/ 20 февраля 2019

Пытались ли вы получить новое новое значение дайджеста формы перед тем, как сделать звонок?Значение дайджеста формы истекает через некоторое время (по умолчанию 30 минут).

Вы также можете проверить свое разрешение в конкретном списке.

...