工作中遇到的问题2019年7月8日

1、访问接口时,传String类型参数遇到的问题

问题描述:

  在A项目中访问B项目的接口,该接口中的参数为String类型,传递的是参数带有空格,t使用ApacheHttpClient请求,同通过postman和浏览器请求一样直接传递字符串参数,但是一直报参数格式不正确。

解决方法:

方法1: 访问之前,对参数进行URLEncode编码。
方法2: 使用HttpClient类中URIBuilder对象保存参数

URIBuilder ub = new URIBuilder(REQUEST_PATH);  //REQUEST_PATH:具体请求的参数
ub.addParameter("user_name", userName);  //添加请求参数以及参数值,这里userName不需要自己编码,ApacheHttpClient会自动给编码
String response = client.get(ub.toString(), headers);   //请求接口
原因

  不管是使用postman请求接口还是使用浏览器请求,它都会把传递的参数自动进行URL编码,传递给Nginx,Nginx再将参数解码(即,原始带有特殊字符的参数),然后传递给tomcat,tomcat进入该接口进行一系列的计算得到最后的结果。然而,自己使用HttpClient的get方法请求的时候,没有自动进行URL编码的功能,所以无法识别特殊字符。

2、memachache缓存存入对象

问题描述:

  刚开始是想直接使用memachache直接缓存对象,但是不知道当初为什么报错,就放弃了这一想法,就把对象转换成json串,然后使用JSONObject对象的parseObject()方法获取JSONobject对象,然后取出json串,然后再将json串转换成对象。虽然这一方法虽然麻烦了些,但是可用。可是上线后一直出现缓存结果混乱现象,导致客户端的显示结果时好时坏。

解决方法

  首先想到的是,是不是自己存缓存的逻辑哪里有问题,就去分析代码,发现一直没什么问题,老大就说我这样存缓存麻烦了,memachache可以直接存对象,然后就直接存就会,取出来后,不为null,就可以直接转换成对象,我就照做了,但是在改完仍有两处有问题。第一个错误就是对象没有序列化,序列化需要实现Serializable接口,并且

private static final long serialVersionUID = 1L;

这一部分,当时没写。第二个是在缓存中获取结果后,脑子里还想着之前的String类型,没想过已经是序列化的对象了,又把数据转成String后又进行的强制转换成对象,现在想想当时脑子真的是,哎,又被教育了,这也是应该的,谁让自己不想清楚呢。改完后,有上线,心想这回不应该出错了吧,没想到过了一会又开始保存,这回报错完全没想到,老大想了一会,他说你是不是上线没上全,我只上了线上外网机器,还有内网、消息、线上测试,都需要上,因为这是缓存,缓存就是供每台机器使用的,如果有一台出错了,那么其他机器取值的时候也会跟着出错。

教训总结

1、遇到问题要想清楚再动手,如果有拿不准的就亲自测试一下,别人告诉自己的,不要听完立刻去做,要好好想清楚每个细节,确保是正确的.
2、以后不管是否改缓存,上线都要上全,以免结果相互影响
3、如果缓存结构、缓存key改变了之后一定要把所有机器全都上一遍,如果结构换了未更新的机器会影响更新的机器,导致结果不正确;如果是改变的key,那么更新和未更新代码的机器就是在使用两套缓存,这样会导致访问不同的机器,缓存结果不一致。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值