如何在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的值
-
使用参数绑定Autoparse; 请注意
dynamic
由JToken
,因此.Value
访问器。public void Post([FromBody]dynamic value) { var x = value.var1.Value; // JToken }
-
阅读就像
Request.RequestUri.ParseQueryString()[key]
public async Task Post() { dynamic obj = await Request.Content.ReadAsAsync<JObject>(); var y = obj.var1; }
-
与#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"]; }