繁体   English   中英

如何使用 Microsoft Graph API 创建一个没有错误的文件夹?

[英]How to create a folder without an error using Microsoft Graph API?

我正在尝试使用 CakePHP 在我团队的 Sharepoint 文件夹中创建一个文件夹,但它显示错误。 我尝试了几种发布和调用 API 的方法,但一切都不起作用。 我的 API 是

https://graph.microsoft.com/v1.0/drives/{drive-id}/root:/{folder-name}:/children

我在下面构建了这个 function。

private function createNewFolder($folder_name)
{
    try {
        $http = new Client();
        $accessToken = $this->getRequest()->getSession()->read('accessToken');
        
        $data = [
            "name" => $folder_name,
            "folder" => "{ }",
            "@microsoft.graph.conflictBehavior" => "rename"
        ];
        
        $url = "https://graph.microsoft.com/v1.0/drives/{drive-id}/root:/{folder-name}:/children";
        
        $headers = [
            'headers' => ['Authorization' => 'Bearer '. $accessToken, 'Content-Type' => 'application/json']
        ];

        return $http->post($url, json_encode($data), $headers)->getJson();
    } catch
    (\Exception $e) {
        return $e->getMessage();
    }
}

它说一个错误,

“有效负载中的属性文件夹的值与架构不匹配。”

虽然它使用 Postman 工作,但它在网站上不起作用。

我已经在 Active Directory 中允许了包括Files.ReadWrite, Files.ReadWrite.All, Sites.ReadWrite.All在内的权限。

对于其他为此苦苦挣扎的人,解决方案非常简单,Graph API 不喜欢 PHP 编码 JSON 的默认方式:

$array = [
    "name" => "FolderName",
    "folder" => []
];

var_dump(json_encode($array));

请问output:

string(33) "{"name":"FolderName","folder":[]}"

这就是 SDK 的编程方式。 问题是 Graph API 不喜欢方括号用于空对象。 它需要大括号。 这可以在 PHP 中通过向 JSON 编码添加一个标志来实现:

$array = [
    "name" => "FolderName",
    "folder" => []
];

var_dump(json_encode($array, JSON_FORCE_OBJECT));

这将 output:

string(33) "{"name":"FolderName","folder":{}}"

这是 Graph API 想要的格式。 但是由于 JSON 编码是由没有标志的 SDK 自动完成的,我们必须通过自己编码数组来覆盖它:

$response = $graph->setApiVersion("v1.0")
    ->createRequest("POST", "/drives/me/items/root/children")
    ->addHeaders([
        "Content-Type" => "application/json"
    ])
    ->attachBody(json_encode([
        "name" => "FolderName",
        "folder" => []
    ], JSON_FORCE_OBJECT))
    ->execute();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM