cakephp 如何使用Microsoft Graph API创建文件夹而不出错?

osh3o9ms  于 2022-11-11  发布在  PHP
关注(0)|答案(1)|浏览(157)

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

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

我在下面构建了这个函数。

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的权限。

9jyewag0

9jyewag01#

对于任何其他在这方面挣扎的人来说,解决方案非常简单,Graph API不喜欢PHP编码JSON的默认方式:

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

var_dump(json_encode($array));

将输出:

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

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

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

var_dump(json_encode($array, JSON_FORCE_OBJECT));

这将输出:

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();

相关问题