25 | 라우팅 및 엔드 포인트 : 잘 계획하는 방법에 웹 API
존재하고있다 ASP.NET MVC 프레임 워크 라우팅 시스템, ASP.NET는 코어 프레임 워크 내부에 개선 된
라우팅 시스템의 중심 역할은 URL과 컨트롤러의 응용 프로그램 사이의 매핑 대응을 말한다
이 매핑 관계는 실제로 두 가지 효과가 있습니다 :
도 1은, 상기 URL은 해당 작용 컨트롤러에 대응하는 매핑 된
2 컨트롤러와 액션 이름에 따라하는 URL을 생성합니다
.NET 코어 라우팅 등록의 두 가지 방법을 제공합니다 :
1, 라우팅 템플릿 방법
2, RouteAttribute 방법
현장에 적용된 두 가지 방법 모두 동일하지 않습니다
전통적인 방법 전에 길을 템플릿 라우팅, 그것은 페이지 웹 MVC 구성으로 사용할 수 있습니다
이제, 웹 API의 정의는 그것을 할 RouteAttribute에게 방법을 사용할 때 더 전에 건축의 분리의 종료 후 사용
라우팅 정의 된 과정, 경로 등록의 중간에,이, 중요한 기능은 라우팅 제약입니다 경로와 일치하는 방법입니다
간단한 몇 가지 제약 조건이 있습니다 :
1 형 제약
(2) 제약의 범위
3, 정규 표현식
4, 필수 여부
5, 사용자 정의 IRouteConstraint
또한 라우팅 키 시스템은 역 경로의 URL 주소를 생성 된 정보를 기반으로, 두 개의 클래스를 제공합니다
1 LinkGenerator
2, IUrlHelper
MVC와 IUrlHelper는 MVCHelper의 내부처럼 프레임 워크
그리고 LinkGenerator가 링크가 새로운 객체를 생성하기 위해 제공되며, 이는 임의의 위치에서 객체 용기 내부로부터 수득하고 필요한 URL 주소를 생성 할 수있다
다음 코드를 살펴
소스 링크 :
https://github.com/witskeeper/geektime/tree/master/samples/RoutingDemo
그룹 자신감 코드를 등록하려면 여기, 프레젠테이션을 용이하게하기 위해, 웹 API 출력은 자신감의 시각적 인터페이스를 통해 나올 것
ASP.NET 코어에 대응 자신감 패킷 등장
Swashbuckle.AspNetCore
자신감에 삽입 된 코드 문서 XML 문서
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
c.IncludeXmlComments(xmlPath);
});
자신감 미들웨어 내부에 등록
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1");
});
이 방법은 인터페이스에 자신감 인터페이스를보고, 우리의 API가 정의 탐색 할 수 있습니다
경로의 정의에 이어 OrderController
namespace RoutingDemo.Controllers
{
[Route("api/[controller]/[action]")]// RouteAttribute 的方式
[ApiController]
public class OrderController : ControllerBase
{
/// <summary>
///
/// </summary>
/// <param name="id">必须可以转为long</param>
/// <returns></returns>
[HttpGet("{id:MyRouteConstraint}")]// 这里使用了自定义的约束
public bool OrderExist(object id)
{
return true;
}
/// <summary>
///
/// </summary>
/// <param name="id">最大20</param>
/// <returns></returns>
[HttpGet("{id:max(20)}")]// 这里使用了 Max 的约束
public bool Max(long id)
{
return true;
}
/// <summary>
///
/// </summary>
/// <param name="ss">必填</param>
/// <returns></returns>
[HttpGet("{name:required}")]// 必填约束
public bool Reque(string name)
{
return true;
}
/// <summary>
///
/// </summary>
/// <param name="number">以三个数字开始</param>
/// <returns></returns>
[HttpGet("{number:regex(^\\d{{3}}$)}")]// 正则表达式约束
public bool Number(string number)
{
return true;
}
}
}
위의 사용 사용자 정의 제약 MyRouteConstraint
namespace RoutingDemo.Constraints
{
public class MyRouteConstraint : IRouteConstraint
{
public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection)
{
if (RouteDirection.IncomingRequest == routeDirection)
{
var v = values[routeKey];
if (long.TryParse(v.ToString(), out var value))
{
return true;
}
}
return false;
}
}
}
등록 MyRouteConstraint
services.AddRouting(options =>
{
options.ConstraintMap.Add("MyRouteConstraint", typeof(MyRouteConstraint));
});
이 발효 전에 필요 미들웨어 등록 UseEndpoints의 MapControllers의 사용 UseEndpoints 위치를 주입
app.UseEndpoints(endpoints =>
{
// 使用 RouteAttribute
endpoints.MapControllers();
});
이 주입 경로 들어오는 OrderController 같은 방법으로
프로그램을 시작, 다섯 인터페이스의 전체를 볼 수 있습니다
첫 번째 인터페이스는 사용자 정의이다 바인드 우리는 클릭, 달성 입력 매개 변수 후에 그것을 밖으로 시도
(20)의 제 2 계면 제약 최대
5, 실행을 입력
이 응답 코드가 200 인 것을 알 수있다
(25)를 입력, 실행
당신은 응답 코드 (404)입니다 볼 수 있습니다, 그것은 경로를 일치에 실패 상기
상기 인터페이스는, NULL 값을 입력하는 방법은, 전단의 인증이 없기 때문에 세번째 파라미터가 필요
네 번째 인터페이스는 일반 식 라인 세 자리, 입력 (234), 응답 코드 (200)로 시작
이 작품은 비영리 - - 동일 조건 변경 허락 4.0 국제 라이센스 계약 크리에이티브 커먼즈 저작자 표시 라이선스합니다.
무단 전재, 사용, 재 게시에 오신 것을 환영합니다,하지만 (링크가 포함 : http://www.cnblogs.com/MingsonZheng/)를 청 Ziming에 의해 서명 된 문서를 유지하기 위해 반드시 상업적인 목적으로 사용할 수 없다, 용지 사용권 변경에 따라 같은 일을 게시해야 .
당신은 질문이있는 경우에는, 저에게 연락 주시기 바랍니다 ([email protected]).