如何在WebAPI中获取POST数据?

我以下面的forms向服务器发送一个请求:

http://localhost:12345/api/controller/par1/par2 

该请求被正确parsing为一个方法,如:

 [HttpPost] public void object Post(string par1, string par2) 

但是,我通过请求内容传递其他数据。 我如何检索这些数据?

为了举例,假设请求是从表单发送的:

 <form action="http://localhost:12345/api/controller/par1/par2" method="post"> <input type="hidden" name="data" value="value" /> <input type="submit" name="submit" value="Submit" /> </form> 

从这个问题的答案 : 如何使用asp.net webapi获取Json Post的值

  1. 使用参数绑定Autoparse; 请注意dynamicJToken ,因此.Value访问器。

     public void Post([FromBody]dynamic value) { var x = value.var1.Value; // JToken } 
  2. 阅读就像Request.RequestUri.ParseQueryString()[key]

     public async Task Post() { dynamic obj = await Request.Content.ReadAsAsync<JObject>(); var y = obj.var1; } 
  3. 与#2相同,只是不是asynchronous(?),所以你可以在辅助方法中使用它

     private T GetPostParam<T>(string key) { var p = Request.Content.ReadAsAsync<JObject>(); return (T)Convert.ChangeType(p.Result[key], typeof(T)); // example conversion, could be null... } 

警告 – 期待媒体types的application/json为了触发JsonMediaTypeFormatter处理。

今天花了很多时间试图把我的大脑围绕在处理Web表单数据的旧方式和如何用WebAPI完成之间的(重要但强大的)范式转换之后,我想我会把2美分添加到这个讨论。

我想做什么(这对于POST的Web表单处理来说很常见)就是能够以任何顺序获取我想要的任何表单值。 像你可以做,如果你有你的数据在System.Collections.Specialized.NameValueCollection 。 但事实certificate,在WebAPI中,来自POST的数据以stream的forms返回给您。 所以你不能直接做到这一点。

但是有一个叫FormDataCollection (在System.Net.Http.Formatting中)的很酷的小类,它可以让你做一次遍历你的集合。

所以我写了一个简单的实用程序方法,它将通过FormDataCollection运行一次并将所有值粘贴到NameValueCollection 。 一旦完成,您可以将所有数据跳到您的内容。

所以在我的ApiController派生类中,我有一个像这样的post方法:

  public void Post(FormDataCollection formData) { NameValueCollection valueMap = WebAPIUtils.Convert(formData); ... my code that uses the data in the NameValueCollection } 

我的静态WebAPIUtils类中的Convert方法如下所示:

  /// <summary> /// Copy the values contained in the given FormDataCollection into /// a NameValueCollection instance. /// </summary> /// <param name="formDataCollection">The FormDataCollection instance. (required, but can be empty)</param> /// <returns>The NameValueCollection. Never returned null, but may be empty.</returns> public static NameValueCollection Convert(FormDataCollection formDataCollection) { Validate.IsNotNull("formDataCollection", formDataCollection); IEnumerator<KeyValuePair<string, string>> pairs = formDataCollection.GetEnumerator(); NameValueCollection collection = new NameValueCollection(); while (pairs.MoveNext()) { KeyValuePair<string, string> pair = pairs.Current; collection.Add(pair.Key, pair.Value); } return collection; } 

希望这可以帮助!

直接处理多个参数是很困难的。 更好的方法是创build一个视图模型类。 然后你有一个参数,但参数包含多个数据属性。

 public class MyParameters { public string a { get; set; } public string b { get; set; } } public MyController : ApiController { public HttpResponseMessage Get([FromUri] MyParameters parameters) { ... } } 

然后你去:

 http://localhost:12345/api/MyController?a=par1&b=par2 

参考: http : //www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api

如果你想使用“/ par1 / par2”,你可以注册一个asp路由规则。 例如routeTemplate:“API / {controller} / {action} / {a} / {b}”。

http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

我有一个与多个参数发送请求的问题。

我已经通过发送一个类,使用旧的参数作为属性来解决它。

 <form action="http://localhost:12345/api/controller/method" method="post"> <input type="hidden" name="name1" value="value1" /> <input type="hidden" name="name2" value="value2" /> <input type="submit" name="submit" value="Submit" /> </form> 

模型类:

 public class Model { public string Name1 { get; set; } public string Name2 { get; set; } } 

控制器:

 public void method(Model m) { string name = m.Name1; } 

我发现我的用例更有用,希望它能帮助其他人花费时间应用此答案

 public IDictionary<string, object> GetBodyPropsList() { var contentType = Request.Content.Headers.ContentType.MediaType; var requestParams = Request.Content.ReadAsStringAsync().Result; if (contentType == "application/json") { return Newtonsoft.Json.JsonConvert.DeserializeObject<IDictionary<string, object>>(requestParams); } throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } 

有一种方法来处理Web Api控制器中的表单发布数据?

ASP.NET Web API中的常规方法是将表单作为模型表示,以便媒体types格式化程序对其进行反序列化。 另一种方法是将操作的参数定义为NameValueCollection:

 public void Post(NameValueCollection formData) { var value = formData["key"]; }