Как вставить данные в список SharePoint через GraphAPI? - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть список SharePoint, в котором содержится номер ссылки. URL будет выглядеть следующим образом: https://xyz.sharepoint.com/sites/site_name/Lists/List_name/AllItems.aspx

Содержание этого списка исх. Я пытаюсь вставить эти данные в список.

{
"Optimum_x0020_Case_x0020_Reference": "000777"
} 

Это URL, который я отправляю. https://graph.microsoft.com/v1.0/sites/xyz.sharepoint.com:/sites/site_name:/lists/List_names/items

Но я получаю эту ошибку:

error": {
"code": "accessDenied",
"message": "The caller does not have permission to perform the action.",

Как это решить? Используя доступ, я могу создать папку, подпапку и обновить метаданные для другого документа.

1 Ответ

0 голосов
/ 09 сентября 2018

В каком контексте вы это делаете? Это приложение, которое вы используете? Вы вставляете данные в уже существующий элемент списка или новый элемент?

Это код, который я должен был использовать для своего приложения UWP. Я не уверен, поможет ли это вам или нет, но это должно дать вам небольшое руководство, я надеюсь. Создание словаря и определение структуры XML были ключевыми вещами, которые мне пришлось собрать вместе, чтобы заставить мой код работать.

Я объявил свои области в моем App.xaml.cs

    public static string[] scopes = new string[] { "user.ReadWrite", "Sites.ReadWrite.All", "Files.ReadWrite.All" };

У меня есть кнопка отправки, которую я использую на главной странице

    private async void SubmitButton_Click(object sender, RoutedEventArgs e)
    {
       var (authResult, message) = await Authentication.AquireTokenAsync();

        if (authResult != null)
        {
            await SubmitDataWithTokenAsync(submiturl, authResult.AccessToken);
        }
    }

Это вызывает AquireToken, который у меня есть в файле класса:

    public static async Task<(AuthenticationResult authResult, string message)> AquireTokenAsync()
    {
        string message = String.Empty;
        string[] scopes = App.scopes;

        AuthenticationResult authResult = null;
        message = string.Empty;
        //TokenInfoText.Text = string.Empty;

        IEnumerable<IAccount> accounts = await App.PublicClientApp.GetAccountsAsync();
        IAccount firstAccount = accounts.FirstOrDefault();

        try
        {
            authResult = await App.PublicClientApp.AcquireTokenSilentAsync(scopes, firstAccount);
        }
        catch (MsalUiRequiredException ex)
        {
            // A MsalUiRequiredException happened on AcquireTokenSilentAsync. This indicates you need to call AcquireTokenAsync to acquire a token
            System.Diagnostics.Debug.WriteLine($"MsalUiRequiredException: {ex.Message}");

            try
            {
                authResult = await App.PublicClientApp.AcquireTokenAsync(scopes);
            }
            catch (MsalException msalex)
            {
                message = $"Error Acquiring Token:{System.Environment.NewLine}{msalex}";
            }
        }
        catch (Exception ex)
        {
            message = $"Error Acquiring Token Silently:{System.Environment.NewLine}{ex}";
        }
        return (authResult,message);
    }

Я создал другой класс для своего списка SharePointList

открытый класс SharePointListItems { общий класс Lookup { публичная строка SerialNumber {get; задавать; } публичная строка id {get; задавать; } открытая переопределенная строка ToString () { return SerialNumber; } }

public class Value
{
    public Lookup fields { get; set; }
}

    public class Fields
    {
        [JsonProperty("@odata.etag")]
        public string ODataETag { get; set; }

        public string ParameterA { get; set; }
        public string ParameterB { get; set; }
        public string ParameterC { get; set; }
    }

    public class RootObject
    {
        [JsonProperty("@odata.context")]
        public string ODataContext { get; set; }

        [JsonProperty("@odata.etag")]
        public string ODataETag { get; set; }

        [JsonProperty("fields@odata.context")]
        public string FieldsODataContext { get; set; }

        public Fields Fields { get; set; }
    }    
}

Я использовал этот класс для создания словаря для отправки моих данных в SharePoint.

    public async Task<string> SubmitDataWithTokenAsync(string url, string token)
    {
        var httpClient = new HttpClient();
        HttpResponseMessage response;
        try
        {
            var root = new
            {
                fields = new Dictionary<string, string>
                {
                   // The second string are public static strings that I
                   // I declared in my App.xaml.cs because of the way my app
                   // is set up.
                   { "ParameterA", App.ParameterA },
                   { "ParameterB", App.ParameterB },
                   { "ParameterC", App.ParameterC },
                }
            };

            var s = new JsonSerializerSettings { DateFormatHandling = DateFormatHandling.MicrosoftDateFormat };
            var content = JsonConvert.SerializeObject(root, s);
            var request = new HttpRequestMessage(HttpMethod.Post, url);
            //Add the token in Authorization header
            request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Bearer", token);
            request.Content = new StringContent(content, Encoding.UTF8, "application/json");
            response = await httpClient.SendAsync(request);
            var responseString = await response.Content.ReadAsStringAsync();                
            return responseString;
        }
        catch (Exception ex)
        {
            return ex.ToString();
        }
    }

И мой подчиненный определен:

    public static string rooturl = "https://graph.microsoft.com/v1.0/sites/xxxxxx.sharepoint.com,495435b4-60c3-49b7-8f6e-1d262a120ae5,0fad9f67-35a8-4c0b-892e-113084058c0a/";
    string submiturl = rooturl + "lists/18a725ac-83ef-48fb-a5cb-950ca2378fd0/items";

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

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