创建自定义 Http 方法
Create a custom Http method
是否可以通过覆盖 HttpMethodAttribute
class 并指定我们自己的 supportedMethods
来创建我们自己的 HTTP 方法?
实际上,根据不同的情况,我们需要return View as complete view with the _Layout,有时我们只需要return 这个view的PartialView。所以我的想法是放置一个自定义属性,比如 [HttpPartial]
这样客户端会根据请求中使用的方法来判断它是想要完整视图(GET 方法)还是部分视图(PARTIAL 方法) .
相反,我会建议类似于 fiddler 的东西...
是的,APIs 是可能的。您可以 look at how the HttpGetAttribute
is implemented,并为自定义方法推出自己的方法,将“get”替换为“foo”:
/// <summary>
/// Identifies an action that supports the HTTP FOO method.
/// </summary>
public class HttpFooAttribute : HttpMethodAttribute
{
private static readonly IEnumerable<string> _supportedMethods = new[] { "FOO" };
/// <summary>
/// Creates a new <see cref="HttpFooAttribute"/>.
/// </summary>
public HttpFooAttribute()
: base(_supportedMethods)
{
}
/// <summary>
/// Creates a new <see cref="HttpFooAttribute"/> with the given route template.
/// </summary>
/// <param name="template">The route template. May not be null.</param>
public HttpFooAttribute(string template)
: base(_supportedMethods, template)
{
if (template == null)
{
throw new ArgumentNullException(nameof(template));
}
}
}
然后将其应用于您的 API 操作方法:
[Route("Bar")]
public class BarApiController : Controller
{
[HttpFoo("/"]
public IActionResult Foo()
{
return Ok("Foo");
}
}
现在您可以请求FOO https://your-api:44312/bar/
。
这对于返回视图的操作不太有用,因为 any HTML-rendering user agent only lets the user initiate GET
or POST
requests 通过超链接和表单。
您可以通过 XMLHttpRequest
或 fetch()
发送更多方法,但需要更多文档和客户端自定义。
不要破坏或阻碍网络,不要为您的应用程序逻辑发明新的 HTTP 方法。只需使用查询字符串参数或将其发送到您的正文中:&renderAsPartial=true
、{ "renderAsPartial": true }
.
有关如何注册新的 HTTP 方法,请参阅 the IANA's Hypertext Transfer Protocol (HTTP) Method Registry for existing methods and see RCF 7231 section 8.1。
是否可以通过覆盖 HttpMethodAttribute
class 并指定我们自己的 supportedMethods
来创建我们自己的 HTTP 方法?
实际上,根据不同的情况,我们需要return View as complete view with the _Layout,有时我们只需要return 这个view的PartialView。所以我的想法是放置一个自定义属性,比如 [HttpPartial]
这样客户端会根据请求中使用的方法来判断它是想要完整视图(GET 方法)还是部分视图(PARTIAL 方法) .
相反,我会建议类似于 fiddler 的东西...
是的,APIs 是可能的。您可以 look at how the HttpGetAttribute
is implemented,并为自定义方法推出自己的方法,将“get”替换为“foo”:
/// <summary>
/// Identifies an action that supports the HTTP FOO method.
/// </summary>
public class HttpFooAttribute : HttpMethodAttribute
{
private static readonly IEnumerable<string> _supportedMethods = new[] { "FOO" };
/// <summary>
/// Creates a new <see cref="HttpFooAttribute"/>.
/// </summary>
public HttpFooAttribute()
: base(_supportedMethods)
{
}
/// <summary>
/// Creates a new <see cref="HttpFooAttribute"/> with the given route template.
/// </summary>
/// <param name="template">The route template. May not be null.</param>
public HttpFooAttribute(string template)
: base(_supportedMethods, template)
{
if (template == null)
{
throw new ArgumentNullException(nameof(template));
}
}
}
然后将其应用于您的 API 操作方法:
[Route("Bar")]
public class BarApiController : Controller
{
[HttpFoo("/"]
public IActionResult Foo()
{
return Ok("Foo");
}
}
现在您可以请求FOO https://your-api:44312/bar/
。
这对于返回视图的操作不太有用,因为 any HTML-rendering user agent only lets the user initiate GET
or POST
requests 通过超链接和表单。
您可以通过 XMLHttpRequest
或 fetch()
发送更多方法,但需要更多文档和客户端自定义。
不要破坏或阻碍网络,不要为您的应用程序逻辑发明新的 HTTP 方法。只需使用查询字符串参数或将其发送到您的正文中:&renderAsPartial=true
、{ "renderAsPartial": true }
.
有关如何注册新的 HTTP 方法,请参阅 the IANA's Hypertext Transfer Protocol (HTTP) Method Registry for existing methods and see RCF 7231 section 8.1。