Отправка параметра в postman api запрос на получение

У меня есть контроллер для подсчета элементов, превышающих определенную дату. Репозиторий выглядит как:

    public Dictionary<int, int> GetAllComplaintsCount(DateTime start)
    {
        try
        {
            return _context.Checklists
                .Where(a => a.COMPLAINT.Received_DT > start)
                .GroupBy(a => a.MonitorEnteredEmpID)
                .ToDictionary(g => g.Key, g => g.Count());
        }
        catch (Exception ex)
        {
            _logger.LogError("Could not get am with checklist", ex);
            return null;
        }
    }

Изменить Я включил свои маршрутизаторы, чтобы убедиться, что это правильно:

         app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "crams/{controller=Home}/{action=Index}/{id?}");
            routes.MapRoute(
                name: "route",
                template: "crams/{controller}/{action}/{start?}");
        });

Вопрос Без параметра start я могу получить http://localhost:8000/crams/api/counts через почтальона. Однако я не уверен, как включить дату через почтальона, чтобы он мог вытягивать только даты, которые больше, чем начало.

я пробовал

http://localhost:8000/crams/api/counts/2016-1-1 но возвращается null.


person epv    schedule 28.06.2016    source источник
comment
Передайте дату в виде строки и проанализируйте ее в действии.   -  person Jasen    schedule 28.06.2016
comment
@Jasen это то, что делает связыватель модели по умолчанию   -  person freedomn-m    schedule 29.06.2016


Ответы (2)


/api/counts/2016-1-1 возвращается как null

Ваш API:

... GetAllComplaintsCount(DateTime start)

поэтому ваш URL должен быть:

/api/counts?start=2016-1-1

Это будет с маршрутизацией по умолчанию. Поскольку вы не включили маршрутизацию в свой вопрос, я предполагаю (учитывая симптомы), что это значение по умолчанию:

/api/{controller}/{id}

т. е. при использовании /api/counts/2016-1-1 в качестве параметра id указывается "2016-1-1", но у вас нет параметра id и вы не указали значение для start, поэтому вы получаете null.

Вы можете добавить маршрут как

/api/{controller}/{start}

Я только что создал API как:

    [HttpGet]
    public string Test(DateTime d)
    {
        return d.ToString();
    }

и позвонил через почтальона (хотя любой клиент дал бы тот же результат)

http://localhost/api/../Test?d=2016-1 -1

и он вернул ожидаемое "01.01.2016 00:00:00"

person freedomn-m    schedule 29.06.2016
comment
Я ценю ваш вдумчивый ответ! Я попытался добавить маршрут в свой маршрут по умолчанию и назвал его маршрутом, и теперь мои маршруты выглядят так: {action=Index}/{id?}); route.MapRoute(имя: маршрут, шаблон: crams/{контроллер}/{действие}/{начало?}); }); - person epv; 29.06.2016
comment
Во-первых, вы работали с ../counts?start=2016-1-1? - person freedomn-m; 29.06.2016
comment
Нет, с добавлением параметра ничего не получалось. Я все еще получаю ноль. - person epv; 29.06.2016
comment
Далее, похоже, вы изменили маршруты MVC, а не маршруты API, а маршрут «по умолчанию» всегда должен быть последним, поскольку он будет выполнять их по порядку. - person freedomn-m; 29.06.2016
comment
Попробуйте упростить существующий метод, чтобы просто вернуть start.ToString() перед добавлением новых/маршрутов. Получите параметр, работающий с ?start=..., прежде чем делать его лучше. Поставьте точку останова внутри метода и посмотрите, каково значение. Может быть, у вас нет записей, поэтому удалите часть БД и придерживайтесь простого .ToString - person freedomn-m; 29.06.2016
comment
Я понял :) Ты молодец. - person epv; 29.06.2016
comment
Еще один вопрос: если бы я хотел указать дату окончания, я бы просто добавил еще один? как localhost:8000/crams/api / - person epv; 29.06.2016
comment
Ну, вы бы использовали & для дополнительных параметров строки запроса. - person freedomn-m; 29.06.2016

Вы можете попробовать передать тики в свой API

http://localhost:8000/crams/api/counts/636027305821590000

А потом

public Dictionary<int, int> GetAllComplaintsCount(Int64 dateTicks)
    {
        try
        {
            var startDate = new DateTime(dateTicks);
            return _context.Checklists
                .Where(a => a.COMPLAINT.Received_DT > startDate)
                .GroupBy(a => a.MonitorEnteredEmpID)
                .ToDictionary(g => g.Key, g => g.Count());
        }
        catch (Exception ex)
        {
            _logger.LogError("Could not get am with checklist", ex);
            return null;
        }
    }

Вот информация о том, как получить тики с даты (используя JS)

Как преобразовать объект даты JavaScript в тики

Надеюсь это поможет:

person David Espino    schedule 28.06.2016
comment
Извините, у меня пока нет .net env для тестирования... вы получаете ошибки? Я отправлял параметры DateTime раньше приложениям, используя либо тики, либо определенную строку формата, и использовал .ParseExact... Если в моем примере кода есть ошибка, я могу обновить ее. - person David Espino; 29.06.2016
comment
Проблема заключалась в том, что маршрутизация не соответствовала имени параметра, что также имело место здесь. - person freedomn-m; 29.06.2016