WEB API как узнать почему параметр NULL

shadow7256
Уже с Приветом
Posts: 9392
Joined: 18 Mar 2004 15:11
Location: New York -> FL

WEB API как узнать почему параметр NULL

Post by shadow7256 »

Уважаемые,

имеем метод в WEB API.

Code: Select all

public void CreatePerson (Person person);

Параметр метода - это объект класса Person

Code: Select all

class Person
{
    public string Name {get;set;}
    public DateTime CreateDate {get;set;}
}
Клиент посылает в метод данные в виде XML. Если по какой то причине WEB API не может преобразовать XML в объект класса Person то на входе в метод мы имеем NULL. А можно как то в методе узнать почему параметр NULL? Что конкретно не понравилось?
User avatar
olegy
Уже с Приветом
Posts: 2127
Joined: 07 Nov 2000 10:01
Location: San Diego, CA, USA

Re: WEB API как узнать почему параметр NULL

Post by olegy »

В Fiddler посмотрите raw request.
Обычно не проставлен request header Content-Type - должен быть text/xml или application/xml
Я гражданин Украины, киевлянин и я против хунты!
shadow7256
Уже с Приветом
Posts: 9392
Joined: 18 Mar 2004 15:11
Location: New York -> FL

Re: WEB API как узнать почему параметр NULL

Post by shadow7256 »

olegy wrote: 20 Apr 2017 04:34 В Fiddler посмотрите raw request.
Обычно не проставлен request header Content-Type - должен быть text/xml или application/xml
Этот хедер проставлен.

Но причина того, что параметр = null может быть другой. Допустим пользователь внутри XML передал дату в неправильном формате. Задача собственно стоит в том, чтобы внутри моего метода (ну или в любом месте кода моего) узнать причину этого, что пошло не так. Чтобы вернуть клиенту ответку Bad request но при этом указать ему, что он сделал не так.
Palych
Уже с Приветом
Posts: 13682
Joined: 16 Jan 2001 10:01

Re: WEB API как узнать почему параметр NULL

Post by Palych »

shadow7256 wrote: 20 Apr 2017 12:08
Этот хедер проставлен.

Но причина того, что параметр = null может быть другой. Допустим пользователь внутри XML передал дату в неправильном формате.
Вы уверены что это может быть причиной?
Попробуйте воспроизвести ситуацию.
Если нужно в коде расследовать причину null - что-то не так с framework...
User avatar
olegy
Уже с Приветом
Posts: 2127
Joined: 07 Nov 2000 10:01
Location: San Diego, CA, USA

Re: WEB API как узнать почему параметр NULL

Post by olegy »

shadow7256 wrote: 20 Apr 2017 12:08
Этот хедер проставлен.

Но причина того, что параметр = null может быть другой. Допустим пользователь внутри XML передал дату в неправильном формате. Задача собственно стоит в том, чтобы внутри моего метода (ну или в любом месте кода моего) узнать причину этого, что пошло не так. Чтобы вернуть клиенту ответку Bad request но при этом указать ему, что он сделал не так.
Тогда варианта два.
Первый - сложный - подключить custom httpmodule (или owin middleware - зависит от импементации) и перехватить запрос до того как он попал в controller и, в случае ошибки, просигналить ответ.
Вариант два - смените подпись метода на
public void CreatePerson ([FromBody] string whatever);
и ручками deserialize строку в объект. Глядишь, ошибки и повываливаются
Я гражданин Украины, киевлянин и я против хунты!
shadow7256
Уже с Приветом
Posts: 9392
Joined: 18 Mar 2004 15:11
Location: New York -> FL

Re: WEB API как узнать почему параметр NULL

Post by shadow7256 »

olegy wrote: 20 Apr 2017 16:03 Вариант два - смените подпись метода на
public void CreatePerson ([FromBody] string whatever);
и ручками deserialize строку в объект. Глядишь, ошибки и повываливаются
интересно.. то есть на входе получаем чисто XML в виде строки. Затем сами внутри того же try/catch пытаемся создать объекта класса Person на его основе.. и тут может вывалиться хахашечка :)

Попробую. :)
User avatar
valchkou
Уже с Приветом
Posts: 4195
Joined: 27 Apr 2011 03:43
Location: Сергели ->Chicago

Re: WEB API как узнать почему параметр NULL

Post by valchkou »

shadow7256 wrote: 21 Apr 2017 00:48
olegy wrote: 20 Apr 2017 16:03 Вариант два - смените подпись метода на
public void CreatePerson ([FromBody] string whatever);
и ручками deserialize строку в объект. Глядишь, ошибки и повываливаются
интересно.. то есть на входе получаем чисто XML в виде строки. Затем сами внутри того же try/catch пытаемся создать объекта класса Person на его основе.. и тут может вывалиться хахашечка :)

Попробую. :)
Мужики это что за такие древние технологии вы тут обсуждаете?
почему нельзя просто дебагером пройтись и посмотреть?
User avatar
ie
Уже с Приветом
Posts: 11019
Joined: 15 May 2002 02:09
Location: Boston, MA

Re: WEB API как узнать почему параметр NULL

Post by ie »

valchkou wrote: 24 Apr 2017 18:38
shadow7256 wrote: 21 Apr 2017 00:48
olegy wrote: 20 Apr 2017 16:03 Вариант два - смените подпись метода на
public void CreatePerson ([FromBody] string whatever);
и ручками deserialize строку в объект. Глядишь, ошибки и повываливаются
интересно.. то есть на входе получаем чисто XML в виде строки. Затем сами внутри того же try/catch пытаемся создать объекта класса Person на его основе.. и тут может вывалиться хахашечка :)

Попробую. :)
Мужики это что за такие древние технологии вы тут обсуждаете?
почему нельзя просто дебагером пройтись и посмотреть?
где ставить брэк-поинт, чтобы узнать почему model is not properly populated?

public ActionResult Index(SuperModel model)
{
ProcessModel(model);

return View();
}
User avatar
valchkou
Уже с Приветом
Posts: 4195
Joined: 27 Apr 2011 03:43
Location: Сергели ->Chicago

Re: WEB API как узнать почему параметр NULL

Post by valchkou »

ie wrote: 24 Apr 2017 18:45
valchkou wrote: 24 Apr 2017 18:38
shadow7256 wrote: 21 Apr 2017 00:48
olegy wrote: 20 Apr 2017 16:03 Вариант два - смените подпись метода на
public void CreatePerson ([FromBody] string whatever);
и ручками deserialize строку в объект. Глядишь, ошибки и повываливаются
интересно.. то есть на входе получаем чисто XML в виде строки. Затем сами внутри того же try/catch пытаемся создать объекта класса Person на его основе.. и тут может вывалиться хахашечка :)

Попробую. :)
Мужики это что за такие древние технологии вы тут обсуждаете?
почему нельзя просто дебагером пройтись и посмотреть?
где ставить брэк-поинт, чтобы узнать почему model is not properly populated?

public ActionResult Index(SuperModel model)
{
ProcessModel(model);

return View();
}
так что за язык/технология?
в яве/idea/eclipse я бы поставил на return View();
и далее опустился бы по стэку до того места где эта модель заполняется.
там где то обязан быть конвертер/mapper
User avatar
ie
Уже с Приветом
Posts: 11019
Joined: 15 May 2002 02:09
Location: Boston, MA

Re: WEB API как узнать почему параметр NULL

Post by ie »

valchkou wrote: 24 Apr 2017 18:50 так что за язык/технология?
имеем метод в WEB API.
похоже .net..
valchkou wrote: 24 Apr 2017 18:50 в яве/idea/eclipse я бы поставил на return View();
и далее опустился бы по стэку до того места где эта модель заполняется.
там где то обязан быть конвертер/mapper
when we hit return View();
the initialization of the model already complete.. как вы отмотаете назад?
eclipse позволяет такое?
User avatar
katit
Уже с Приветом
Posts: 23804
Joined: 05 Jul 2003 22:34
Location: Брест -> St. Louis, MO

Re: WEB API как узнать почему параметр NULL

Post by katit »

shadow7256 wrote: 21 Apr 2017 00:48
olegy wrote: 20 Apr 2017 16:03 Вариант два - смените подпись метода на
public void CreatePerson ([FromBody] string whatever);
и ручками deserialize строку в объект. Глядишь, ошибки и повываливаются
интересно.. то есть на входе получаем чисто XML в виде строки. Затем сами внутри того же try/catch пытаемся создать объекта класса Person на его основе.. и тут может вывалиться хахашечка :)

Попробую. :)
Да. Но если делать так то как минимум один минус есть - документация сервиса не будет работать.
Лучше водки — хуже нет! ©
User avatar
valchkou
Уже с Приветом
Posts: 4195
Joined: 27 Apr 2011 03:43
Location: Сергели ->Chicago

Re: WEB API как узнать почему параметр NULL

Post by valchkou »

ie wrote: 24 Apr 2017 18:58
valchkou wrote: 24 Apr 2017 18:50 так что за язык/технология?
имеем метод в WEB API.
похоже .net..
valchkou wrote: 24 Apr 2017 18:50 в яве/idea/eclipse я бы поставил на return View();
и далее опустился бы по стэку до того места где эта модель заполняется.
там где то обязан быть конвертер/mapper
when we hit return View();
the initialization of the model already complete.. как вы отмотаете назад?
eclipse позволяет такое?
да, дебагер next step/step out выйдет из метода Index() во внешний метод, который вызвал Index() и так далее.
SergP
Уже с Приветом
Posts: 147
Joined: 13 Apr 2000 09:01

Re: WEB API как узнать почему параметр NULL

Post by SergP »

shadow7256 wrote: 21 Apr 2017 00:48 интересно.. то есть на входе получаем чисто XML в виде строки. Затем сами внутри того же try/catch пытаемся создать объекта класса Person на его основе.. и тут может вывалиться хахашечка :)
Это удобнее оформить как custom model binder.
Пример: http://stackoverflow.com/questions/8406 ... conversion
shadow7256
Уже с Приветом
Posts: 9392
Joined: 18 Mar 2004 15:11
Location: New York -> FL

Re: WEB API как узнать почему параметр NULL

Post by shadow7256 »

katit wrote: 24 Apr 2017 19:13
shadow7256 wrote: 21 Apr 2017 00:48
olegy wrote: 20 Apr 2017 16:03 Вариант два - смените подпись метода на
public void CreatePerson ([FromBody] string whatever);
и ручками deserialize строку в объект. Глядишь, ошибки и повываливаются
интересно.. то есть на входе получаем чисто XML в виде строки. Затем сами внутри того же try/catch пытаемся создать объекта класса Person на его основе.. и тут может вывалиться хахашечка :)

Попробую. :)
Да. Но если делать так то как минимум один минус есть - документация сервиса не будет работать.
Хм. не уверен про какую документацию сервиса ты говоришь :)

я по просьбе партии сделал один метод, который возвращает все доступные методы в моем WEB API и показывает какие параметры надо передавать и что эти методы возвращают. Партии этого хватило вполне :)
shadow7256
Уже с Приветом
Posts: 9392
Joined: 18 Mar 2004 15:11
Location: New York -> FL

Re: WEB API как узнать почему параметр NULL

Post by shadow7256 »

valchkou wrote: 24 Apr 2017 19:39
ie wrote: 24 Apr 2017 18:58
valchkou wrote: 24 Apr 2017 18:50 так что за язык/технология?
имеем метод в WEB API.
похоже .net..
valchkou wrote: 24 Apr 2017 18:50 в яве/idea/eclipse я бы поставил на return View();
и далее опустился бы по стэку до того места где эта модель заполняется.
там где то обязан быть конвертер/mapper
when we hit return View();
the initialization of the model already complete.. как вы отмотаете назад?
eclipse позволяет такое?
да, дебагер next step/step out выйдет из метода Index() во внешний метод, который вызвал Index() и так далее.
не уверен что Visual Studio позволяет такое... и да. Технология .NET.
shadow7256
Уже с Приветом
Posts: 9392
Joined: 18 Mar 2004 15:11
Location: New York -> FL

Re: WEB API как узнать почему параметр NULL

Post by shadow7256 »

ну вот разобрались 8O

Одно из полей класса Person было типа DateTime. Ну по совету бывалых я просто считал тупо строку и попытался преобразовать ее в объект Person через XmlSerializer. В ексепшене было это: The string '3/18/09 10:16 PM' is not a valid AllXsd value

начал копать. Оказывается , что если поле объекта имеет тип DateTime, то внутри XML его представление должно быть в строгом формате - yyyy-dd-mm что то типа такого.. любой другой формат тут же выдаст ошибку. Даже такой формат как mm/dd/yyyy тоже выплюнет ексепшн.

Return to “Вопросы и новости IT”