Dropbox API HTTP Unity3d 上传下载

Dropbox API HTTP Unity3d upload download

由于没有对 Unity3d 和 Dropbox 的官方支持,我使用的是 HTTP API。 我能够使用代码流(通过在 Unity3d 中使用 Application.OpenURL)和 oauth2/token Post 部分(所以我能够登录并获得我从 oauth2/authorize).

获得的代码

问题是我真的不知道如何上传和下载文件。 我尝试了什么(此代码在协程中):

Dictionary<string, string> postHeader = new Dictionary<string, string>();
postHeader.Add("Authorization", "Bearer <code>");
postHeader.Add("Dropbox-API-Arg", "{\"path\": \"/uploadtry.json\",\"mode\": \"overwrite\",\"autorename\": true,\"mute\": false}");
postHeader.Add("Content-Type", "application/octet-stream");
byte[] myData = System.Text.Encoding.UTF8.GetBytes(File.ReadAllText(Application.persistentDataPath + "/" + "uploadtry.json"));
using (WWW www = new WWW("https://content.dropboxapi.com/2/files/upload", myData, postHeader)) {
  yield return www;
  if (www.error != null) {
    Debug.Log(www.error);
  } else {
    Debug.Log("Success! " + www.text);
  }
}

我由此得到错误 400。

Dropbox 文档说

curl -X POST https://content.dropboxapi.com/2/files/upload \
--header "Authorization: Bearer <code>" \
--header "Dropbox-API-Arg: {\"path\": \"/Homework/math/Matrices.txt\",\"mode\": \"add\",\"autorename\": true,\"mute\": false}" \
--header "Content-Type: application/octet-stream" \
--data-binary @local_file.txt

我确定我的 post 是正确的,因为我对登录部分也做了同样的事情。 我确定承载 header 是正确的。 我不确定 Dropbox-API-Arg 的路径部分是否正确...我的应用程序只能访问它自己的文件夹,但我真的不知道我是否应该始终使用完整路径...我试过了无论如何,但我遇到了同样的错误(我从 "Applicazioni" 意大利语复制了授权部分和 MyAppName 之后自动创建的应用程序的路径...我没有尝试将 /home/ 添加到路径中)。 我不确定覆盖是否与 autorename true 兼容。 我不确定我是否必须使用 application/octet-stream 或 application/json 但我尝试了两者并得到了相同的错误 400.

所以我认为问题可能在于--data-binary。 现在我读取所有文件文本并将其转换为字节数组...通常这适用于 -d (数据)但也许这对 --data-binary.

是错误的

我还尝试从保管箱生成访问令牌(避免授权部分的临时解决方案只能使用您自己的帐户...因为我不知道不记名代码是否会过期)但这是没有帮助。我仍然收到错误 400。

有下载:

https://content.dropboxapi.com/2/files/download

我没有收到任何错误。但是我不知道如何决定下载文件夹,所以我没有得到任何文件。

https://www.dropbox.com/developers/documentation/http/documentation#files-download

我不明白如何在 (GET?) 中指定下载文件夹? 我真的很困惑。

编辑。 我从 linux 终端尝试了 curl(在家里我使用 Windows,所以我没有 curl),我能够使用 curl 上传和下载(我对它开始的路径是正确的应用程序文件夹 /uploadtry.json 很好。 Bearer 工作。 overwrite 与 autorename true 兼容,Content-type application/octet-stream 很好。 另外 get 只打印文件,所以我真的不知道为什么它没有错误地工作(但已经晚了,也许对于下载问题是代码中的错误,我今天会再试一次)。

唯一真正的区别是,在 Unity 中,我将文件作为文本读取 -> 转换为字节数组 -> 在 body... 在卷曲我使用 --data-binary @path/to/file.json 也许是因为如果我传递一个简单的字节数组就没有名字……我真的不知道。 如果找到解决方案,我会更新,但如果您有想法,我将不胜感激。

编辑2。 再次尝试下载还是不行。错误 400 错误请求

来自卷曲

curl -X POST https://content.dropboxapi.com/2/files/download     --header "Authorization: Bearer <code>" --header "Dropbox-API-Arg: {\"path\": \"/prova.json\"}"

这是有效的,return 一个字符串到终端。

在 Unity3d 上

Dictionary<string, string> postHeader = new Dictionary<string, string>();
postHeader.Add("Authorization", "Bearer <code>");
postHeader.Add("Dropbox-API-Arg", "{\"path\": \"/prova.json\"}");
using (WWW www = new WWW("https://content.dropboxapi.com/2/files/download", null, postHeader)){
    yield return www;
    if (www.error != null){
        Debug.Log(www.error);
    }else{
        Debug.Log("Success! " + www.text);
    }
}

这不起作用。

我真的不知道我做错了什么。

编辑3.

出于某种原因,上传代码确实有效。可能是OS,也可能是unity版本(昨天更新了,我在家还是用老版本。。。)反正现在唯一的问题是我还是不会知道怎么下载了。

编辑4.

好的新问题。我尝试使用 UnityWebRequest class(对于 Post 不起作用)并且我更改为 Get(因为使用 curl 仍然有效。 使用此代码下载 return 成功....但文件为空

using (UnityWebRequest www = UnityWebRequest.Get("https://content.dropboxapi.com/2/files/download"))
    {
        www.SetRequestHeader("Authorization", "Bearer <code>");
        www.SetRequestHeader("Dropbox-API-Arg", "{\"path\": \"/prova.json\"}");
        yield return www;
        if (www.error != null)
        {
            Debug.Log(www.error);
        }
        else
        {
            Debug.Log("Success! " + www.downloadHandler.data.Length);
        }
    }

好的,感谢 Greg 的建议,我得以考虑在 google 上搜索有关下载问题的内容。 就像我说的那样上传有效(即使在 2018.1 版本的 Unity3d 上。我将在此 post 之后上传以查看 2018.2 是否仍然有效)。我真的不知道为什么昨天我无法上传文件(也许我的代码在 url 中是错误的,但我没有注意到)。

无论如何,对于下载部分,我终于能够理解问题所在: Content-Type。 Dropbox,下载,需要一个空的“”内容类型(但我没有在文档中看到它,我可以在这里找到这个信息: Dropbox download file API stopped working with 400 error ).

从那里解决方案很简单。我再次使用 WWW class(UnityWebRequest Post 由于某种原因仍然损坏),并且使用这段代码我能够获取我的 json 文件的文本(刚刚添加了一个 header):

Dictionary<string, string> postHeader = new Dictionary<string, string>();
    postHeader.Add("Authorization", "Bearer <code>");
    postHeader.Add("Dropbox-API-Arg", "{\"path\": \"/provaupload.json\"}");
    postHeader.Add("Content-Type", "");
    using (WWW www = new WWW("https://content.dropboxapi.com/2/files/download", null, postHeader)) {
        yield return www;
        if (www.error != null) {
            Debug.Log(www.error + " " + www.text);
        } else {
            Debug.Log("Success! " + www.text);
        }
    }

我终于可以完成我的保存云解决方案了。