mvc web api 关于post参数怎么接收,求教

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mvc web api 关于post参数怎么接收,求教相关的知识,希望对你有一定的参考价值。

参考技术A // POST api/values
public void Post(string value)


FromBody只能一次,有多个参数,要自己包装下。
[HttpPost]
public int AddProduct([FromBody] Product product)

return 1;


public class Product

public string id get; set;
public string name get; set;
本回答被提问者和网友采纳

在自定义授权 MVC4 Web Api 中访问 post 或 get 参数

【中文标题】在自定义授权 MVC4 Web Api 中访问 post 或 get 参数【英文标题】:Accessing post or get parameters in custom authorization MVC4 Web Api 【发布时间】:2012-09-30 19:08:58 【问题描述】:

是否可以通过 HttpActionContext 对象访问 post 或获取参数?

我有一组传感器,可将数据记录到提供 REST api 的 Web 服务器。我想通过让传感器在数据中包含它们的硬件 id 来引入某种身份验证/授权,然后在数据库中查找该 id 是否存在。由于 API 提供了许多 Web api 操作方法,因此我最好使用自定义授权属性

public class ApiAuthorizationFilter : AuthorizeAttribute

    protected override bool IsAuthorized(HttpActionContext actionContext)
    
        return false;
    

如何从 actionContext 访问发布/获取数据?

编辑: POST 示例

POST /Api/api/ActionMethod/ HTTP/1.1\r\n
Content-Type: application/json\r\n
Host: localhost\r\n
Accept: */*\r\n
Content-Length:52\r\n
\r\n
"Id": '121a222bc', "Time": '2012-02-02 12:00:00'\r\n

祝你有美好的一天!

【问题讨论】:

【参考方案1】:

由于其性质,AuthoriseAttribute 看起来像是在模型绑定器和参数绑定运行之前在管道中调用的。当您访问 Request.Content 并从中读取时,您也会遇到问题...这只能是done once,如果您打算在您的 auth 属性中尝试它,您可能会破坏 mediaTypeFormater...

在 WebAPI 中,请求正文(HttpContent)可能是只读、无限、非缓冲、不可回退的流。

更新 有不同的方式来指定执行上下文...http://msdn.microsoft.com/en-us/library/system.web.http.filters.filterscope(v=vs.108).aspx。 AuthoriseAttribute 是“全局”的,因此访问操作信息的时间过早。

如果您想要访问模型和参数,您可以稍微改变您的方法并改用 OnActionExecuting 过滤器(“Action”过滤器范围),并根据您的验证抛出 401 或 403。

此过滤器稍后在执行过程中调用,因此您可以完全访问绑定的数据。

下面很简单的例子:

public class ApiAuthorizationFilter : ActionFilterAttribute

    public override void OnActionExecuting(HttpActionContext actionContext)
    
        Foo model = (Foo)actionContext.ActionArguments["model"];
        string param1 = (string)actionContext.ActionArguments["param1"];
        int param2 = (int)actionContext.ActionArguments["param2"];

        if (model.Id != "1")
            throw new HttpResponseException(System.Net.HttpStatusCode.Forbidden);

        base.OnActionExecuting(actionContext);
    

示例控制器:

public class Foo

    public string Id  get; set; 
    public DateTime Time  get; set; 


public class FoosController : ApiController

    // PUT api/foos/5
    [ApiAuthorizationFilter]
    public Foo Put(int id, Foo model, [FromUri]string param1 = null, int? param2 = null)
    
        return model;
    

其他答案在说什么......他们是对的,如果您可以访问 URL 上所需的所有内容,则可以通过请求获取内容;但是,我认为模型和请求内容应该单独保留:

var queryStringCollection = HttpUtility.ParseQueryString(actionContext.Request.RequestUri.Query);

    //example for param1
    string param1 = queryStringCollection["param1"];
    //example for param2
    int param2 = int.Parse(queryStringCollection["param2"]);
    //Example of getting the ID from the URL
    var id = actionContext.Request.RequestUri.Segments.LastOrDefault();

【讨论】:

我可以使用HttpContext.Current.Request.Params 吗? @ArjunVachhani 你应该可以使用 actionContext.Request.Params 我找不到名称为Params 的房产。 [FromUri] 参数注释正是我想要的! :) @MarkJones 在 AuthorizeAttibute 而不是 actionfilter 中以任何方式执行此操作【参考方案2】:

当调用/api/client/123/users 之类的东西时,我访问了上下文路由数据以从自定义 AuthorizeAttribute 中获取参数:

public class CustomAuthorizeAttribute : AuthorizeAttribute
  
     protected override bool IsAuthorized(System.Web.Http.Controllers.HttpActionContext actionContext)
     
        var clientId = Convert.ToInt32(actionContext.ControllerContext.RouteData.Values["clientid"]);

        // Check if user can access the client account.

     
  

【讨论】:

知道为什么它对我来说是空的吗?我正在使用查询字符串执行 GET 请求。 这里不获取查询参数,只获取路由。【参考方案3】:

您可以使用以下代码从自定义授权属性访问查询字符串值:

public class ApiAuthorizationFilter : AuthorizeAttribute

    protected override void OnAuthorization(AuthorizationContext filterContext)
    
        var querystring = filterContext.RequestContext.HttpContext.Request.QueryString;
        // Do what you need
    

【讨论】:

【参考方案4】:

虽然这个问题已经回答了。但如果其他人需要它,您可以从 ActionFilterAttribute 获取查询字符串,如下所示:

public class ApiAuthorizationActionFilter : ActionFilterAttribute

    public override void OnActionExecuting(HttpActionContext actionContext)
    
        var queryParameters = actionContext.Request.GetQueryNameValuePairs().ToDictionary(x => x.Key, x => x.Value);

        var some_value = queryParameters.ContainsKey("some_key")
                    ? queryParameters["some_key"] : string.Empty;

        // Log Action Filter call
        base.OnActionExecuting(actionContext);
    

但通常我构建 API 授权的方式是使用标头和自定义验证逻辑,方法是针对用户/客户端等向数据库添加密钥(唯一字符串)。

public class ApiAuthorizationActionFilter : ActionFilterAttribute

    public override void OnActionExecuting(HttpActionContext actionContext)
    
        var headers = actionContext.Request.Headers.ToDictionary(x => x.Key, x => x.Value);

        string api_key = headers.ContainsKey("api_key") ? headers["api_key"].FirstOrDefault() : null;

        bool canAccessApi = IsValidKey(api_key);

        if (!canAccessApi)
            actionContext.Response = actionContext.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, "You do not have access to this API. Please use a valid key.");

        // Log Action Filter call
        base.OnActionExecuting(actionContext);
    

    private bool IsValidKey(string api_key)
    
        //Build Access Control Logic here using database keys...
        return true;
    

【讨论】:

不过要小心 ToDictionary。 ?ids=1&ids=2 是传递集合的有效方式,因此可能没有唯一键。 @TroelsLarsen,你是对的。但不确定这个问题是否被问到。不过,我赞同你的意见。谢谢 actionContext.Request 是“HttpRequestMessage”的一个实例,不包含“GetQueryNameValuePairs”方法 @AlessandroLallo,我已经更新了要添加的答案,这可以使用“ActionFilterAttribute”来完成,在这种情况下代码可以工作。你可以再检查一下。【参考方案5】:

您应该可以从actionContext.Request 获取此信息 这是获取请求数据的方式。

发布的数据在actionContext.Request.Content 或者,如果是 GET 请求,您可以从 actionContext.Request.RequestUri 获取查询字符串

【讨论】:

我只能从 request.content 访问路由值,不能访问任何参数。 好吧,那我一定是搞错了。对不起。您是否尝试过:HttpContext.Current.Request? 是的。我也试过了,但我找不到帖子数据。

以上是关于mvc web api 关于post参数怎么接收,求教的主要内容,如果未能解决你的问题,请参考以下文章

asp.net mvc webapi接收参数问题

Angular2 HTTP Post ASP.NET MVC Web API

如何使用 MVC Web Api GET 将对象作为参数传递

无法使用具有多个参数的 MVC Web Api HttpPost 修饰操作

关于post中文post,一个gbk编码的网站里post提交中文参数到utf接收页 导致中文乱码,这个怎么处理

使用 mvc 视图中的参数从 jquery 调用 web api