1.问题背景
有一个拉取第三方数据存储到本地的需求,使用.net开发,使用httpClient发送post请求。第三方接口里面会校验我们发送的json数据,如果我们的数据格式不正确会抛出异常。
2.返回的结果不同?
第一步,我用postman做了测试,对方的接口可以调用,正确和错误都可以返回。
第二步,我使用代码测试,发现发送的json数据格式不正确的时候,返回的response里面没有错误信息,只有Bad RequestException
这让人大大不解
3.思考步骤
1.既然postman测试没有问题,人家的接口就是没有问题的,肯定是使用httpClient出了问题
2.研究哪里出了问题,但是调用的代码是超级简单的,哪边不对呢?
4.问题解决
最后发现postman使用正确json在请求成功的时候,状态200,成功输出了数据
在数据格式不正确时,返回如下,也是返回了数据。但是等等!!! 状态码是400!!!
然后我看了下,我.net代码里面有这样一句话
response.EnsureSuccessStatusCode()
这行代码是毁灭性的,我们点击查看他的源代码。
再看一下他判断的状态的代码
这下就清楚了,当对方返回了400状态后(虽然代入了异常信息),因为那一行代码的缘故,response里面不再是对方返回的异常信息,而是我们自己的ex里面的message。EnsureSuccessStatusCode方法抛出了异常。
删除这行代码,问题解决。
5.思考
1.我觉得加入EnsureSuccessStatusCode 并没有问题,但是没有正确理解这行代码,这行代码的意思是检验http状态码,不正确就抛出异常
2.对方的接口是不好的接口。正确的方式应该返回的状态码依然是200,但是信息是错误信息。但是第三方的接口直接就抛出了一个400的异常。
3.这里有一个思考,接口有异常信息是直接{400,message},还是{200.message},就是http请求一直是ok,只是用信息标注请求的异常信息。