[C#] ASP.NET 웹 API의 선택적 쿼리 문자열 매개 변수

다음 WebAPI 메소드를 구현해야합니다.

/api/books?author=XXX&title=XXX&isbn=XXX&somethingelse=XXX&date=XXX

모든 쿼리 문자열 매개 변수는 null 일 수 있습니다. 즉, 호출자는 0에서 5 개의 매개 변수를 모두 지정할 수 있습니다.

MVC4 베타 에서는 다음을 수행했습니다.

public class BooksController : ApiController
{
    // GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
    public string GetFindBooks(string author, string title, string isbn, string somethingelse, DateTime? date)
    {
        // ...
    }
}

MVC4 RC는 더 이상이 동작을하지 않습니다. 5 개 미만의 매개 변수를 지정하면 다음과 같이 응답합니다 404.

컨트롤러 ‘도서’에서 요청과 일치하는 조치가 없습니다.

URL 라우팅에서 선택적 매개 변수를 지정하지 않고 이전과 같이 동작하도록하는 올바른 메소드 서명은 무엇입니까?



답변

이 문제는 MVC4 정식 릴리스에서 수정되었습니다. 이제 할 수있는 일 :

public string GetFindBooks(string author="", string title="", string isbn="", string  somethingelse="", DateTime? date= null)
{
    // ...
}

모든 것이 즉시 작동합니다.


답변

vijay가 제안한대로 여러 매개 변수를 단일 모델로 전달할 수 있습니다. FromUri 매개 변수 속성을 사용할 때 GET에 적용됩니다. 이것은 WebAPI에게 쿼리 매개 변수에서 모델을 채우도록 지시합니다.

그 결과 단 하나의 매개 변수만으로보다 깔끔한 컨트롤러 작업이 가능합니다. 자세한 내용은 다음을 참조 하십시오 : http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

public class BooksController : ApiController
  {
    // GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
    public string GetFindBooks([FromUri]BookQuery query)
    {
      // ...
    }
  }

  public class BookQuery
  {
    public string Author { get; set; }
    public string Title { get; set; }
    public string ISBN { get; set; }
    public string SomethingElse { get; set; }
    public DateTime? Date { get; set; }
  }

속성이 충돌하지 않는 한 여러 매개 변수도 지원합니다.

// GET /api/books?author=tolk&title=lord&isbn=91&somethingelse=ABC&date=1970-01-01
public string GetFindBooks([FromUri]BookQuery query, [FromUri]Paging paging)
{
  // ...
}

public class Paging
{
  public string Sort { get; set; }
  public int Skip { get; set; }
  public int Take { get; set; }
}

업데이트 :
값을 선택적으로 사용하려면 모델 속성에 참조 유형 또는 nullable (예 : int?)을 사용해야합니다.


답변

아래와 같은 모든 매개 변수에 초기 기본값 사용

public string GetFindBooks(string author="", string title="", string isbn="", string  somethingelse="", DateTime? date= null)
{
    // ...
}


답변

여러 매개 변수를 전달하려는 경우 여러 매개 변수를 전달하는 대신 모델을 만들 수 있습니다.

매개 변수를 전달하지 않으려는 경우 건너 뛸 수 있으며 코드가 깔끔하고 깔끔하게 보입니다.


답변

optional‘로 선언되지 않은 매개 변수에는 기본값을 제공 할 수 없습니다

 Function GetFindBooks(id As Integer, ByVal pid As Integer, Optional sort As String = "DESC", Optional limit As Integer = 99)

당신의 WebApiConfig

 config.Routes.MapHttpRoute( _
          name:="books", _
          routeTemplate:="api/{controller}/{action}/{id}/{pid}/{sort}/{limit}", _
          defaults:=New With {.id = RouteParameter.Optional, .pid = RouteParameter.Optional, .sort = UrlParameter.Optional, .limit = UrlParameter.Optional} _
      )


답변