Професионална програма
Loading...
+ Нов въпрос
aivian avatar aivian 51 Точки

[Homework] ASP.NET Web API

Имам няколко дребни въпроса. Когато правим логиката за добавяне на нов автор пише да се използват binding models. Моят binding model изглежда така:

public class AuthorBindingModel
    {
        public string FirstName { get; set; }

        [Required]
        public string LastName { get; set; }
    }

Въпроса ми е - как да напиша заявката в Postman, за да пропусна примерно FirstName и да ме го запише в базата като NULL? Като дам http://localhost:port/api/authors?lastname=s ми хвърля една дълга грешка за валидация, а firstname не е required.

Втория въпрос ми е - как да наглася името на route - а, за да изглежда по този начин /api/books?search={word}? Като подам на метода параметър search ми прави route - а /api/books?search={search}, а като си правя custom route - не ми позволява да използвам question mark - ове.

PS: Като се замисля, от втория въпрос няма много смисъл :D Но по принцип, ако искаме да правим промени по URI параметрите, как става?

1
C# Web Services & Cloud 19/08/2015 14:55:48
thepowerof4 avatar thepowerof4 98 Точки

Дано не се разсърди колега, че използвам темата за задаване на въпрос. Чуденката ми е относно view моделите. Примерно при /api/authors/{id} се иска да се върне информация само за заглавията на книгите на този автор. Ако създам обаче BookViewModel, то нелогично е той да съдържа само заглавията, иначе е неизползваем при другите заявки. Чуденката е дали да има отделен view модел, който да отговаря на нуждите на всяка заявка, или да ползваме пълния модел, при който само нужната информация се връща (а другите стойности са null/0), или да си използваме анонимни типове и да не използваме view модел при такава "ограничена" заявка. Идеи?

0
19/08/2015 16:00:56
RoYaL avatar RoYaL Trainer 6845 Точки

Да, щом всяка заявка връща различни данни, отделен ViewModel.

2
RoYaL avatar RoYaL Trainer 6845 Точки

Не съм убеден, че има смисъл от BindingModel при GET заявката, особено щом параметрите се редят в URL-a :-)

Аз бих го направил с параметри на метода

public IHttpActionResult Get(string lastName, string firstName = null) {

           // method body

}

0
a.angelov avatar a.angelov 1317 Точки

aivian, специално за създаването на авторите - защо не пращаш данните в body-то, а го правиш през uri...? Не съм пробвал през uri да поствам автор, но с параметри в body-то нямам проблеми с валидациите и работят правилно.

 

1
aivian avatar aivian 51 Точки

Долу под endpoint - овете пише да се ползват binding models.

0
a.angelov avatar a.angelov 1317 Точки

Ами аз си ги ползвам байндинг моделите, а и както виждаш в endpoint-а не се подават параметри в uri-то - следователно трябва да ги подадеш в бодито. Докато за search-а параметъра си е подаден в endpoint-а точно в uri-то.

0
VenelinGrozev avatar VenelinGrozev 130 Точки

Относно първият въпрос - къде искаш да пропуснеш FirstName? Ако го пропуснеш от формата от която се праща заявката и не си го направил [Required] в binding модела не би трябвало да имаш проблеми.

А търсенето по дума го направих така

[HttpGet]
[Route("books")]
[EnableQuery]
 public IQueryable<BookIdTitleDTO> GetBooksByKeyword([FromUri]string keyword)
        {
            var books = context.Books
                .Where(b => b.Title.Contains(keyword) || b.Description.Contains(keyword))
                .Select(b => new BookIdTitleDTO()
                {
                    Id = b.Id,
                    Title = b.Title,
                })
                .OrderBy(b => b.Title)
                .Take(10);

            return books;
        }

 

0
19/08/2015 18:58:20
verito898 avatar verito898 265 Точки

https://github.com/VeronikaMartinova/Software-University-Courses/tree/master/02.Back-end%20Advanced/03.Web%20services%20and%20Cloud/02.BookShop-WebApi-Service

Линк към моето домашно ( не съвсем завършено ) като за момента не мога да преценя до колко е вярно , но все пак може да помогне на някой .

Пс : приемам  всякакви критики :))

3
20/08/2015 11:32:49
dimityr.jechev avatar dimityr.jechev 198 Точки

Може да съм в грешка,но няма нужда да слагаш OData на POST заявки,като създаването на Author,също май не трябва OData в ViewModels.OData трябва да ти е на GET заявките,като примерно да върне книгите на даден автор ,за да можеш при желание да вземеш 2-3 книги,а не всичките.

0
verito898 avatar verito898 265 Точки
Не си в грешка , забравила съм да ги махна ..по-късно ще редактирам.Благодаря ти :))
0
20/08/2015 12:22:46
dim4o avatar dim4o 289 Точки

В GetBooksByAuthorId(int id) не трябва ли да връщаш цялата информация за книгата, а не само заглавието?

0
scr33nsh0o7 avatar scr33nsh0o7 61 Точки

някой знае ли как се прави този rout

 /api/books?search={word}

да са различни след ?  имената , а не да стоят ?word={word}  или ?search={search}

0
RoYaL avatar RoYaL Trainer 6845 Точки

Това не е route, а зависи единствено и само от документацията, която WebApi2 си прави.

Може да има по-хитър начин, но за това което се сещам е да се направят условие в съответното View.

Help страницата се намира в Areas/HelpPage

Съответното визуализиране се намира във Views/Help/DisplayTemplates/ApiGroup.cshtml

Стойностите с URL-а се намират в api.RelativePath. Вариант е да намериш как се попълва това пропърти и да го промениш там. Хакът за който се сещам е да го направиш директно във view-то, което като цяло е грозно, но ще постигне целите ти:

@foreach (var api in Model)
    {
        var url = api.RelativePath;
        if (url == "api/Values?firstName={firstName}&lastName={lastName}")
        {
            url = "api/Values/?firstName={asd}";
        }
        <tr>
            <td class="api-name"><a href="@Url.Action("Api", "Help", new { apiId = api.GetFriendlyId() })">@api.HttpMethod.Method @url</a></td>
            

Това сега при мен визуализира

Values
API	Description
GET api/Values/?firstName={asd} 	

No documentation available.

 

0