Я пытаюсь создать 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
Что пошло не так? Может кто-нибудь мне помочь?
Благодаря,
Самый быстрый способ заставить его работать (но, по-моему, грязный) - изменить ваше действие:
public FrequentQueryReport FrequentReport([FromUri]FrequentQueryRequest request)
но вы всегда можете использовать "biding". Посмотрите на эту статью:
http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api
Я нашел этот пост
http://www.codeproject.com/Articles/701182/A-Custom-Model-Binder-for-Passing-Complex-Objects
Я использую пользовательский ModelBinder, чтобы сделать это
[ModelBinder(typeof(FieldValueModelBinder))] FrequentQueryRequest request
Вы должны сделать запрос:
http://localhost:63591/FrequentReport?Fields=Employer&Range.From=2014-10-10&Range.To=2014-10-10
См. Range.From
и Range.To
. В противном случае у вас будут две даты с null
.
Изменение модели
[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"
}
}
&
между параметромFrom
параметромTo
в своем URL? Поэтому вы можете попробоватьhttp://localhost:63591/FrequentReport?Fields=Employer&From=2014-10-10&To=2014-10-10