代码之家  ›  专栏  ›  技术社区  ›  LiefLayer

如何使用Unity3D中的Microsoft Graph API上载/下载文件

  •  1
  • LiefLayer  · 技术社区  · 7 年前

    我可以在Microsoft Graph上使用Unity3D进行OAuth 2登录,我为我的应用程序请求了此权限: https://graph.microsoft.com/files.readwrite.appfolder

    在通常的代码流(重定向到URL、用户的权限、身份验证代码与令牌代码交换以及令牌与承载身份验证代码交换)之后,我就可以登录了。

    问题是上载小文件不起作用: https://docs.microsoft.com/en-us/onedrive/developer/rest-api/api/driveitem_put_content

    我认为这是我能做的最好的:

    string myData = File.ReadAllText(Application.persistentDataPath + "/" + "provaupload.json");
        using (UnityWebRequest www = UnityWebRequest.Post("https://graph.microsoft.com/v1.0/me/drive/root:/AppTry/provaupload.json:/createUploadSession", myData)) {
            www.SetRequestHeader("Authorization", "Bearer <code>");
            www.SetRequestHeader("Content-Type", "application/json");
            yield return www.SendWebRequest();
    
            if (www.isNetworkError || www.isHttpError) {
                Debug.Log(www.error + " " + www.downloadHandler.text);
            } else {
                Debug.Log("Upload complete! " + www.downloadHandler.text);
            }
        }
    

    我得到这个错误:

    Generic/unknown HTTP error {
      "error": {
      "code": "BadRequest",
      "message": "Unable to read JSON request payload. Please ensure Content-Type header is set and payload is of valid JSON format.",
      "innerError": {
        "request-id": "id",
        "date": "2018-07-20T06:24:30"
      }
    }
    

    我还尝试了www类,或者用put代替post,但是我得到了“无效的api”。 可能我的问题出在基本URL中: https://graph.microsoft.com/v1.0/me

    或者可能在路上 根目录:/apptry/provaupload.json

    或者在许可证里。

    我真的不知道。

    如果您知道如何使用Microsoft Graph和一个驱动器进行REST调用(即使不在Unity3D中,甚至不知道如何解决我的特定问题),那么最好举个例子。

    1 回复  |  直到 7 年前
        1
  •  1
  •   Programmer    7 年前

    UploadHandler UTF8 PUT POST

    string myData = File.ReadAllText(Application.persistentDataPath + "/" + "provaupload.json");
    string url = "https://graph.microsoft.com/v1.0/me/drive/root:/AppTry/provaupload.json:/content";
    
    using (UnityWebRequest www = new UnityWebRequest(url, "PUT"))
    {
        byte[] dataToSend = new System.Text.UTF8Encoding().GetBytes(myData);
        www.uploadHandler = (UploadHandler)new UploadHandlerRaw(dataToSend);
        www.downloadHandler = (DownloadHandler)new DownloadHandlerBuffer();
    
        www.SetRequestHeader("Authorization", "Bearer <code>");
        www.SetRequestHeader("Content-Type", "application/json");
        yield return www.SendWebRequest();
    
        if (www.isNetworkError || www.isHttpError)
        {
            Debug.Log(www.error + " " + www.downloadHandler.text);
        }
        else
        {
            Debug.Log("Upload complete! " + www.downloadHandler.text);
        }
    }