WebAPI从Post的Body中解析出JObject格式的Request参数

本文介绍了一种用于解析HTTP POST请求Body中输入数据的方法,并将其转换为JObject对象的过程。该方法通过读取输入流并使用Newtonsoft.Json库进行JSON反序列化实现。

方法如下:

        /// <summary>
        /// 解析参数(Post请求Body中的输入)
        /// </summary>
        /// <param name="s">输入的文件流</param>
        /// <returns>解析所得JObject对象</returns>
        public static JObject Parse(Stream s)
        {
            //s = HttpContext.Current.Request.InputStream;
            JObject jObject = new JObject();
            try
            {
                using (var sr = new StreamReader(s, Encoding.UTF8))
                using (var jsonTextReader = new Newtonsoft.Json.JsonTextReader(sr))
                {
                    jObject = (new Newtonsoft.Json.JsonSerializer()).Deserialize(jsonTextReader) as JObject;
                }
            }
            catch (Exception e)
            {
                Log.Loging.Error(ResponseManager.FailureWithInvalidParameters());
            }
            return jObject;
        }


WebAPI程序中,处理方法参数的方式会根据请求方法(如GET、POST)的不同而有所区别,以下是详细介绍: ### GET请求参数处理 - **直接定义**:在WebAPI的方法中直接定义参数参数名需与URL中传递的参数名一致。例如,URL为`http://localhost:12345/api/Echo?arg1=value1&arg2=value2`,WebAPI方法可以这样定义: ```csharp public IHttpActionResult Echo(string arg1, string arg2) { // 处理逻辑 return Ok(); } ``` - **通过`request.QueryString`方法取值**:在方法内部通过`Request`对象的`QueryString`属性来获取参数值。示例代码如下: ```csharp public IHttpActionResult Echo() { string arg1 = Request.RequestUri.ParseQueryString()["arg1"]; string arg2 = Request.RequestUri.ParseQueryString()["arg2"]; // 处理逻辑 return Ok(); } ``` - **通过定义的类来接收**:创建一个类来封装参数,类前面需要加上`[FromUri]`特性。示例如下,首先创建一个实体类: ```csharp namespace WebApi.Models { public class EchoParams { public string arg1 { get; set; } public string arg2 { get; set; } } } ``` 然后在WebAPI方法中使用该类接收参数: ```csharp public IHttpActionResult Echo([FromUri] EchoParams parameters) { // 处理逻辑 return Ok(); } ``` ### POST请求参数处理 - **通过定义的类来接收**:使用定义的类接收参数,与GET请求的区别是要加上`[FromBody]`特性,从请求体中获取参数。示例如下,创建一个类: ```csharp namespace WebApi.Models { public class PostParams { public string param1 { get; set; } public string param2 { get; set; } } } ``` 在WebAPI方法中使用该类接收参数: ```csharp public IHttpActionResult PostMethod([FromBody] PostParams parameters) { // 处理逻辑 return Ok(); } ``` - **定义`JObject`对象接收**:如果每次都定义一个类比较麻烦,可以定义一个`JObject`对象来接收不同的参数,需要引用`using Newtonsoft.Json.Linq;`命名空间。示例代码如下: ```csharp using Newtonsoft.Json.Linq; public IHttpActionResult PostMethod(JObject json) { string param1 = json["param1"]?.ToString(); string param2 = json["param2"]?.ToString(); // 处理逻辑 return Ok(); } ``` - **通过`request.Form`获取参数**:在方法内部通过`Request`对象的`Form`属性来获取参数值。示例代码如下: ```csharp public IHttpActionResult PostMethod() { var formData = Request.Content.ReadAsFormDataAsync().Result; string param1 = formData["param1"]; string param2 = formData["param2"]; // 处理逻辑 return Ok(); } ``` - **单个参数的特殊处理**:如果只有一个参数,前端可将参数名设为空,WebAPI可以随意定义变量参数直接接受。例如前端请求: ```javascript $.ajax({ url: 'yourApiUrl', type: 'POST', data: '=singleParamValue', success: function (response) { // 处理响应 } }); ``` WebAPI方法可以这样定义: ```csharp public IHttpActionResult PostSingleParam(string singleParam) { // 处理逻辑 return Ok(); } ``` ### 其他注意事项 在URL中传递多个参数时,总长度有URL长度限制,参数之间使用`&`分隔,特殊字符(如中文)需要使用`urlencode`进行转义。例如`http://localhost:12345/api/Echo?arg1=value1&arg2=value2&arg3=中文`,其中的中文等特殊字符需要进行转义处理。另外,WebAPI默认返回参数是XML或者JSON格式的,如果只需要返回JSON格式,可以在`App_Start`目录下的`WebApiConfig.cs`文件中添加相关代码进行配置: ```csharp public static class WebApiConfig { public static void Register(HttpConfiguration config) { // Web API 配置和服务 config.Formatters.Remove(config.Formatters.XmlFormatter); // 去掉默认的XML格式 var jsonFormatter = config.Formatters.JsonFormatter; jsonFormatter.SerializerSettings.Formatting = Newtonsoft.Json.Formatting.Indented; // 输结果缩进显示 jsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); // 将字段名称改成camelCase格式 } } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值