25 |ルーティングおよびエンドポイント:もあなたのWeb APIを計画する方法
存在しているASP.NET MVCフレームワーク内のシステムのルーティングは、ASP.NETコアフレームワークの内部に改善されています
ルーティングシステムの中心的役割は、URLとコントローラのアプリケーションとの間のマッピングの対応をいいます
このマッピング関係は、実際には2つの効果があります。
図1に示すように、上記URLは、コントローラに対応する対応するアクションにマップされ
2、コントローラ名とアクション名によればURLを生成します
.NETのコアは、ルーティング登録の2つの方法があります。
1、ルーティングテンプレートの方法
2、RouteAttribute方法
シーンに適用されたどちらの方法でも同じではありません
伝統的な方法の前に道をテンプレートルーティング、それがページのWeb MVC構成として使用することができます
それを行うにはRouteAttributeの方法を使用するときに今のWeb APIの定義は、より多くの建築の分離の終了前と後に使用します
ルーティング定義されたプロセスの途中で、経路登録、重要な特徴があり、ルーティングの制約であるルートを照合する方法であります
いくつかの簡単な制約があります。
1、型制約
2、制約の範囲
3、正規表現
4、必須かどうか
5、カスタムIRouteConstraint
さらにルーティングキーシステムは、逆ルートURLアドレスに生成された情報に基づいて、2つのクラスを提供します
1、LinkGenerator
2、IUrlHelper
MVCHelperの内部のようなMVCフレームワークとIUrlHelper
LinkGeneratorリンクは新しいオブジェクトを生成するために提供されると、それは、任意の位置でオブジェクトにコンテナ内から取得した後、必要なURLアドレスを生成することができ
次に、コードを見ます
ソースリンク:
https://github.com/witskeeper/geektime/tree/master/samples/RoutingDemo
グループ闊歩コードを登録するには、ここで、プレゼンテーションを容易にするために、ウェブAPIの出力が闊歩の視覚的なインターフェイスを介して出てくるだろう
ASP.NETコアに対応する闊歩パケットの紹介
Swashbuckle.AspNetCore
SWAGGERに注入されたコードのドキュメントの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などの方法により、
プログラムを起動し、あなたは5つのインタフェースの合計を見ることができます
最初のインターフェイスは、クリック入力パラメータの後にそれを試して、達成するために私たちをカスタムバインドされます
20の第2のインタフェース制約最大
5、実行を入力します。
応答コードが200であることがわかります
25を入力し、実行
あなたはそれがルートを照合することができなかったと述べ、応答コードが404で見ることができます
インタフェースは、NULL値を入力する方法がないため、第三のパラメータは、フロントエンドの検証、必要とされます
第四のインターフェイスは、正規表現に沿って3桁、入力234、応答コード200で始まります
この作品は、ある非営利- -同一条件許諾4.0の国際ライセンス契約クリエイティブ・コモンズのライセンスのために。
転載、使用、再投稿へようこそ、しかし鄭Ziming(リンクを含む:http://www.cnblogs.com/MingsonZheng/)によって署名された記事を保つようにしてください、商業目的のために使用してはならない、紙のライセンス変更に基づいて、同じ作業を公開するようにしてください。
ご質問があれば、私に連絡してください([email protected])。