ASP.Net Web API GET에 여러 매개 변수를 어떻게 전달해야합니까? 그들 사이에있는 레코드를

.Net MVC4 웹 API를 사용하여 RESTful API를 (희망적으로) 구현하고 있습니다. 시스템에 몇 가지 매개 변수를 전달하고 몇 가지 작업을 수행 한 다음 개체 목록을 결과로 반환해야합니다. 특히 나는 두 날짜를 지나서 그들 사이에있는 레코드를 반환합니다. 또한 후속 호출이 시스템에서 재 처리되지 않도록 반환 된 레코드를 추적하고 있습니다.

몇 가지 접근 방식을 고려했습니다.

  1. 매개 변수를 하나의 단일 JSON 문자열로 직렬화하고 API에서 분리합니다.
    http://forums.asp.net/t/1807316.aspx/1

  2. 쿼리 문자열에 매개 변수를 전달하십시오.
    여러 쿼리 매개 변수를 편안한 API에 전달하는 가장 좋은 방법은 무엇입니까?

  3. 경로에서 매개 변수 정의 : api / controller / date1 / date2

  4. 본질적으로 매개 변수가있는 객체를 전달할 수있는 POST를 사용합니다.

  5. 웹 API (현재)가 ODATA를 지원하기 때문에 ODATA 연구 나는 아직이 일을 많이하지 않았으므로 익숙하지 않습니다.

적절한 REST 사례는 데이터를 가져올 때 GET을 사용해야 함을 나타냅니다. 그러나 GET은 nullipotent이어야하며 (부작용은 발생하지 않음) API 시스템에 레코드를 표시하여 부작용을 일으키는 특정 구현이 위반되는지 궁금합니다.

또한 변수 매개 변수를 지원하는 문제로 이어졌습니다. 입력 매개 변수 목록이 변경되면 선택 3에 대한 경로를 많이 정의해야하는 번거 로움이 있습니다. 그리고 매개 변수가 런타임에 정의되면 어떻게 될까요?

어쨌든 내 특정 구현의 경우 어떤 선택이 가장 좋습니까?



답변

이 기록 표시는 무엇을 의미합니까? 이것이 로깅 목적으로 만 사용되는 경우이 리소스에 대한 모든 쿼리를 기록하기 때문에 GET을 사용하고 모든 캐싱을 비활성화합니다. 레코드 마킹에 다른 목적이있는 경우 POST를 사용하십시오. 사용자는 자신의 조치가 시스템에 영향을 미치며 POST 방법이 경고임을 알아야합니다.


답변

가장 쉬운 방법은 단순히 사용하는 것 AttributeRouting입니다.

컨트롤러 내에서 분명합니다. 왜 글로벌 WebApiConfig파일 에서 이것을 원 하십니까?

예:

    [Route("api/YOURCONTROLLER/{paramOne}/{paramTwo}")]
    public string Get(int paramOne, int paramTwo)
    {
        return "The [Route] with multiple params worked";
    }

{}이름은 매개 변수와 일치해야합니다.

간단하지만 이제이 GET인스턴스에서 여러 매개 변수를 처리 하는 별도의 구성 요소가 있습니다.


답변

WebApiConfig항목에 새 경로를 추가하십시오 .

예를 들어,

public IEnumerable<SampleObject> Get(int pageNumber, int pageSize) { ..

더하다:

config.Routes.MapHttpRoute(
    name: "GetPagedData",
    routeTemplate: "api/{controller}/{pageNumber}/{pageSize}"
);

그런 다음 HTTP 호출에 매개 변수를 추가하십시오.

GET //<service address>/Api/Data/2/10 


답변

매개 변수를 전달 해야하는 RESTfull API를 구현해야했습니다. Mark의 첫 번째 예제 “api / controller? start = date1 & end = date2″에서 설명한 것과 같은 스타일로 쿼리 문자열의 매개 변수를 전달하여이 작업을 수행했습니다.

컨트롤러 에서 C #의 URL 분할 팁을 사용 했습니까?

// uri: /api/courses
public IEnumerable<Course> Get()
{
    NameValueCollection nvc = HttpUtility.ParseQueryString(Request.RequestUri.Query);
    var system = nvc["System"];
    // BL comes here
    return _courses;
}

제 경우에는 Ajax를 통해 WebApi를 다음과 같이 호출했습니다.

$.ajax({
        url: '/api/DbMetaData',
        type: 'GET',
        data: { system : 'My System',
                searchString: '123' },
        dataType: 'json',
        success: function (data) {
                  $.each(data, function (index, v) {
                  alert(index + ': ' + v.name);
                  });
         },
         statusCode: {
                  404: function () {
                       alert('Failed');
                       }
        }
   });

이게 도움이 되길 바란다…


답변

http://habrahabr.ru/post/164945/ 에서 우수 솔루션을 찾았습니다 .

public class ResourceQuery
{
   public string Param1 { get; set; }
   public int OptionalParam2 { get; set; }
}

public class SampleResourceController : ApiController
{
    public SampleResourceModel Get([FromUri] ResourceQuery query)
    {
        // action
    }
}


답변

사용 GET을 또는 POST는 명확 의해 설명 @LukLed . 매개 변수를 전달할 수있는 방법과 관련하여 두 번째 접근 방식을 제안하는 것이 좋습니다 ( ODATA대해서도 많이 알지 못함 ).

1. 매개 변수를 하나의 단일 JSON 문자열로 직렬화하고 API에서 분리합니다. http://forums.asp.net/t/1807316.aspx/1

사용자 친화적 이고 SEO 친화적 이지 않습니다

쿼리 문자열에 매개 변수를 전달하십시오. 여러 쿼리 매개 변수를 편안한 API에 전달하는 가장 좋은 방법은 무엇입니까?

이것이 일반적으로 선호되는 접근 방식입니다.

경로의 매개 변수 정의 : api / controller / date1 / date2

이것은 좋은 접근 방식이 아닙니다. 이것은 어떤 것이 하나 date2의 하위 리소스 라고 느끼게하지만 date1그렇지 않습니다. date1date2매개 변수는 모두 쿼리 매개 변수이며 동일한 수준으로 제공됩니다.

간단한 경우에는 이와 같은 URI를 제안합니다.

api/controller?start=date1&end=date2

그러나 개인적으로 아래 URI 패턴을 좋아하지만이 경우 매개 변수를 매핑하기 위해 사용자 지정 코드를 작성해야합니다.

api/controller/date1,date2


답변

여기에 완전히 설명 된대로 매개 변수 바인딩을 사용하십시오 : http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api