
рдпрджрд┐ рдЖрдк рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдмрдирд╛ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдЗрд╕рдХреЗ рдкреНрд░рд▓реЗрдЦрди рдХреА рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдиреЗ рдХреА рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИред
рдмрдбрд╝реА рдХрдВрдкрдирд┐рдпрд╛рдВ рдбреЗрд╡рд▓рдкрд░реНрд╕ рдХреЗ рд▓рд┐рдП рд╡рд┐рд╢реЗрд╖ рдкреЛрд░реНрдЯрд▓ рдмрдирд╛рддреА рд╣реИрдВ рдЬрд╣рд╛рдВ рдЖрдк рдкреНрд░рд▓реЗрдЦрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЪрд░реНрдЪрд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЕрдкрдиреА рдкрд╕рдВрджреАрджрд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдХреНрд▓рд╛рдЗрдВрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рдВрд╕рд╛рдзрди рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди (рд╡рд┐рд╢реЗрд╖рдХрд░ рдкрд░рд┐рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдореЗрдВ рдЬрдм рдПрдкреАрдЖрдИ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рд╡рд┐рдХрд╕рд┐рдд рд╣реЛ рд░рд╣рд╛ рд╣реИ) рдПрдХ рд╢реНрд░рдо-рдЖрдзрд╛рд░рд┐рдд рдорд╛рдорд▓рд╛ рд╣реИред рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЗ рд╕рд╛рде рдкреНрд░рд▓реЗрдЦрди рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдпрд╣ рдХрд╖реНрдЯрдкреНрд░рдж рд╣реИред рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдореЗрдВ рдирд┐рдореНрди рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
- рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдореМрдЬреВрджрд╛ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рд╡рд░реНрдгрд┐рдд рд╣реИ
- рдЬрд╛рдБрдЪрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрдгрд┐рдд рд╕рдм рдХреБрдЫ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕рд╛ рдХрд┐ рдкреНрд░рд▓реЗрдЦрди рдореЗрдВ рдХрд╣рд╛ рдЧрдпрд╛ рд╣реИ
рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк
apiary.io рдХреЗ рд▓реЛрдЧ рджреВрд╕рд░реЗ рдмрд┐рдВрджреБ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддреЗ рд╣реИрдВ, рд╡реЗ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдбреЛрдореЗрди-рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рд╖рд╛ (рдбреАрдПрд╕рдПрд▓) рдореЗрдВ рдкреНрд░рд▓реЗрдЦрди рд▓рд┐рдЦрдиреЗ рдХрд╛ рдЕрд╡рд╕рд░ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдлрд┐рд░, рдЖрдкрдХреЗ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рд░рд┐рдХреЙрд░реНрдб рдЕрдиреБрд░реЛрдз, рдФрд░ рд╕рдордп-рд╕рдордп рдкрд░ рдЬрд╛рдВрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд░реНрдгрд┐рдд рд╕рдм рдХреБрдЫ рд╕рдЪ рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдкрдХреЛ рдЕрднреА рднреА рд╕рднреА рджрд╕реНрддрд╛рд╡реЗрдЬ рд╕реНрд╡рдпрдВ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛, рдФрд░ рдпрд╣ рдмрд╣реБрдд рд╣реА рдЕрдЪреНрдЫрд╛ рд▓рдЧрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдЖрдк рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ рдХреЛрдб рдореЗрдВ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддреЗ рд╣реИрдВред
рдмреЗрд╢рдХ, рдХреЛрдб рд╕реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╡рд┐рд╡рд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдирд┐рдХрд╛рд▓рдиреЗ рдХрд╛ рдХреЛрдИ рд╕рд╛рд░реНрд╡рднреМрдорд┐рдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдПрдХ рд░реВрдкрд░реЗрдЦрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдореЗрдВ рдорд╛рд░реНрдЧ рдФрд░ рдХреНрд╡реЗрд░реА рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рд╕рдВрдмрдВрдз рдореЗрдВ рд╕рдордЭреМрддреЗ рд╣реИрдВ, рддреЛ рдРрд╕реА рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛,
рдПрдХ рд░рд╛рдп рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХрд╛ рд╡рд┐рд╡рд░рдг рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ рдФрд░ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рд╕реНрд╡рдпрдВ рд╕рдордЭрдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ REST API рдХреЗ рд╕рд╛рде рдХреИрд╕реЗ рдХрд╛рдо рдХрд┐рдпрд╛ рдЬрд╛рдП, рдХреЗрд╡рд▓ рд░реВрдЯ рд╕рдВрд╕рд╛рдзрди рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЧрдП рдореАрдбрд┐рдпрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ URL рдХреЛ рдЬрд╛рдирддреЗ рд╣реБрдПред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдПрдХ рднреА рдЧрдВрднреАрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдПрдкреАрдЖрдИ рдирд╣реАрдВ рджреЗрдЦрд╛ рд╣реИ рдЬреЛ рдЗрд╕ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рд▓реЗрдЦрди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд░рд╛рд░реВрдк рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА,
рдбрдмреНрд▓реНрдпреВрдПрд╕рдбреАрдПрд▓ рдЬреИрд╕реА рдХреБрдЫ, рд▓реЗрдХрд┐рди
рд░реАрд╕реНрдЯ рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ рд╡рд┐рд╡рд░рдг рдХреЗ рд╕рд╛рдеред
рдХрдИ рд╡рд┐рдХрд▓реНрдк рд╣реИрдВ:
- WADL - рд╡рд░реНрдгрди рдХреЗ рд▓рд┐рдП XML рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдлреИрд╢рдиреЗрдмрд▓ рдирд╣реАрдВ рд░рд╣рд╛ рд╣реИред
- рд╕реНрд╡реИрдЧрд░ рдХреА рдпреБрдХреНрддрд┐ - рд╕реНрд╡реИрдЧрд░ рдлреНрд░реЗрдорд╡рд░реНрдХ рдореЗрдВ рдкреНрд░рдпреБрдХреНрдд рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк, рдЬреЛрд╕рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдХрдИ рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреЗ рд▓рд┐рдП рдЬрдирд░реЗрдЯрд░ рд╣реИрдВ рдФрд░ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкрд░ рдкреНрд░рд▓реЗрдЦрди рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡реЗрджрди рд╣реИред
- Google API рдЦреЛрдЬ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ - рдПрдХ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреНрд░рд╛рд░реВрдк рдЬреЛ Google рдЕрдкрдиреА рдХреБрдЫ рд╕реЗрд╡рд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред
- I \ O рдбреЙрдХреНрд╕ Google рдХреЗ рд╕рдорд╛рди рдПрдХ рдФрд░ рдкреНрд░рд╛рд░реВрдк рд╣реИред
- рдЦреБрдж рдХрд╛ рдкреНрд░рд╛рд░реВрдкред
рдореИрдВрдиреЗ рдмрд╛рдж рд╡рд╛рд▓рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреА рд╕рднреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдЬреИрд╕реЗ рдХрд┐ рдЖрдкрдХрд╛ рдЕрдкрдирд╛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг / рдкреНрд░рд╛рдзрд┐рдХрд░рдг, рдкреНрд░рддрд┐ рдпреВрдирд┐рдЯ рд╕рдордп рдЕрдиреБрд░реЛрдзреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рдкрд░ рдкреНрд░рддрд┐рдмрдВрдз рдЖрджрд┐ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореБрдЭреЗ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ (рд▓реЗрдХрд┐рди рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ?) рдПрдХ рдкреНрд░рд╛рдХреГрддрд┐рдХ рднрд╛рд╖рд╛ рдореЗрдВ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдФрд░ рд╡рд┐рд╡рд░рдг рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдкрд╕рдВрдж рдирд╣реАрдВ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рд╕рднреА рд╕рдорд╛рдзрд╛рдиреЛрдВ рдореЗрдВ рд╣реЛрддрд╛ рд╣реИред
рдкреНрд░рд▓реЗрдЦрди рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдкреАрдЖрдИ рдХреЗ рд▓рд┐рдП рдЧреНрд░рд╛рд╣рдХ рдХреЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реЗ рдЧреНрд░рд╛рд╣рдХ рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реЛрдВрдЧреЗ, рдФрд░ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдкреАрдЖрдИ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди
рдЖрдЧреЗ рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реЛрдЧрд╛ рдЬреЛ
ASP.NET WebAPI рд╕реЗ рджреВрд░ рд╣реИрдВред рддреЛ, рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдкрд░ рдПрдХ рдПрдкреАрдЖрдИ рд╣реИ рдФрд░ рдЖрдк рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рдПрдХ рд╡рд┐рд╢реЗрд╖рддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдЬреЛ рдХреНрд░рд┐рдпрд╛рдУрдВ рдФрд░ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░реЗрдЧреА рдЬрд┐рдирдХреЗ рд╡рд┐рд╡рд░рдг рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдореЗрдВ рдЧрд┐рд░реЗрдВрдЧреЗ:
[AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, AllowMultiple = false)] public class MetaAttribute : Attribute { }
рдЕрдм рдПрдХ рдХрдВрдЯреНрд░реЛрд▓рд░ рдмрдирд╛рддреЗ рд╣реИрдВ рдЬреЛ рдЯрд╛рдЗрдк рд╕реНрдХреАрдореЛрдВ рдХреЛ рд▓реМрдЯрд╛рдПрдЧрд╛ (рдХреБрдЫ рдРрд╕рд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐
json рд╕реНрдХреАрдорд╛ , рд▓реЗрдХрд┐рди рд╕рд┐рдВрдкрд▓), рдЬреЛ рдХрд┐ рдПрдкреАрдЖрдИ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВ:
public class TypeMetadataController : ApiController { private readonly Assembly typeAssembly; public TypeMetadataController(Assembly typeAssembly) { this.typeAssembly = typeAssembly; } [OutputCache] public IEnumerable<ApiType> Get() { return this.typeAssembly .GetTypes() .Where(t => Attribute.IsDefined(t, typeof(MetaAttribute))) .Select(GetApiType); } [OutputCache] public ApiType Get(String name) { var type = this.Get().FirstOrDefault(t => t.Name == name); if (type == null) throw new ResourceNotFoundException<ApiType, String>(name); return type; } ApiType GetApiType(Type type) { var dataContractAttribute = type.GetCustomAttribute<DataContractAttribute>(); return new ApiType { Name = dataContractAttribute != null ? dataContractAttribute.Name : type.Name, DocumentationArticleId = dataContractAttribute != null ? dataContractAttribute.Name : type.Name, Properties = type.GetMembers() .Where(p => p.IsDefined(typeof(DataMemberAttribute), false)) .Select(p => { var dataMemberAttribute = p.GetCustomAttributes(typeof (DataMemberAttribute), false).First() as DataMemberAttribute; return new ApiTypeProperty { Name = dataMemberAttribute != null ? dataMemberAttribute.Name : p.Name, Type = ApiType.GetTypeName(GetMemberUnderlyingType(p)), DocumentationArticleId = String.Format("{0}.{1}", dataContractAttribute != null ? dataContractAttribute.Name : type.Name, dataMemberAttribute != null ? dataMemberAttribute.Name : p.Name) }; } ).ToList() }; } static Type GetMemberUnderlyingType(MemberInfo member) { switch (member.MemberType) { case MemberTypes.Field: return ((FieldInfo)member).FieldType; case MemberTypes.Property: return ((PropertyInfo)member).PropertyType; default: throw new ArgumentException("MemberInfo must be if type FieldInfo or PropertyInfo", "member"); } } }
рдпрд╣ рдмрд╣реБрдд рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд╣реИ рдХрд┐ рдкреНрд░рдХрд╛рд░ рд░рдирдЯрд╛рдЗрдо рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдВрдЧреЗ, рдЗрд╕рд▓рд┐рдП рд╣рдо рдкрд░рд┐рдгрд╛рдо рдХреЛ рдХреИрд╢ рдХрд░рддреЗ рд╣реИрдВред
API рджреНрд╡рд╛рд░рд╛ рд╣реИрдВрдбрд▓ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк
IApiExplorer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
public class ResourceMetadataController : ApiController { private readonly IApiExplorer apiExplorer; public ResourceMetadataController(IApiExplorer apiExplorer) { this.apiExplorer = apiExplorer; } [OutputCache] public IEnumerable<ApiResource> Get() { var controllers = this.apiExplorer .ApiDescriptions .Where(x => x.ActionDescriptor.ControllerDescriptor.GetCustomAttributes<MetaAttribute>().Any() || x.ActionDescriptor.GetCustomAttributes<MetaAttribute>().Any()) .GroupBy(x => x.ActionDescriptor.ControllerDescriptor.ControllerName) .Select(x => x.First().ActionDescriptor.ControllerDescriptor.ControllerName) .ToList(); return controllers.Select(GetApiResourceMetadata).ToList(); } ApiResource GetApiResourceMetadata(string controller) { var apis = this.apiExplorer .ApiDescriptions .Where(x => x.ActionDescriptor.ControllerDescriptor.ControllerName == controller && ( x.ActionDescriptor.GetCustomAttributes<MetaAttribute>().Any() || x.ActionDescriptor.ControllerDescriptor.GetCustomAttributes<MetaAttribute>().Any() ) ).GroupBy(x => x.ActionDescriptor); return new ApiResource { Name = controller, Requests = apis.Select(g => this.GetApiRequest(g.First(), g.Select(d => d.RelativePath))).ToList(), DocumentationArticleId = controller }; } ApiRequest GetApiRequest(ApiDescription api, IEnumerable<String> uris) { return new ApiRequest { Name = api.ActionDescriptor.ActionName, Uris = uris.ToArray(), DocumentationArticleId = String.Format("{0}.{1}", api.ActionDescriptor.ControllerDescriptor.ControllerName, api.ActionDescriptor.ActionName), Method = api.HttpMethod.Method, Parameters = api.ParameterDescriptions.Select( parameter => new ApiRequestParameter { Name = parameter.Name, DocumentationArticleId = String.Format("{0}.{1}.{2}", api.ActionDescriptor.ControllerDescriptor.ControllerName, api.ActionDescriptor.ActionName, parameter.Name), Source = parameter.Source.ToString().ToLower().Replace("from",""), Type = ApiType.GetTypeName(parameter.ParameterDescriptor.ParameterType) }).ToList(), ResponseType = ApiType.GetTypeName(api.ActionDescriptor.ReturnType), RequiresAuthorization = api.ActionDescriptor.GetCustomAttributes<RequiresAuthorization>().Any() }; } }
рд╕рднреА рд▓реМрдЯрд╛рдП рдЧрдП рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ рдПрдХ рдлрд╝реАрд▓реНрдб рд╣реИ
`DocumentationArticleId` - рдпрд╣ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рд╕реЗ рдЕрд▓рдЧ рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдП рдЧрдП рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рд▓реЗрдЦрди рд▓реЗрдЦ рдХрд╛ рдкрд╣рдЪрд╛рдирдХрд░реНрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ json рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВред
рдЕрдм рд╡рд╣ рд╕рдм рдХреБрдЫ рд╣реИ рдЬреЛ рдкреНрд░рд▓реЗрдЦрди рдХреЛ рджрд┐рдЦрд╛рдиреЗ рдФрд░ рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ-рдкреЗрдЬ рдХрд╛ рдЖрд╡реЗрджрди рдХрд░рдирд╛ рд╣реИ:

рдмрд╛рдХреА рдХреЛрдб
GitHub рдкрд░ рдЙрдкрд▓рдмреНрдз
рд╣реИ ред