Новая задача C# Asana POST возвращает ошибку 400 (неверный запрос)

У меня проблема с созданием новой задачи в 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;
    }

URL-адрес действия: https://app.asana.com/api/1.0/workspaces/Мое рабочее пространство/задачи JSON:{"data":{"name":"TestTask1","notes":"Test note","workspace":"*MyWorkspace*","assignee":"*MyAssignee"}}

Но Асана возвращает мне "Удаленный сервер вернул ошибку: (400) Неверный запрос".

Если я изменю request.ContentType на «application/x-www-form-urlencoded», я не получу ошибок, но Asana вернет мне новую задачу с пустыми полями.

Какими должны быть мои следующие шаги по устранению проблемы?

Спасибо


person Maxim Makovetsky    schedule 14.08.2016    source источник


Ответы (2)


Если вы используете ApiKey (а не токен личного доступа), я считаю, что ваш заголовок авторизации должен быть

"Authorization: Basic " + EncodedAuthInfo

куда

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

См. раздел Как подключиться к Asana Rest API. с помощью c#? или раздел «Использование базовой аутентификации» на странице https://asana.com/developers/documentation/getting-started/auth для получения подробной информации об использовании базовой аутентификации.

Я также немного смущен тем, что вы имеете в виду, когда говорите это

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

Это тот ответ HTTP, который вы ожидаете?

В любом случае, надеюсь, то, что я изложил, поможет.

person Mark Yao    schedule 16.08.2016
comment
Извините, за путаницу с именами переменных. Я использую токен личного доступа и успешно ПОЛУЧАЮ информацию от Asana, но не могу опубликовать новые задачи, проекты и т. д. Этот JSON — это то, что я отправляю в ASANA. Насколько я понял из документации, для полей, не упомянутых в JSON, будут установлены значения по умолчанию. - person Maxim Makovetsky; 16.08.2016
comment
Ааа спасибо за разъяснение. Не могли бы вы показать мне необработанный URL-адрес запроса? Я думаю, что это облегчило бы решение проблемы. - person Mark Yao; 16.08.2016
comment
Спасибо. Я думаю, что указание request.ContentType = "application/x-www-form-urlencoded" является правильным вызовом. Что-то мне подсказывает, что проблема с разделом, где вы пишете в стим. Я не эксперт по С#, но, возможно, следую использованию здесь msdn.microsoft.com/en-us/library/d4cek6cc(v=vs.110).aspx будет полезен? - person Mark Yao; 18.08.2016
comment
Еще раз привет, Марк! Проблема все еще сохраняется. Даже если я установлю request.ContentType = application/x-www-form-urlencoded и закодирую запрос, как в упомянутом вами руководстве msdn. Асана не возвращает ошибок. Задание не создано. Есть ли в Asana песочница, где я могу увидеть ошибки на стороне сервера? - person Maxim Makovetsky; 22.08.2016

Хм. Думаю, я разобрался с тем, что вас блокирует.

Представьте себе сценарий, в котором вы публикуете в

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

и вы передаете в теле запроса параметр

"workspace":"789012"

Что платформа Asana должна делать с этими данными? Вы случайно дважды указали рабочую область с конфликтующими номерами. По этой причине вы не можете указать идентификатор рабочей области в данных при переходе к конечной точке, которая также содержит идентификатор рабочей области в URL-адресе.

Документация сбивает с толку в этом вопросе, потому что мы не уточняем, какие параметры находятся в URL-адресе, а какие — в JSON в теле запроса. Я на самом деле исправить это очень скоро! Если это действительно является причиной проблемы, мне жаль, что мы не были ясны по этому поводу.

Лично я думаю, что было бы удобнее разрешить дублирование рабочей области в данных параметра тогда и только тогда, когда она идентична той, что указана в URL-адресе, но прямо сейчас мы просто проверяем, есть ли только одно значение. для идентификатора рабочей области. Если их несколько, даже если они одинаковые, мы возвращаем код ошибки 400.

Вы можете рассмотреть возможность разбора тела ответа даже при ошибках. В нем мы стараемся предоставить достаточно достойную информацию о том, что было не так в запросе. Например, при проверке моей догадки о вашем запросе я получил следующее:

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

Если мы проделали хорошую работу по отправке информативных сообщений, я надеюсь, что вы найдете это даже более полезным, чем песочница Asana! Если это не проблема, не стесняйтесь комментировать; Я буду счастлив погрузиться в это дальше.

person Matt    schedule 23.08.2016