Назначение пользователю новой задачи с помощью Microsoft Planner API

Я пытаюсь назначить пользователя задаче с помощью Microsoft Graph API для доступа к Планировщику. Мой код работает нормально, когда я не пытаюсь кого-то назначить (не указав раздел assignments), но когда я добавляю раздел назначений (следуя шаблону здесь) Я получаю сообщение об ошибке BadRequest.

{"error": {"code": "", "message": "Запрос недействителен: \ r \ nЗначение не может быть пустым. \ r \ nParameter name: QualifiedName", "innerError": {"request-id" : "...", "date": "2018-01-30T12: 23: 59"}}}

public TaskResponse CreateTask(string planId, string bucketId, string title, Dictionary<string, Assignment> assignments = null, DateTime? dueDateTime = null)
{
    RestRequest TaskRequest = new RestRequest("planner/tasks", Method.POST)
    {
        RequestFormat = DataFormat.Json
    };
    Dictionary<string, object> assignees = new Dictionary<string, object>();
    foreach(string assignment in assignments.Keys)
    {
        assignees.Add(assignment, new
        {
        });
    }
    var body = new
    {
        planId,
        bucketId,
        title,
        assignments = assignees,
        dueDateTime
    };
    TaskRequest.AddParameter("application/json", JsonConvert.SerializeObject(body), "application/json", ParameterType.RequestBody);
    IRestResponse TaskResponse = GraphClient.Execute(TaskRequest);
    if (!TaskResponse.IsSuccessful)
    {
        return null;
    }
    var result = JsonConvert.DeserializeObject<TaskResponse>(TaskResponse.Content);
    return result;
}

Буду признателен, если кто-нибудь знает, почему в ответе указано, что я не предоставил параметр, который никогда не упоминается в документации ...


person Peter Gordon    schedule 30.01.2018    source источник
comment
Было бы полезно увидеть, что на самом деле происходит на проводе. Можете ли вы получить сетевую трассировку с помощью Fiddler и посмотреть, какие полезные данные JSON передаются? Потому что я могу выполнить POST, как описано в Postman, без получения 400.   -  person Jason Johnston    schedule 30.01.2018
comment
@JasonJohnston Я использовал почтальона для запроса образца, и это сработало. Затем я удалил @odata.type из правопреемника, который воспроизвел мою проблему. Как я могу передать это имя параметра (оно содержит специальные символы, такие как @ и .) в анонимном типе? Он должен войти в пустой объект в цикле foreach.   -  person Peter Gordon    schedule 30.01.2018


Ответы (1)


Мне удалось исправить это, используя правильный класс вместо анонимного типа. Сделав это, я смог аннотировать свойство с помощью @odata.type, что было бы неприемлемо в качестве имени переменной.

public class NewAssignment
{
    [JsonProperty("@odata.type")]
    public string ODataType { get; set; }

    [JsonProperty("orderHint")]
    public string OrderHint { get; set; }

    public NewAssignment()
    {
        ODataType = "#microsoft.graph.plannerAssignment";
        OrderHint = " !";
    }
}

Это позволило мне использовать следующий код:

Dictionary<string, object> assignees = new Dictionary<string, object>();
foreach (string assignment in assignments.Keys)
{
    assignees.Add(assignment, new NewAssignment());
}
var body = new
{
    planId,
    bucketId,
    title,
    assignments = assignees,
    dueDateTime
};
person Peter Gordon    schedule 30.01.2018