通过Microsoft Graph请求时,列表项为空

欧文

我正在尝试通过Microsoft Graph从共享点列表中获取项目列表。这是我用来获取应用程序令牌的方法:

    public async Task<string> GetAppToken(string tenantId, string clientId, string clientSecret)
    {
        var host = "https://login.microsoftonline.com";
        var tokenUri = $"/{tenantId}/oauth2/v2.0/token";
        var contentType = "application/x-www-form-urlencoded";

        var requestedResource = "https%3A%2F%2Fgraph.microsoft.com%2F.default";//&resource=https%3A%2F%2Fgraph.microsoft.com%2F.default
        var request = $"grant_type=client_credentials&client_id={clientId}&client_secret={clientSecret}&scope={requestedResource}";
        var resultContent = "fail";
        using (var client = new HttpClient())
        {
            client.BaseAddress = new Uri(host);
            var content = new StringContent(request, Encoding.UTF8, contentType);

            var result = await client.PostAsync(tokenUri, content);
            resultContent = await result.Content.ReadAsStringAsync();

        }
        var json = JsonConvert.DeserializeObject<dynamic>(resultContent);
        return json.access_token;
    }

返回的访问令牌包含以下角色:

"Mail.ReadWrite",
"Device.ReadWrite.All",
"User.ReadWrite.All",
"Domain.ReadWrite.All",
"Calendars.Read",
"Group.Read.All",
"Directory.ReadWrite.All",
"MailboxSettings.Read",
"Contacts.ReadWrite",
"Group.ReadWrite.All",
"Notes.Read.All",
"User.Invite.All",
"Files.ReadWrite.All",
"Directory.Read.All",
"User.Read.All",
"Files.Read.All",
"Mail.Read",
"Calendars.ReadWrite",
"Mail.Send",
"MailboxSettings.ReadWrite",
"Contacts.Read",
"IdentityRiskEvent.Read.All",
"Member.Read.Hidden",
"Reports.Read.All",
"Notes.ReadWrite.All"

这是我用来发出请求的代码:

token = await GetAppToken();
var client = new HttpClient();
var queryString = new NameValueCollection();
client.DefaultRequestHeaders.Authorization
    = new AuthenticationHeaderValue("Bearer", token);

var uri = $"https://graph.microsoft.com/beta";
var path = $"/sites/{siteId}/lists/{listId}/items";

var responseString = string.Empty;
try
{

    var response = await client.GetAsync($"{uri}{path}");
    if (response.Content != null)
    {
        responseString = await response.Content.ReadAsStringAsync();
        Console.WriteLine(responseString);
    }

}
catch (Exception ex)
{
    Console.Write(ex.ToString());
}

此网址可产生响应:

> var path =
> "/sites/[sitecol-guid],[site-guid]/lists/[list-guid]/items";  

但是,即使列表中有项目,集合也为空。这是实际的json结果:

{
    "@odata.context":"graph.microsoft.com/beta/$metadata#sites(‌​'host, site-id')/lists('list-id')/items",
    "value":[]
} 

我也为列表请求尝试了这种格式:

var path = "https://graph.microsoft.com/beta/sharepoint:/{list-path}"  

这产生了一个详细的列表信息的有效json响应,但是当我在/ items段中添加时,出现了此错误:

“找不到段'items'的资源。”,

我想念什么?

dvdsmpsn

这是我花了一段时间才从文档中弄清楚的事情。

首先,在您将其用于Microsoft Graph Explorer之前,不要以编程方式进行任何操作-这只是浪费时间。

其次,该Beta版本尚未为您的生产系统准备就绪,因此,尽管它运行良好,但不要依赖它,而应使用REST API v1.0。

如果您知道站点和列表的ID,则所有URL都将以下列之一开头:

https://graph.microsoft.com/v1.0/sites/{siteId}/lists/{listId}/
https://graph.microsoft.com/beta/sites/{siteId}/lists/{listId}/

注意:在下面的示例中,我给出了通用URL,然后给出了一个对我有用的真实世界-这样您就可以看到格式。

如果您不知道listId,可以说我们正在查看根站点中的列表,我们可以通过在Microsoft Graph Explorer中使用此URL并单击Run Query来获取它们

https://graph.microsoft.com/v1.0/sites/{siteId}/lists
https://graph.microsoft.com/v1.0/sites/root/lists

如果要获取列表中的所有列,请将此URL粘贴到Microsoft Graph Explorer中,然后单击“运行查询”

https://graph.microsoft.com/v1.0/sites/{siteId}/lists/{listId}/columns
https://graph.microsoft.com/v1.0/sites/root/lists/ff34268a-d9ff-49c0-99a9-75c6b2eee62e/columns

返回类似于以下内容:

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('root')/lists('ff34268a-d9ff-49c0-99a9-75c6b2eee62e')/columns",
    "value": [
        {
            "columnGroup": "Custom Columns",
            "description": "",
            "displayName": "Title",
            "enforceUniqueValues": false,
            "hidden": false,
            "id": "fa564e0f-0c70-4ab9-b863-0177e6ddd247",
            "indexed": false,
            "name": "Title",
            "readOnly": false,
            "required": true,
            "text": {
                "allowMultipleLines": false,
                "appendChangesToExistingText": false,
                "linesForEditing": 0,
                "maxLength": 255
            }
        },
        ...
    ]
}   

要获取列表中内容的价值,请使用以下代码:

https://graph.microsoft.com/v1.0/sites/{siteId}/lists/{listId}/items?expand=fields
https://graph.microsoft.com/v1.0/sites/root/lists/ff34268a-d9ff-49c0-99a9-75c6b2eee62e/items?expand=fields

请注意expand=fields查询实际上将列表中的项目的值相加

返回类似于以下内容:

{
    "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#sites('root')/lists('ff34268a-d9ff-49c0-99a9-75c6b2eee62e')/items",
    "value": [
        {
            "@odata.etag": "\"6a84a626-dae9-40eb-9c6d-899c6a05ffa8,3\"",
            "createdDateTime": "2017-01-03T11:11:42Z",
            "eTag": "\"6a84a626-dae9-40eb-9c6d-899c6a05ffa8,3\"",
            "id": "1",
            "lastModifiedDateTime": "2017-01-10T18:24:58Z",
            "webUrl": "https://myexample.sharepoint.com/Lists/Some%20Contacts/1_.000",
            "createdBy": {
                "user": {
                    ...
                }
            },
            "lastModifiedBy": {
                "user": {
                    ...
                }
            },
            "parentReference": {},
            "contentType": {
                "id": "0x010062202D579C40994CA18FDBA6760B9545"
            },
            "[email protected]": "https://graph.microsoft.com/v1.0/$metadata#sites('root')/lists('ff34268a-d9ff-49c0-99a9-75c6b2eee62e')/items('1')/fields/$entity",
            "fields": {
                "@odata.etag": "\"6a84a626-dae9-40eb-9c6d-899c6a05ffa8,3\"",
                "Title": "Dr",
                "First_x0020_Name": "David",
                "Surname": "Simpson",
                "Location": "Nottingham",
                "First_x0020_Created": "2017-01-03T08:00:00Z",
                "[email protected]": "#Single",
                "Age": 25,
                "id": "1",
                "ContentType": "Item",
                "Modified": "2017-01-10T18:24:58Z",
                "Created": "2017-01-03T11:11:42Z",
                "AuthorLookupId": "11",
                "EditorLookupId": "11",
                "_UIVersionString": "1.0",
                "Attachments": false,
                "Edit": "",
                "LinkTitleNoMenu": "Dr",
                "LinkTitle": "Dr",
                "ItemChildCount": "0",
                "FolderChildCount": "0",
                "_ComplianceFlags": "",
                "_ComplianceTag": "",
                "_ComplianceTagWrittenTime": "",
                "_ComplianceTagUserId": ""
            }
        },
        ...
    ]
}   

尽管我使用的是图表的v1.0,但beta的工作原理相同。

在我的实际应用中,我将其offline_access Sites.ReadWrite.All用作OAuth舞蹈的范围。前者允许令牌刷新。后者用于访问Microsoft Graph中的SharePoint Online。

您的授权URL应该如下所示:

https://login.microsoftonline.com/common/oauth2/v2.0/authorize
    ?client_id=XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXX
    &response_type=code
    &redirect_uri=https%3A%2F%example.ngrok.io%2Foauth2%2Fcallback
    &response_mode=query
    &scope=offline_access+openid+Sites.ReadWrite.All
    &prompt=consent

旁白:确保您使用的是Microsoft Graph API(位于https://graph.microsoft.com/)而不是Azure AD Graph API(位于https://graph.windows.net/)。如果您在OAuth舞蹈中放错了示波器,将会发生不好的事情

使用Microsoft Graph API的好处之一是,您不必事先在Azure门户中添加任何权限,因为您只需将权限添加到OAuth范围并重新进行身份验证即可。这要容易得多。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

从Microsoft Graph API请求列表项时接收空数组

如何通过Microsoft Graph中的Created筛选SharePoint列表项?

通过使用HttpClient向Microsoft Graph请求用户列表时出现未经授权的问题

通过 microsoft graph 来宾用户列表

通过 Microsoft GRAPH 的 OneDrive 通知

Microsoft Graph SDK和SharePoint列表项

通过Microsoft Graph查询组邮箱的范围

通过Microsoft graph api检索用户的图像

通过Microsoft Graph观察Outlook事件

通过 Microsoft Graph API 创建用户

通过 AD Group 的 Microsoft Graph AppRoleAssignments

通过Microsoft Graph的风险登录报告

无法通过 Microsoft Graph 获取收到的消息

通过 Microsoft 图形 API 请求使用 $filter

通过Microsoft Graph API访问Microsoft Teams频道消息时出现错误:Proxy_InternalServerError

如何使用Microsoft Graph API创建SharePoint列表项?

使用Microsoft Graph API更新SharePoint列表项

通过HTML表单发出POST请求时,请求正文为空

Microsoft Graph - Memberof 字段为空

如何同意通过 Microsoft Graph Webhook API 订阅?

Microsoft Graph:如何通过 Web 应用从组织用户获取数据?

如何通过 Microsoft Graph API 添加内嵌图像?

通过Microsoft Graph从Azure AD获取组中的用户

通过Microsoft Graph检查目录邀请的兑换状态

通过 Microsoft Graph 读取 Office 文档的自定义设置

如何通过Microsoft Graph API检索itemAttachment的内容

通过Microsoft Graph访问不包含SCP(角色)声明的令牌

通过 Microsoft Graph API 在 Excel 中搜索行

Microsoft Graph API-通过internetmessageid查找消息