我正在使用Microsoft graph API从一个驱动器文件夹(即:未处理)中读取文件,处理后,将其移至另一个文件夹(即:已处理)。 在此过程中,我需要在一个请求中移动所有已处理的文件。
当前,我正在单个请求中移动一个文件,并且工作正常。
这是我正在使用的示例代码:
public async Task<List<DriveItem>> MoveItemToFolder(string itempath, string destinationpath)
{
List<DriveItem> items = new List<DriveItem>();
string sourceId, destinationId;
if (!string.IsNullOrEmpty(itempath) && !string.IsNullOrEmpty(destinationpath))
{
var sResult = this.graphClient
.Drive
.Root
.ItemWithPath("/" + itempath)
.Request()
.GetAsync()
.Result;
sourceId = sResult.Id;
var dResult = this.graphClient
.Drive
.Root
.ItemWithPath("/" + destinationpath)
.Request()
.GetAsync()
.Result;
destinationId = dResult.Id;
DriveItem fileOrFolder = await graphClient
.Me
.Drive
.Items[sourceId]
.Request()
.UpdateAsync(new DriveItem
{
// The following example moves an item by
// updating the item's ParentReference.Id property.
ParentReference = new ItemReference
{
Id = destinationId
}
});
if (fileOrFolder != null)
{
// Get file or folder properties.
items.Add(new DriveItem
{
Name = fileOrFolder.Name,
Id = fileOrFolder.Id,
});
}
return items;
}
else
return null;
}
我想向其传递文件和目标列表,这应在单个请求中将所有文件移至目标
答案 0 :(得分:0)
您可以使用JSON batching在一个HTTP调用中组合多达20个请求:
JSON批处理允许您通过将多个请求组合到单个JSON对象中来优化应用程序。
我知道他们正在努力获取add batching support to the SDK,但是由于我不确定它是否可用,因此我不愿提供代码示例(我可能会错过一些内容)。通常,调用批处理端点非常简单:
POST https://graph.microsoft.com/v1.0/$batch
Accept: application/json
Content-Type: application/json
{
"requests": [
{
"id": "1",
"method": "PATCH",
"url": "/me/drive/items/{sourceId-1}",
"body": {
"parentReference": {
"id": "{destinationId}"
}
}
},
{
"id": "2",
"method": "PATCH",
"url": "/me/drive/items/{sourceId-2}",
"body": {
"parentReference": {
"id": "{destinationId}"
}
}
},
{
"id": "3",
"method": "PATCH",
"url": "/me/drive/items/{sourceId-3}",
"body": {
"parentReference": {
"id": "{destinationId}"
}
}
}
]
}
答案 1 :(得分:0)
以下是您可以使用的图形API表单批处理json:
POST https://graph.microsoft.com/v1.0/$batch
Accept: application/json
Content-Type: application/json
不同请求的json示例如下:
{
"requests": [
{
"id": "1",
"method": "GET",
"url": "/me/drive/root:/{file}:/content"
},
{
"id": "2",
"method": "GET",
"url": "/me/planner/tasks"
},
{
"id": "3",
"method": "GET",
"url": "/groups/{id}/events"
},
{
"id": "4",
"url": "/me",
"method": "PATCH",
"body": {
"city" : "Redmond"
},
"headers": {
"Content-Type": "application/json"
}
}
]
}
对批处理请求的响应可能以不同的顺序出现。 id属性可用于关联各个请求和响应。 这是上述请求的示例响应:
{
"responses": [
{
"id": "1",
"status": 302,
"headers": {
"location": "https://b0mpua-by3301.files.1drv.com/y23vmagahszhxzlcvhasdhasghasodfi"
}
},
{
"id": "3",
"status": 401,
"body": {
"error": {
"code": "Forbidden",
"message": "..."
}
}
},
{
"id": "2",
"status": 200,
"body": {
"@odata.context": "https://graph.microsoft.com/v1.0/$metadata#Collection(microsoft.graph.plannerTask)",
"value": []
}
},
{
"id": "4",
"status": 204,
"body": null
}
]
}
在C#中,您可以简单地使用httpclient并发布json请求。
请求格式
批处理请求始终使用POST发送到/ $ batch端点。
JSON批处理请求主体由具有一个必需属性的一个JSON对象组成:请求。 requests属性是单个请求的数组。对于每个单独的请求,都需要id,method和url属性。
id属性主要用作将单个响应与请求相关联的相关值。这样,服务器就可以以最有效的顺序处理批处理中的请求。
方法和url属性与在给定HTTP请求开始时所看到的完全一样。该方法是HTTP方法,URL是通常将单个请求发送到的资源URL。
单个请求还可以选择包含headers属性和body属性。这两个属性通常都是JSON对象,如前面的示例所示。在某些情况下,主体可能是base64 URL编码的值,而不是JSON对象-例如,当主体是图像时。请求中包含正文时,标头对象必须包含Content-Type的值。
或者,我建议您在这种情况下使用云事件驱动的编程。您可以执行以下操作:
1)创建用于存储事件或命令的队列
2)从控制台应用程序推送命令。
3)从将异步的webjob或Azure函数进行处理。
希望有帮助。