MVC 4 - запрос REST

1

Я пытаюсь создать REST API.

У меня есть модель ниже

 public class FrequentQueryRequest
        {
            public string[] Fields { get; set; }
            public DateRange Range { get; set; }

        }

        public class DateRange
        {
            public DateTime? From { get; set; }
            public DateTime? To { get; set; }
        }

и мой контроллер

public FrequentQueryReport FrequentReport(FrequentQueryRequest request)
{
    for (int i = 0; i < request.Fields.Count(); i++)   --- **Error (request is null)** 
    {
          Fieldname = request.Fields[i];
          sqlconnector.Distribution(Fieldname, request, ref FieldDistribution);
    }
}

и у меня есть следующая конфигурация

config.Routes.MapHttpRoute(
                name: "API",
                routeTemplate: "{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
            );

Я сделал запрос, используя следующий URL [ОБНОВЛЕНО]

http://localhost:63591/FrequentReport?Fields=Employer&From=2014-10-10&To=2014-10-10

В моем контроллере я получаю значение запроса как null

Что пошло не так? Может кто-нибудь мне помочь?

Благодаря,

  • 1
    Вы не пропустите & между параметром From параметром To в своем URL? Поэтому вы можете попробовать http://localhost:63591/FrequentReport?Fields=Employer&From=2014-10-10&To=2014-10-10
  • 0
    @ RaphaëlAlthaus, я обновил запрос. Но все же я сталкиваюсь с той же проблемой
Показать ещё 2 комментария
Теги:
rest
asp.net-mvc-4

4 ответа

1

Самый быстрый способ заставить его работать (но, по-моему, грязный) - изменить ваше действие:

public FrequentQueryReport FrequentReport([FromUri]FrequentQueryRequest request)

но вы всегда можете использовать "biding". Посмотрите на эту статью:

http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

  • 0
    +1 за хороший ответ
0

Я нашел этот пост

http://www.codeproject.com/Articles/701182/A-Custom-Model-Binder-for-Passing-Complex-Objects

Я использую пользовательский ModelBinder, чтобы сделать это

[ModelBinder(typeof(FieldValueModelBinder))] FrequentQueryRequest request
  • 0
    +1 за твои попытки
0

Вы должны сделать запрос:

http://localhost:63591/FrequentReport?Fields=Employer&Range.From=2014-10-10&Range.To=2014-1‌​0-10

См. Range.From и Range.To. В противном случае у вас будут две даты с null.

0

Изменение модели

[DataContract(Name = "frequentQueryRequest", Namespace = "")]
public class FrequentQueryRequest
{
    [DataMember(Name = "fields", Order = 1, EmitDefaultValue = false)]
    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]      
    public string[] Fields  { get; set; }

    [DataMember(Name = "dateRange", Order = 2, EmitDefaultValue = false)]
    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
    public DateRange Range  { get; set; }   
}

[DataContract(Name = "dateRange", Namespace = "")]
public class DateRange
{
    [DataMember(Name = "from", Order = 3, EmitDefaultValue = false)]
    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
    public DateTime? From { get; set; }

    [DataMember(Name = "to", Order = 4, EmitDefaultValue = false)]
    [JsonProperty(DefaultValueHandling = DefaultValueHandling.Ignore)]
    public DateTime? To { get; set; }
}

Изменение контроллера

[HttpPost]
[ActionName("FrequentReport")]
public FrequentQueryReport FrequentReport(FrequentQueryRequest  request)
{
 for (int i = 0; i < request.Fields.Count(); i++) 
    {
          Fieldname = request.Fields[i];
          sqlconnector.Distribution(Fieldname, request, ref FieldDistribution);
    }
}

URL должен быть: http://localhost:63591/{controllername}/FrequentReport

Тело запроса:

{
    "fields": [{Employer, JobTitle,}],
    "dateRange": {
        "from": "2014-02-20T19:24:26+05:30",
        "to": "2014-08-20T19:23:41+05:30"
    }   
}
  • 0
    +1 за ответ

Ещё вопросы

Сообщество Overcoder
Наверх
Меню