>

GET 요청에서 Query 매개 변수에 대한 지원을 엔드 포인트 /resources 에 추가하는 방법을 알고 있습니다 예를 들어. 다음과 같습니다.

[HttpGet]
public async Task<IHttpActionResult> GetAll([FromUri] QueryData queryData) {
     //... Do some stuff
}

내 예에서는 QueryData  지원되는 모든 검색어 매개 변수가 포함 된 클래스입니다.

public class QueryParam {
    public int Page { get; set; }
    public int Size { get; set; }
}

그래서 엔드 포인트를 호출 할 수 있습니다 : /resources?page=2&size=4 매개 변수를 성공적으로 검색하십시오.

그러나, 엔드 포인트에서 동일하지만 엔드 포인트에서 수행하는 작업은 무엇입니까? ??

/resources/2  URL의 세그먼트이며 2 를 지정합니다.  자원의.

현재이 방법을 다음과 같이 처리하고 있습니다 :

id

이것은 잘 작동하지만 다음과 같이 수정하려고했습니다 :

[HttpGet]
public async Task<IHttpActionResult> Get(int id) {
   //Do some stuff...
}

다른 방법에서와 같이 작동하길 바랍니다. 그러나 그렇지 않습니다. 아마도 [HttpGet] public async Task<IHttpActionResult> Get(int id, [FromUri] QueryData queryData) { //Do some stuff... } 때문에 검색어 매개 변수로 검색하지 않고 URL 경로의 일부입니다.

이러한 URL에 쿼리 매개 변수를 추가하고 id 를 모두 검색 할 수 있습니까  그리고 그 매개 변수?

엔드 포인트를 호출 할 수 있기를 기대합니다 : id

/resources/2?lang=en

  • 답변 # 1

    원하는 것을 달성하는 한 가지 방법은 id 를 읽는 것입니다  다음과 같이 수동으로 :

    [HttpGet]
    public async Task<IHttpActionResult> Get(int id, [FromUri]QueryData queryData) {
        id = RouteData.Values["id"];
    }
    
    

    또는

    [HttpGet]
    public async Task<IHttpActionResult> Get([FromUri]QueryData queryData) {
        var id = RouteData.Values["id"];
    }
    
    

    MVC가 모호함에 대해 소리 치면 다음과 같은 경로 제약 조건을 추가하십시오.

    routes.MapRoute(
        "Product", 
        "Product/{productId}", 
        new {controller="Product", action="Details"}, 
        new {productId = @"\d+" }
    );
    
    

    다른 방법은 ID를 QueryData 속성으로 추가하는 것입니다. 그것을 채울 수 있습니다!

  • 답변 # 2

    웹 코드 2.2를 다음 코드로 라우트 값과 쿼리 문자열 값을 올바르게 구문 분석 할 수있었습니다 :

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Net.Http;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Web.Http;
    using WebAPITest.Models;
    namespace WebAPITest.Controllers
    {
        public class ValuesController : ApiController
        {   
            // GET api/values/5
            public async Task<IHttpActionResult> Get(int id, [FromUri] QueryParam queryData)
            {
                return Ok("value");
            }    
        }
    }
    
    

    모델 :

    using System;
    namespace WebAPITest.Models
    {
        public class QueryParam
        {
            public int Page { get; set; }
            public int Size { get; set; }
        }
    }
    
    

    IHttpActionResult 를 사용하도록 기본ValuesController를 조정했습니다.  문자열 대신. 라우트를 구별하려면 속성 라우트를 추가하고 각 조치를 각각의 HTTP 메소드로 장식 할 수 있습니다. 컨트롤러 작업 내에서 경로를 직접 수정하거나 추가 매개 변수 파싱을 수행 할 필요가 없습니다.

관련 자료

  • 이전 java - ResultSet이 닫힌 후 작업이 허용되지 않음, mysql
  • 다음 numbers - 우리는 어떻게 총계를 결정할 수 있습니까? 하이브 테이블 용 버킷