Как использовать параметр в Web API v2? - PullRequest
0 голосов
/ 27 августа 2018

Понятия не имею, с чего начать. Я задал вопрос ранее, и кто-то предложил мне посмотреть на атрибут маршрутизации. Я прочитал об этом, и хотя это помогло мне создать приведенный ниже код, я все еще не уверен, как ограничить его, как я хочу.

public class ReviewController : ApiController
{
    private Review db = new Review();
    ////This GET works. It was auto-generated by Visual Studio. 
    // GET: api/Review
    public IQueryable<Review> GetReview()
    {
        return db.Review;
    }

    ////This is the GET that I'm trying to write, but don't know what to do
    // GET: api
    [Route("api/review/site")]
    [HttpGet]
    public IEnumerable<Review> FindStoreBySite(int SiteID)
    {
         return db.Review
    }

    ////This GET also works and was generated by VS. 
    // GET: api/Review/5
    [ResponseType(typeof(Review))]
    public IHttpActionResult GetReview(int id)
    {
        Review review = db.Review.Find(id);
        if (review == null)
        {
            return NotFound();
        }

        return Ok(review);
    }

По сути, я стремлюсь ограничить то, что возвращает API, только результатами, где SiteID равно значению, которое передается в URL. Я даже не уверен, с чего начать, и переполнение стека в поиске и поиске «что добавить в возврат веб-API» было бесплодным.

Как мне сообщить API, что я хочу вернуть, основываясь на параметре помимо ReviewID?

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

Вот текущий код:

    private ReviewAPIModel db = new ReviewAPIModel();

    // GET: api/Review
    [Route("api/Review")]
    [HttpGet]
    public IQueryable<Review> GetReview()
    {
        return db.Review;
    }

    // GET: api
    [Route("api/Review/site/{siteid}")]
    [HttpGet]
    public IEnumerable<Review> FindStoreBySite(int siteid)
    {
        return db.Review.Where(Review => Review.SiteID == siteid);
    }

    // GET: api/Review/5
    [ResponseType(typeof(Review))]
    public IHttpActionResult GetReview(int id)
    {
        Review review = db.Review.Find(id);
        if (review == null)
        {
            return NotFound();
        }

        return Ok(review);
    }
}

Вот ошибка, которую я получаю:

Multiple actions were found that match the request

Когда я запускаю Google, возникает вопрос: Найдено несколько действий, соответствующих запросу в Web Api

Однако я попробовал ответы там (я подтвердил, что использую Web API V2, и мой файл webapiconfig.cs содержит строку config.MapHttpAttributeRoutes();.

Кроме того, как вы можете видеть в моем коде выше, я включил соответствующую маршрутизацию. Тем не менее, я все еще получаю сообщение об ошибке, сообщающее, что он возвращает два конфликтующих вызова API.

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Чтобы передать параметры в контроллер WebApi, вам нужно добавить атрибут [Route()] к этому контроллеру и пометить часть ссылки, которая используется в качестве атрибута, этим {}.

Чтобы вернуть отзывы, которые соответствуют только переданному параметру, вам нужно использовать LINQ для фильтрации данных.

Вот пример:

[Route("api/getFoo/{id}")]
public IHttpActionResult GetFoo(int id)
{
    return db.Foo.Where(x => x.Id == id);
}

Часть строки {id} представляет идентификатор, который будет в URL вашего браузера: http://localhost:51361/api/getFoo/2. « 2 » в URL IS свойство {id}, которое вы отметили в своем атрибуте [Route("api/getFoo/{id}")].

Я также изменил ваш код:

public class ReviewController : ApiController
{
    ...


    [Route("api/review/site/{siteId}")]
    [HttpGet]
    public IEnumerable<Review> FindStoreBySite(int SiteID)
    {
         return db.Review.Where(review => review.Id == SiteID);
    }

    ...

URL вашего запроса должен выглядеть примерно так: http://localhost:51361/api/review/site?SiteID=2

<Ч />

Поначалу может быть трудно обернуть голову, но со временем вы привыкнете. Это то, как аргументы передаются в параметры действия контроллера.

0 голосов
/ 28 августа 2018

, если вы хотите получить параметры для GET, это похоже на простую перегрузку, но если это сделано, POST с [fromBody], потому что URL находится в теге [Route ("/abc/123/{id}")]

Пример

код

[Route ("/abc/123/{idSite}")]
[HttpGet]
public HttpResponseMessage ControllerIdSite(int IdSite){
   //CODE . . .
   return Request.CreateResponse<int>(HttpStatusCode.OK, IdSite);  
}

вызов

  /abc/123/17

возврат

  17

OR

[Route ("/abc/123")]
[HttpGet]
public HttpResponseMessage ControllerIdSite(int IdSite){
       //CODE . . .
       return Request.CreateResponse<int>(HttpStatusCode.OK, IdSite);  
}

вызов

  /abc/123?IdSite=17

возврат

  17
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...