0

我正在尝试使用 C# 对我们的 Asana 项目进行 API 调用。我可以毫无问题地“获得”特定项目下的所有任务。我还可以毫无问题地创建“发布”新任务。我很难重新利用用于创建/发布的代码来为现有任务执行“放置/更新”。在传递 JSON 数据时,我曾尝试指定尽可能多的信息,但没有成功更新。我的主要目标是,只是为了能够标记通过 API 完成的任务。如果有人对可能阻止我成功更新/放置对 Asana 任务的调用有任何建议/建议,那将是很棒的。感谢大家的时间。

更新代码 - 不工作

public static bool UpdateTask(string taskId)
    {
        string json = null;
        byte[] bytes = null;
        string url = "https://app.asana.com/api/1.0/tasks";
        HttpWebRequest req = default(HttpWebRequest);
        Stream reqStream = default(Stream);
        string authInfo = null;
        AsanaUpdateTask TaskData = new AsanaUpdateTask();
        try
        {
            authInfo = AsanaApiKey + Convert.ToString(":");

            TaskData.task = taskId;
            TaskData.name = "Business Collaboration";
            TaskData.assignee = "me";
            TaskData.assignee_status = "upcoming";
            TaskData.completed = "true";
            TaskData.due_on = "null";
            TaskData.notes = "new notes from API call 936am";

            json = JsonConvert.SerializeObject(TaskData);
            json = Convert.ToString("{ \"data\":") + json + "}";

            bytes = Encoding.UTF8.GetBytes(json);

            System.Net.ServicePointManager.SecurityProtocol = System.Net.SecurityProtocolType.Tls11 | System.Net.SecurityProtocolType.Tls12;

            req = (HttpWebRequest)WebRequest.Create(url);
            req.Method = WebRequestMethods.Http.Put;
            req.ContentType = "application/json";
            req.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)));
            req.ContentLength = bytes.Length;

            reqStream = req.GetRequestStream();
            reqStream.Write(bytes, 0, bytes.Length);
            reqStream.Close();


            HttpWebResponse response = (HttpWebResponse)req.GetResponse();
            string res = new StreamReader(response.GetResponseStream()).ReadToEnd();
            Console.WriteLine(res);
            Console.ReadLine();

            string finalString = res.Remove(0, 8);
            finalString = finalString.Remove((finalString.Length - 1));
            var newtask = JsonConvert.DeserializeObject(finalString);

            return true;
        }
        catch (WebException ex)
        {
            HttpWebResponse response = (HttpWebResponse)ex.Response;
            string resp = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
        }
        return false;
    }

用于更新的 JSON 数据

{ "data":{"task":"156272920352856","name":"Business Collaboration","assignee":"me","assignee_status":"upcoming","completed":"true","due_on":"null","notes":"new notes from API call 936am"}}

创建/发布任务代码 - 当前工作

public static void CreateTask(string workspaceId, string projectId)
{
    string json = null;
    byte[] bytes = null;
    string url = "https://app.asana.com/api/1.0/tasks";
    HttpWebRequest req = default(HttpWebRequest);
    Stream reqStream = default(Stream);
    string authInfo = null;
    AsanaCreateTask TaskData = new AsanaCreateTask();
    try
    {
        authInfo = AsanaApiKey + Convert.ToString(":");
        TaskData.workspace = workspaceId;
        TaskData.name = "Business Collaboration";
        TaskData.notes = "new api notes 947am";

        json = JsonConvert.SerializeObject(TaskData);
        json = json.Insert((json.Length - 1), ",\"projects\":[" + projectId + "]");
        json = Convert.ToString("{ \"data\":") + json + "}";

        bytes = Encoding.UTF8.GetBytes(json);

        req = (HttpWebRequest)WebRequest.Create(url);
        req.Method = WebRequestMethods.Http.Post;
        req.ContentType = "application/json";
        req.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)));
        req.ContentLength = bytes.Length;

        reqStream = req.GetRequestStream();
        reqStream.Write(bytes, 0, bytes.Length);
        reqStream.Close();


        HttpWebResponse response = (HttpWebResponse)req.GetResponse();
        string res = new StreamReader(response.GetResponseStream()).ReadToEnd();
        Console.WriteLine(res);
        Console.ReadLine();

        string finalString = res.Remove(0, 8);
        finalString = finalString.Remove((finalString.Length - 1));
        var newtask = JsonConvert.DeserializeObject(finalString);
    }
    catch (WebException ex)
    {
        HttpWebResponse response = (HttpWebResponse)ex.Response;
        string resp = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
    }
}

用于创建的 JSON 数据

{ "data":{"notes":"new api notes 956am","workspace":"143129080097680","name":"Business Collaboration","projects":[143129080097684]}}
4

1 回答 1

1

我在 gitHub 上查看了 AsanaNet,它提供了更多见解以及关于 URL 中直接 taskId 的 Marks 评论。这是针对 Asana 的完全有效的“更新任务”方法。认为有一天它会帮助其他人。

我创建了一个可以序列化/反序列化为 JSON 的小对象。

public class AsanaUpdateTask
{
    public string notes { get; set; }
    public string workspace { get; set; }
    public string name { get; set; }
    public bool completed { get; set; }
}

这是成功“放置”更新的方法。

public static void UpdateTask(string workspaceId, string taskId)
{
    string json = null;
    byte[] bytes = null;
    string url = string.Format("https://app.asana.com/api/1.0/tasks/{0}", taskId);
    HttpWebRequest req = default(HttpWebRequest);
    Stream reqStream = default(Stream);
    string authInfo = null;
    AsanaUpdateTask TaskData = new AsanaUpdateTask();
    try
    {
        authInfo = BearerToken + Convert.ToString(":");
        /*Required Minimum for a response from API::: workspace, name, and notes*/
        TaskData.workspace = workspaceId; 
        TaskData.name = "Business Collaboration V7";
        TaskData.notes = "1306:: this is working..updated from api Aug 26";
        TaskData.completed = false; //Used to mark task completed

        json = JsonConvert.SerializeObject(TaskData);
        json = Convert.ToString("{ \"data\":") + json + "}";

        bytes = Encoding.UTF8.GetBytes(json);

        req = (HttpWebRequest)WebRequest.Create(url);
        req.Method = WebRequestMethods.Http.Put;
        req.ContentType = "application/json";
        req.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(Encoding.Default.GetBytes(authInfo)));
        req.ContentLength = bytes.Length;

        reqStream = req.GetRequestStream();
        reqStream.Write(bytes, 0, bytes.Length);
        reqStream.Close();


        HttpWebResponse response = (HttpWebResponse)req.GetResponse();
        string res = new StreamReader(response.GetResponseStream()).ReadToEnd();
        Console.WriteLine(res);
        Console.ReadLine();

        string finalString = res.Remove(0, 8);
        finalString = finalString.Remove((finalString.Length - 1));
        var newtask = JsonConvert.DeserializeObject(finalString);
    }
    catch (WebException ex)
    {
        HttpWebResponse response = (HttpWebResponse)ex.Response;
        string readableString = new StreamReader(ex.Response.GetResponseStream()).ReadToEnd();
    }
}
于 2016-08-26T18:17:29.423 回答