首页 新闻 搜索 专区 学院

webapi接口传递数组问题

0
悬赏园豆:60 [已解决问题] 解决于 2015-11-07 15:11

接口是这么写的

/// <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=%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 
把[{这个给编译了,请问各位大神 这怎么解决啊  我们服务器要的格式如下:
{
  "ProcudtList": [
    {
      "ProductId": "sample string 1"
    },
    {
      "ProductId": "sample string 1"
    },
    {
      "ProductId": "sample string 1"
    }
  ]
}

 

yjq_net的主页 yjq_net | 初学一级 | 园豆:2
提问于:2015-11-06 10:00
< >
分享
最佳答案
0

你可以这样试一下:

1 return HttpMessage.JsonFormat(new {
2        state = "success",
3        list = new {"ProductList":model}
4 });

 

收获园豆:35
seayxu | 大侠五级 |园豆:5468 | 2015-11-06 10:48

我的意思是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_net | 园豆:2 (初学一级) | 2015-11-06 10:50

@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 | 园豆:5468 (大侠五级) | 2015-11-06 11:20

@SeayXu: 就是说我这边要改下解析数据的方法,对吧,我试试

yjq_net | 园豆:2 (初学一级) | 2015-11-06 11:35

@yjq_叶: 都可以,你试试就知道了

seayxu | 园豆:5468 (大侠五级) | 2015-11-06 11:42

@SeayXu: 我发现这样改了之后跟我接口写个就收字符串 然后把字符串转成对象没啥区别了啊

yjq_net | 园豆:2 (初学一级) | 2015-11-06 12:29

@yjq_叶: 不知道你到底要干嘛了

seayxu | 园豆:5468 (大侠五级) | 2015-11-06 13:07

@SeayXu: 我想要的是 怎么能够让APP那边传送{"ProductList":[{"ProductId":"1"},{"ProductId":"2"},{"ProductId":"3"}]}这种格式数据给我  然后我服务端不需要做其他处理就能够使用的,这样可以吗?

yjq_net | 园豆:2 (初学一级) | 2015-11-06 13:09

@yjq_叶: 上面说了,在发送的时候加上外面的一层就ok了。

seayxu | 园豆:5468 (大侠五级) | 2015-11-06 13:11

@SeayXu: 那么我接口这边也需要再加一层吗?原封不动吗还是?

yjq_net | 园豆:2 (初学一级) | 2015-11-06 13:13

@yjq_叶: 接口可以不需要,这个看你怎么操作方便怎么改

seayxu | 园豆:5468 (大侠五级) | 2015-11-06 13:16

@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_net | 园豆:2 (初学一级) | 2015-11-06 13:31

@yjq_叶: 应该是解析的有问题,看下你解析的代码

seayxu | 园豆:5468 (大侠五级) | 2015-11-06 13:37

@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_net | 园豆:2 (初学一级) | 2015-11-06 13:39

@yjq_叶: 试试:JsonHelper.Deserialize<ICheckListProducts>(str.Split('=')[1]);

宁涛 | 园豆:348 (菜鸟二级) | 2015-11-06 14:50

@宁涛: 我试了下json转换出错了

yjq_net | 园豆:2 (初学一级) | 2015-11-06 15:03

@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]);
宁涛 | 园豆:348 (菜鸟二级) | 2015-11-06 15:33

@宁涛: 

这是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他们操作的时候 发生了错误

yjq_net | 园豆:2 (初学一级) | 2015-11-06 15:44
其他回答(3)
0
      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
      }
收获园豆:10
宁涛 | 园豆:348 (菜鸟二级) | 2015-11-06 11:13

 那就是说我只能通过该接口了对吗?不能让APP来传输数据时实现我写的接口吗?

支持(0) 反对(0) yjq_net | 园豆:2 (初学一级) | 2015-11-06 11:16
0

是你调别人的接口,还是你给APP写接口,调APP端的接口的话,你该去问APP端返回的数据是什么,你该如何解析,你都不知道对面传的是什么类型,你在后台乱猜测,怎么解析的了

收获园豆:15
稳稳的河 | 园豆:4216 (老鸟四级) | 2015-11-06 16:11

是APP调用我的接口,如果实在不行的话 我就打算使用字符串格式,然后自己对字符串格式进行处理

支持(0) 反对(0) yjq_net | 园豆:2 (初学一级) | 2015-11-06 16:13

@yjq_叶: 调用你的,你直接传json,和他们统一就行,接口对接主要就是要双方同时进行,别单方面的,你不是在写公共接口

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-11-06 16:15

@稳稳的河: 这我知道,我们原先这种格式都是利用APP他们穿json格式的字符串过来 然后我们对字符串进行解析的,现在我想试试有没有更方便的方法,但是试了好久都没成功,所以就来问问了

支持(0) 反对(0) yjq_net | 园豆:2 (初学一级) | 2015-11-06 16:17

@yjq_叶: 哦,json比你传数组快太多了,试试没什么关系

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-11-06 16:21

@稳稳的河: 现在的问题是他们现在这样传过来的数据我利用webapi直接解析不了

支持(0) 反对(0) yjq_net | 园豆:2 (初学一级) | 2015-11-06 16:23

@yjq_叶: 我发现你传的也不是数组呀,也是一个json,解下码吧

支持(0) 反对(0) 稳稳的河 | 园豆:4216 (老鸟四级) | 2015-11-06 16:28

@稳稳的河: 我要的是json,然后APP那边是以键值对的形式传过来的,就是外面这个ProcudtList对应的值是一个数组,然后在我获取的时候发现他被编码了,导致我获取不到这个对象了,然后就没有然后了,也试过直接传一个json字符串过来,但是最后都发现[{都被编码了

支持(0) 反对(0) yjq_net | 园豆:2 (初学一级) | 2015-11-06 16:31
0

我知道解决方法。要让APP他们在请求头里面设置位置报文头为json格式,然后其他数据都是一样传过来就可以了

yjq_net | 园豆:2 (初学一级) | 2015-11-07 15:09
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册