【问题标题】:Unable to create file on Onedrive through Microsoft Graph Rest API无法通过 Microsoft Graph Rest API 在 Onedrive 上创建文件
【发布时间】:2019-12-03 01:08:35
【问题描述】:

我正在创建一个 Android 应用程序,该应用程序使用 Microsoft Graph API 将基本文本文件上传到用户的 onedrive。

我发现通过使用https://developer.microsoft.com/en-us/graph/graph-explorer 使用带有链接“https://graph.microsoft.com/v1.0/me/drive/root:/Test.txt:/children”的 PUT 请求创建文件,标题为“Content-Type”“text/plain”,并用文本填充请求正文进入文本文件。使用图形资源管理器,这没有任何问题,但是当用所有这些东西测试我的代码时,它总是给我一个错误 400。

public void saveOpportunityToServer (final String textToSave, String fileName)
    {
        try
        {
            StringRequest request = new StringRequest(Request.Method.PUT, "https://graph.microsoft.com/v1.0/me/drive/root:/" + fileName + ":/content",
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response)
                        {
                            Log.d ("PAST QUOTES SAVE", "Created file on server");
                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error)
                        {
                            Log.e ("PAST QUOTES SAVE", "Failed to create file on server: " + error.toString());
                        }
                    })
            {
                @Override
                public byte[] getBody() throws AuthFailureError {
                    return textToSave.getBytes();
                }

                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    HashMap<String, String> headers = new HashMap<String, String>();
                    headers.put ("Authorization", "Bearer " + mAccessToken);
                    headers.put ("Content-Type", "text/plain");
                    return headers;
                }
            };


            serverRequest.getInstance().addToRequestQueue(request, "Create past quote file request");

        }catch (Exception e){
            Log.e ("PAST QUOTES SAVE", "Failed to create file on server");
        }
    }

其中 serverRequest 是 Volley.RequestQueue 的一个实例。

如果String Request中的“getBody()”函数保持不变,或者“textToSave”字符串为空,则服务器响应成功,创建请求的文件,但正如预期的那样,文件为空。

有没有人有解决方案,或者至少有一个纯文本不被接受的原因?

编辑:请求和响应标头和正文

标题:

“授权”“承载[AccessToken]”

“内容类型”“文本/纯文本”

身体: “这是一个测试”

我确定授权有效,但我想服务器可能没有正确解释内容类型标头,但是它在提到的网站上有效,所以我不确定为什么它不会在我的程序中。

响应是一个空的错误 400,它被 Microsoft 声明为格式错误的请求,这让我相信上述内容,但是我看不到修复它的方法。

【问题讨论】:

  • 您能否更新您的问题以包含响应标头和正文?它们通常包括有关可以使用的故障的额外信息
  • @Brad 该问题已被编辑以明确包含它们

标签: java android android-volley microsoft-graph-api


【解决方案1】:

终于找到问题所在了。

由于 volley 的工作原理,您不能简单地将“Content-Type”标头添加到“getHeaders()”函数。要更改正文内容类型,您必须重写一个单独的函数“geyBodyContentType()”

这是我的最终请求代码,供将来想知道如何解决此问题的任何人使用。

StringRequest request = new StringRequest(Request.Method.PUT, "https://graph.microsoft.com/v1.0/me/drive/root:/ " + fileName + ":/content",
                    new Response.Listener<String>() {
                        @Override
                        public void onResponse(String response)
                        {
                            Log.d ("PAST QUOTES SAVE", "Created file on server");
                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error)
                        {
                            Log.e ("PAST QUOTES SAVE", "Failed to create file on server: " + error.toString());
                        }
                    })
            {
                @Override
                public byte[] getBody() throws AuthFailureError {
                    return textToSave.getBytes();
                }

                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    HashMap<String, String> headers = new HashMap<String, String>();
                    headers.put ("Authorization", "Bearer " + mAccessToken);
                    return headers;
                }

                @Override
                public String getBodyContentType ()
                {
                    return ("text/plain");
                }
            };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-27
    相关资源
    最近更新 更多