Получить название сайта SharePoint из консольного приложения - PullRequest
0 голосов
/ 09 июня 2018

У меня есть консольное приложение, написанное на C #.Мне нужно получить некоторую информацию с сайта SharePoint.Этот экземпляр SharePoint является частью Office 365 (т.е. SharePoint Online).

Моя проблема в том, что я не могу использовать вспомогательную библиотеку.Мне приходится использовать API на основе REST, поскольку я использую .NET Core.

Для начала я зарегистрировал свое консольное приложение в Azure Active Directory.Это консольное приложение создано в той же Azure Active Directory, частью которой является моя среда Office 365.Я также предоставил делегированное разрешение «Чтение элементов во всех семействах сайтов» для API «Office 365 SharePoint Online» моему консольному приложению.

В моей ситуации у меня есть консольное приложение на сервере.Я настроил тестового пользователя с именем пользователя / паролем в своем клиенте SharePoint.У меня также есть идентификатор клиента для консольного приложения, зарегистрированного в Azure Active Directory, и URL-адрес перенаправления.

В настоящее время у меня есть некоторый код, который выглядит следующим образом:

var accessToken = await GetToken(); // retrieves a token from Active Directory
using(var client = new HttpClient()) {
    client
        .DefaultRequestHeaders
        .Clear();

    client
        .DefaultRequestHeaders
        .Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

    client
        .DefaultRequestHeaders
        .Accept
        .Add(new MediaTypeWithQualityHeaderValue("application/json"));

    var apiUrl = "https://[mySite].sharepoint.com/_api/web";

    // how do I get the title of the site at the apiUrl variable?
}

Iчувствую, что я близко, так как я получаю токен доступа.Я просто не могу понять, как получить название сайта.Как получить заголовок сайта SharePoint из моего кода C #?

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Ресурс SharePoint REST API web включает свойство Title, которое представляет заголовок веб-сайта.

Вызов:

GET http://<site url>/_api/web/title

Возвращает:

<d:Title xmlns:d="http://schemas.microsoft.com/ado/2007/08/dataservices" 
    xmlns:m="http://schemas.microsoft.com/ado/2007/08/dataservices/metadata" 
    xmlns:georss="http://www.georss.org/georss" 
    xmlns:gml="http://www.opengis.net/gml">Site Title Goes Here</d:Title>

или, если вы установили заголовок Accept равным application/json:

{
  "odata.metadata": 
  "https://microsoft.sharepoint.com/sites/msw/_api/$metadata#Edm.String",
  "value": "MSW"
}
0 голосов
/ 12 июня 2018

Конечные точки SharePoint следуют соглашению OData.

Таким образом, вы можете использовать $select параметры запроса, чтобы указать данные, которые вы хотите для данной сети, списка или полей и т. Д.

Такв вашем случае вы можете просто изменить конечную точку, как показано ниже:

var apiUrl = "https://[mySite].sharepoint.com/_api/web?$select=Title";

В случае, если вы хотите получить дополнительные свойства, такие как описание, логотип, Webtemplate и т. д., вы можете добавить его как:

var apiUrl = "https://[mySite].sharepoint.com/_api/web?$select=Title,Description,
SiteLogoUrl,WebTemplate";

Ссылка - Список свойств в SPO - веб-объект

Кроме того, убедитесь, что у вас есть разрешения Have full control of all site collections, проверенные в разрешении Office 365 SharePoint Online, как показано ниже:

enter image description here

Полная версия кода, который я использую:

1) Создать AuthenticationResponse.cs класс:

public class AuthenticationResponse
{
        public string token_type { get; set; }
        public string scope { get; set; }
        public int expires_in { get; set; }
        public int expires_on { get; set; }
        public int not_before { get; set; }
        public string resource { get; set; }
        public string access_token { get; set; }
        public string refresh_token { get; set; }
        public string id_token { get; set; }
}

2) Используйте это в своем коде, как показано ниже:

string userName = "user@tenantName.onmicrosoft.com";
string password = "password";

List<KeyValuePair<string, string>> vals = new List<KeyValuePair<string, string>>();

string tenantName = "tenantName.OnMicrosoft.com";
string authString = "https://login.microsoftonline.com/" + tenantName;
string resource = "https://graph.microsoft.com";

AuthenticationContext authenticationContext = new AuthenticationContext(authString, false);

string clientId = "<client-id>";
string key = "<client-secret>";

vals.Add(new KeyValuePair<string, string>("client_id", clientId));
vals.Add(new KeyValuePair<string, string>("resource", resource));
vals.Add(new KeyValuePair<string, string>("username", userName));
vals.Add(new KeyValuePair<string, string>("password", password));
vals.Add(new KeyValuePair<string, string>("grant_type", "password"));
vals.Add(new KeyValuePair<string, string>("client_secret", key));

string url = string.Format("https://login.windows.net/{0}/oauth2/token", tenantName);

using (HttpClient httpClient = new HttpClient())
{
    httpClient.DefaultRequestHeaders.Add("Cache-Control", "no-cache");
    HttpContent content = new FormUrlEncodedContent(vals);
    HttpResponseMessage hrm = httpClient.PostAsync(url, content).Result;

    AuthenticationResponse authenticationResponse = null;
    if (hrm.IsSuccessStatusCode)
    {
        Stream data = await hrm.Content.ReadAsStreamAsync();
        DataContractJsonSerializer serializer = new
        DataContractJsonSerializer(typeof(AuthenticationResponse));
        authenticationResponse = (AuthenticationResponse)serializer.ReadObject(data);

        var accessToken = authenticationResponse.access_token;

        httpClient
        .DefaultRequestHeaders
        .Clear();

        httpClient
            .DefaultRequestHeaders
            .Authorization = new AuthenticationHeaderValue("Bearer", accessToken);

        httpClient
            .DefaultRequestHeaders
            .Accept
            .Add(new MediaTypeWithQualityHeaderValue("application/json"));

        var apiUrl = "https://[mySite].sharepoint.com/_api/web?$select=Title";      

    }
}
0 голосов
/ 11 июня 2018

Просто понял, что вы используете SharePoint API вместо Graph API, но он все равно может быть полезен для вас!

Это установка JSON, она вам не нужна, но она облегчит десериализацию

public class SharePointSiteObject
{
    [JsonProperty("createdDateTime")]
    public string CreatedDate { get; set; }

    [JsonProperty("description")]
    public string Description { get; set; }

    [JsonProperty("id")]
    public string ID { get; set; }

    [JsonProperty("lastModifiedDateTime")]
    public string LastModified { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("webUrl")]
    public string WebUrl { get; set; }

    [JsonProperty("displayName")]
    public string DisplayName { get; set; }

    [JsonProperty("createdBy")]
    public user CreatedBy { get; set; }

    [JsonProperty("lastModifiedBy")]
    public user ModifiedBy { get; set; }
}

кода для десериализации возвращенного JSON

public static SharePointSiteObject SharePointDeserialize(string jObject)
{
    SharePointSiteObject sharePointSite;

    sharePointSite = JsonConvert.DeserializeObject<SharePointSiteObject>(jObject);

    return sharePointSite;
}

Универсальный методчтобы запросить API-интерфейс Graph, введите конечную точку и токен

public static async Task<string> Run(string url, string token)
{

    var httpClient = new HttpClient();
    HttpResponseMessage response;
    try {
        var request = new HttpRequestMessage(HttpMethod.Get, url);
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
        response = await httpClient.SendAsync(request);
        var content = await response.Content.ReadAsStringAsync();
        return content;
    }
    catch (Exception ex) {
        return ex.ToString();
    }
}

. Используйте приведенный ниже код для вызова API-интерфейса Graph и отображения имени сайта SharePoint

string url = "https://graph.microsoft.com/v1.0/sites/" + sharePointID;
string token = await GetToken();
var request = await Run(url, token);
var result = SharePointDeserialize(request);
Console.WriteLine(result.DisplayName);

Youстоит попробовать MS Graph Explorer, это супер полезно: https://developer.microsoft.com/en-us/graph/graph-explorer

...