C#Asana POST新任务返回错误400(错误请求)

时间:2016-08-14 13:21:02

标签: c# asana

我在使用我的应用程序在Asana中创建新任务时遇到问题。

发布方法:

protected static T Post<T>(string route, object action = null, object parameters = null) where T : BaseResult, new()
    {
        var result = new T();

        try
        {
            var actionUrl             = GetActionUrl(route, action);
            var request               = (HttpWebRequest)WebRequest.Create(actionUrl);
            request.Credentials       = CredentialCache.DefaultCredentials;
            request.Accept            = "application/json";
            request.Method            = WebRequestMethods.Http.Post;
            request.Proxy.Credentials = CredentialCache.DefaultCredentials;
            request.Headers.Add("Authorization: Bearer " + ApiKey);

            if (parameters != null)
            {
                var contentJSON       = JsonConvert.SerializeObject(parameters);
                request.ContentType   = "application/json";

                using (var s = request.GetRequestStream())
                    using (var sw = new StreamWriter(s, Encoding.UTF8))
                        sw.Write(contentJSON);
            }

            var response = (HttpWebResponse) request.GetResponse();

            using (var reader = new StreamReader(response.GetResponseStream()))
            {
                var data = reader.ReadToEnd();
                result   = JsonConvert.DeserializeObject<T>(data);
            }
        }
        catch (Exception ex)
        {
            result.IsOk    = false;
            result.Message = ex.GetMessage();
        }

        return result;
    }

操作网址:https://app.asana.com/api/1.0/workspaces/ MyWorkspace / tasks JSON:{"data":{"name":"TestTask1","notes":"Test note","workspace":"*MyWorkspace*","assignee":"*MyAssignee"}}

但Asana回复我&#34;远程服务器返回错误:(400)错误请求。&#34;

如果我将request.ContentType更改为&#34; application / x-www-form-urlencoded&#34;,我没有收到任何错误,但Asana会返回空白字段的新任务。

我接下来要解决的问题应该是什么?

谢谢

2 个答案:

答案 0 :(得分:0)

如果你正在使用ApiKey(而不是个人访问令牌),我相信你的授权标题应该是

"Authorization: Basic " + EncodedAuthInfo

,其中

EncodedAuthInfo = Convert.ToBase64String(Encoding.Default.GetBytes(ApiKey + ":"))

有关使用基本身份验证的详细信息,请参阅How do I connect to the Asana Rest API using c#?https://asana.com/developers/documentation/getting-started/auth中的使用基本身份验证部分。

当你这么说时,我对你的意思有点困惑

JSON = {"data": {"name": "TestTask1"} ...

这是您期望的HTTP响应吗?

无论如何,希望我所概述的有用。

答案 1 :(得分:0)

嗯。我想我已经解决了你的问题。

想象一下你发布到

的场景
https://app.asana.com/api/1.0/workspaces/123456/tasks

并在请求正文中传递参数

"workspace":"789012"

Asana平台应该如何处理这些数据?您无意中使用冲突的数字指定了工作区两次。因此,在点击包含URL 中的工作区ID的端点时,无法在数据中指定工作区ID。

文档在这一点上令人困惑,因为我们没有说明在URL中找到哪些参数以及在请求正文中的JSON中找到了哪些参数。我实际上很快就解决了这个问题!如果这确实是造成这个问题的原因,我很抱歉我们对此并不清楚。

就我个人而言,我认为允许工作区在参数数据中复制可能是更好的用户体验,当且仅当它与URL中的相同时,但是现在,我们只是检查是否存在工作区标识只有一个值。如果有多个,即使它们是同一个,我们也会返回400错误代码。

您可以考虑解析响应正文,即使出现错误也是如此。在其中,我们尝试提供有关请求错误的相当不错的信息。例如,在测试我的预感时,我得到的是:

"errors":[{"message":"Duplicate field: workspace", ...}]

如果我们在发回信息性信息方面做得很好,我希望你会发现这比Asana沙箱更有用!如果这不是问题,请随时发表评论;我很乐意进一步深入研究。