接口是这么写的
/// <summary> /// 测试接口 /// </summary> /// <param name="model"></param> /// <returns></returns> [HttpPost] public HttpResponseMessage GetMobileSms([FromBody]ICheckListProducts model) { IoHelper.WriteLogFile("这里是请求的头部===============" + new HttpRequestMessage().Headers); IoHelper.WriteLogFile("这里是请求的头部Form===============" + System.Web.HttpContext.Current.Request.Form); return HttpMessage.JsonFormat(new { state = "success", list = model }); }
[DataContract] public class ICheckListProducts { [DataMember(IsRequired = true)] public List<TextProduct> ProcudtList { get; set; } } public class TextProduct { public string ProductId { get; set; } }
然后APP端传了一个正确的json格式过来
但是我抓取的头部是这样的
{ "ProcudtList": [ { "ProductId": "sample string 1" }, { "ProductId": "sample string 1" }, { "ProductId": "sample string 1" } ] }
你可以这样试一下:
1 return HttpMessage.JsonFormat(new { 2 state = "success", 3 list = new {"ProductList":model} 4 });
我的意思是app在传输数据的时候 我服务器接收到数据是:ProcudtList=%5b%7b%22ProductId%22%3a%221%22%7d%2c%7b%22ProductId%22%3a%222%22%7d%2c%7b%22ProductId%22%3a%223%22%7d%5d这样的,不是服务器返回数据,是接收数据的时候出错了。/(ㄒoㄒ)/~~
@yjq_叶:
1 //原始 2 ProcudtList=%5b%7b%22ProductId%22%3a%221%22%7d%2c%7b%22ProductId%22%3a%222%22%7d%2c%7b%22ProductId%22%3a%223%22%7d%5d 3 //URL 解码 4 ProcudtList=[{"ProductId":"1"},{"ProductId":"2"},{"ProductId":"3"}]
你可以这样做:
①改服务端代码:在获取到数据后,重新组装下json字符串,或者是改下解析的代码;
②该客户端代码:在现有的数据外再套一层就好了,如下:
1 //原始 2 ProcudtList=%7b%22ProductList%22%3a%5b%7b%22ProductId%22%3a%221%22%7d%2c%7b%22ProductId%22%3a%222%22%7d%2c%7b%22ProductId%22%3a%223%22%7d%5d%7d 3 //URL解码 4 ProcudtList={"ProductList":[{"ProductId":"1"},{"ProductId":"2"},{"ProductId":"3"}]}
@SeayXu: 就是说我这边要改下解析数据的方法,对吧,我试试
@yjq_叶: 都可以,你试试就知道了
@SeayXu: 我发现这样改了之后跟我接口写个就收字符串 然后把字符串转成对象没啥区别了啊
@yjq_叶: 不知道你到底要干嘛了
@SeayXu: 我想要的是 怎么能够让APP那边传送{"ProductList":[{"ProductId":"1"},{"ProductId":"2"},{"ProductId":"3"}]}这种格式数据给我 然后我服务端不需要做其他处理就能够使用的,这样可以吗?
@yjq_叶: 上面说了,在发送的时候加上外面的一层就ok了。
@SeayXu: 那么我接口这边也需要再加一层吗?原封不动吗还是?
@yjq_叶: 接口可以不需要,这个看你怎么操作方便怎么改
@SeayXu:
Log Entry : 2015年11月06日 13:29:43
这里是请求的头部Form===============model=%7b%22ProcudtList%22%3a%5b%7b%22ProductId%22%3a14%7d%2c%7b%22ProductId%22%3a16%7d%2c%7b%22ProductId%22%3a99%7d%5d%7d
------------------------------------
Log Entry : 2015年11月06日 13:29:43
这里是请求的头部str===============model={"ProcudtList":[{"ProductId":14},{"ProductId":16},{"ProductId":99}]}
这是我抓取到的APP请求信息 但是我这边返回的结果还是ProcudtList:null
@yjq_叶: 应该是解析的有问题,看下你解析的代码
@SeayXu:
[HttpPost] public HttpResponseMessage GetMobileSms([FromBody]ICheckListProducts model) { IoHelper.WriteLogFile("这里是请求的头部===============" + new HttpRequestMessage().Headers); IoHelper.WriteLogFile("这里是请求的头部Form===============" + System.Web.HttpContext.Current.Request.Form); string str= System.Web.HttpUtility.UrlDecode(System.Web.HttpContext.Current.Request.Form.ToString()); IoHelper.WriteLogFile("这里是请求的头部str===============" + str); // System.Web.Script.Serialization.JavaScriptSerializer json = new System.Web.Script.Serialization.JavaScriptSerializer(); // model=JsonHelper.Deserialize<ICheckListProducts>(str); //model = (ICheckListProducts)json.Deserialize(str, typeof(ICheckListProducts)); return HttpMessage.JsonFormat(new { state = "success", list = model }); }
这是我的代码
public class ICheckListProducts { public List<TextProduct> ProcudtList { get; set; } }
这是类
public class TextProduct { public string ProductId { get; set; } }
@yjq_叶: 试试:JsonHelper.Deserialize<ICheckListProducts>(str.Split('=')[1]);
@宁涛: 我试了下json转换出错了
@yjq_叶:
winform下测试可以正常获取model。
string strRequest = "model=%7b%22ProcudtList%22%3a%5b%7b%22ProductId%22%3a14%7d%2c%7b%22ProductId%22%3a16%7d%2c%7b%22ProductId%22%3a99%7d%5d%7d"; string strContent = System.Web.HttpUtility.UrlDecode(strRequest); System.Web.Script.Serialization.JavaScriptSerializer json = new System.Web.Script.Serialization.JavaScriptSerializer(); ICheckListProducts model = json.Deserialize<ICheckListProducts>(strContent.Split('=')[1]);
@宁涛:
这是str的值:%7b%22ProcudtList%22%3a%5b%7b%22ProductId%22%3a14%7d%2c%7b%22ProductId%22%3a16%7d%2c%7b%22ProductId%22%3a99%7d%5d%7d
出错了,然后我想要的是不需要对服务器的代码做处理,就是我自己用本地的webapi调试的时候是可以通过的,但是app他们操作的时候 发生了错误
string strRequest = " ProcudtList=%5b%7b%22ProductId%22%3a%221%22%7d%2c%7b%22ProductId%22%3a%222%22%7d%2c%7b%22ProductId%22%3a%223%22%7d%5d"; string strContent = System.Web.HttpUtility.UrlDecode(strRequest); strContent = strContent.Split('=')[1]; System.Web.Script.Serialization.JavaScriptSerializer json = new System.Web.Script.Serialization.JavaScriptSerializer(); Object[] objArray = (Object[])json.DeserializeObject(strContent); foreach (Object obj in objArray) { Dictionary<string, Object> dic = (Dictionary<string, Object>)obj; // 逐项添加到ProcudtList }
那就是说我只能通过该接口了对吗?不能让APP来传输数据时实现我写的接口吗?
是你调别人的接口,还是你给APP写接口,调APP端的接口的话,你该去问APP端返回的数据是什么,你该如何解析,你都不知道对面传的是什么类型,你在后台乱猜测,怎么解析的了
是APP调用我的接口,如果实在不行的话 我就打算使用字符串格式,然后自己对字符串格式进行处理
@yjq_叶: 调用你的,你直接传json,和他们统一就行,接口对接主要就是要双方同时进行,别单方面的,你不是在写公共接口
@稳稳的河: 这我知道,我们原先这种格式都是利用APP他们穿json格式的字符串过来 然后我们对字符串进行解析的,现在我想试试有没有更方便的方法,但是试了好久都没成功,所以就来问问了
@yjq_叶: 哦,json比你传数组快太多了,试试没什么关系
@稳稳的河: 现在的问题是他们现在这样传过来的数据我利用webapi直接解析不了
@yjq_叶: 我发现你传的也不是数组呀,也是一个json,解下码吧
@稳稳的河: 我要的是json,然后APP那边是以键值对的形式传过来的,就是外面这个ProcudtList对应的值是一个数组,然后在我获取的时候发现他被编码了,导致我获取不到这个对象了,然后就没有然后了,也试过直接传一个json字符串过来,但是最后都发现[{都被编码了
我知道解决方法。要让APP他们在请求头里面设置位置报文头为json格式,然后其他数据都是一样传过来就可以了