码迷,mamicode.com
首页 > 编程语言 > 详细

所说这几天遇到的.net api 和java平台对接遇到的坑及技术总结

时间:2018-06-13 15:06:12      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:使用   style   pos   注释   过程   ati   adt   token   sort   

这两天 一直和京东对接接口,我们用.net api 提供接口,对方用java调用,本来没什么问题,但是对方对数据安全要求特别严,要验签,于是噩梦开始了。

1、在传输的时候,约定传输格式:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url);//+ "?RequestData="+ param
            request.Method = "POST";
            request.ContentType = "application/json";//参数是接送
            //request.ContentType = "application/x-www-form-urlencoded";//参数为&拼接
            request.ContentLength = param.Length;

 

2、双方平台对编码不一致,所以在对数据进行MD5加密前,先进行UTF8编码:

byte[] md5Token = md5.ComputeHash(Encoding.UTF8.GetBytes(data));
            string base64Token = Convert.ToBase64String(md5Token);

3、我们遇到了这个问题:https://bbs.csdn.net/topics/340058520

具体的描述就是C#和java对二进制的编码值不一样

java byte : -128~127
C#   byte : 0~255

但是,这只是视觉欺骗,做硬件的经理说,虽然两边看到对字符的编码得到的值不一样,但是,实际上,计算机对这个的值的识别是一样的。所以这根本就不是个问题。但是对方特别有毅力,反复的试了各种编码格式,于是我就跟在他后面,一个一个的试,又是远程合作,不得不佩服,研究生果然比我这种本科毕业的做事有毅力,然而,最后发现,是他在做加密的时候,忘记把私钥放进去了。哎,感觉身体被掏空┭┮﹏┭┮

4、Cookie在传输的过程中,+、/、=会丢失,所以使用了替换

string base64Token2 = base64Token.Replace(+, -).Replace(/, _).Replace(=, *);

5、我们使用模型接收数据,这时候,会出现数据接收不到的情况,那么上面1的ContentType 就显得比较重要了,既然我上面已经注释了,就不多写了。

6、应为我们使用模型接收数据,而对方见有的数据不是必填的,所以就没有写,这样对方填3个参数,进行加密计算,而我这边会把没有填的null值也加进来进行加密计算,并且计算的时候,我们这边采用序列化,使用两边还要对参数进行排序,所以,我们的加密结果始终不一样,崩溃┭┮﹏┭┮,中间考虑过用string接收参数,但是api不支持直接接收string参数,必须要加一个[FromBody]的标记,然而,问题有开始来了,对方的请求,根本进不来,继续崩溃┭┮﹏┭┮。最终我们还是使用模型对数据进行接收,不过接收参数的方式改了一下,用流来接收,这样,对方传什么,我们接收的就是什么,集体代码如下:

这是原来的代码

            var jsonSetting = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore };
            var dataOld = JsonConvert.SerializeObject(actionContext.ActionArguments[ArgumentsName], Formatting.Indented, jsonSetting);//这两行用来去除为空的参数

            dataOld = JsonSort.SortJson(JToken.Parse(dataOld), null);//排序

这是修改后的代码

Stream stream = HttpContext.Current.Request.InputStream;
                StreamReader streamReader = new StreamReader(stream);
                responseJson = streamReader.ReadToEnd();

可以看到 接收参数的方式由 actionContext.ActionArguments[ArgumentsName] 换成了下面的 streamReader.ReadToEnd()

 

所说这几天遇到的.net api 和java平台对接遇到的坑及技术总结

标签:使用   style   pos   注释   过程   ati   adt   token   sort   

原文地址:https://www.cnblogs.com/bamboo-zhang/p/9177087.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!