我有一个 REST Web API,它接收一些 apiKey
。 GET
的示例此 Web API 的操作是:
public HttpResponseMessage Get(int id, string apiKey)
我的 Web API 中定义的唯一路由是:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
现在,有一个使用此 Web API 的 Web 客户端,它发送 apiKey
在执行 GET
时的查询字符串中请求。
据我了解,最好发送apiKey
在请求的授权 header 中。
有人可以告诉我如何做 GET
请求并输入 apiKey
在授权 header 中,并且仍然落在正确的操作方法中(我的意思是上面的 Get
方法)?
最佳答案
您可以欺骗 Web api,使其认为授权 header 是来自带有小消息处理程序的查询字符串的参数。
public class ApiKeyHandler : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
var routeData = request.GetRouteData();
if (request.Headers.Authorization != null && !routeData.Values.ContainsKey("apikey"))
{
routeData.Values.Add("apikey",request.Headers.Authorization.Parameter);
}
return base.SendAsync(request, cancellationToken);
}
}
此处理程序将获取从 URI 中提取的路由数据,如果您传递授权 header ,它将获取参数值并将其设置为 apikey
路由参数。
授权 header 需要类似于
Authorization: apikey 12323434234234234
您可以通过将此链接添加到 WebApiConfig.Register 方法中来安装消息处理程序。
config.MessageHandlers.Add(new ApiKeyHandler());
顺便说一句,您可以使用这样的处理程序来实际验证 ApiKey。这样,您实际上不需要将 apikey 传递给您的操作方法。如果 ApiKey 不好,只需直接从处理程序返回 401。
关于jquery - 将授权 header 中的 api key 发送到 REST Web API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21868354/