使用工具(Postman)能调通但使用代码调不通的问题分析及解决方法

问题描述

在和第三方对接开发接口的时候,出现了一个问题,即使用Postman发送报文过去给对方,对方能够返回结果过来,但是使用代码发送报文过去,却返回500错误。首先排除不是调用地址的问题,然后再排除不是调用方式的问题(即post请求变为了get请求)。然后再看看是不是报文内容有所不同,但是在代码里面报文发送之前就已经有日志打印了,发现报文内容和Postman里面是一模一样,那问题到底出现在哪里呢?

问题分析

找对方的人沟通,我代码发送请求给对方时,让他们看看他们收到的报文内容。结果傻眼了,用Postman发送报文的时候,他们的日志能正常显示接收到的报文,但是用代码发送报文的时候,对方日志显示的是“接收到的报文内容为null”。这就说明了用代码调他们是能够调通的,但是我代码调用过程中发送给他们的报文有问题,结果他们收到了null的报文(姑且这么认为)。通过询问公司的大佬们,了解到可以使用查看Feign的debug级别的日志查看具体发送了什么内容。

解决问题

设置Feign的日志级别为debug

这个过程分为三部

1.创建一个配置类

@Configuration
public class FeignConfiguration {

    @Bean
    Logger.Level feignLoggerLevel(){
        return Logger.Level.FULL;
    }

}

2.feign客户端的设置

@FeignClient(name = "${query.name}", configuration = FeignConfiguration.class)
public interface QueryClient {

    @PostMapping(value = "/Service/call")
    String getQueryData(@RequestBody JSONObject jsonObject);

}

这一步其实就是把配置类的属性加入到客户端的设置中,即configuration = FeignConfiguration.class这段代码

3.yml文件中加入

logging:
  level:
    com.foreign.feign.QueryClient: debug

4.最后在全局日志设置里面把控制台的日志级别设置为debug,不然就算fegin日志级别设置为debug了也是看不到debug日志的

查看日志

于是重启工程,再次发送报文给对方,然后在debug日志中发现了这么一块日志(日志有所删除,只保留核心部分)

DEBUG o.s.c.o.support.SpringEncoder - Writing [{"SERVICE":{"SERVICE_HEADER":{"SUB_TERMINAL_TYPE":"Android","VERSION_ID":"01","CHANNEL_ID":"BANK","ORG":"15601","SERVICESN":"APP2020052116583861818","OP_ID":"001","SERVICE_ID":"LoanQueryByCust","ACQ_ID":"10000000","REQUEST_TIME":"20200521165838","MAC":""},"SERVICE_BODY":{"REQUEST":{"CUST_NAME":"王大大3","ID_NO":"340602198512141876","PRODUCT_CODE":"6001","PRODUCT_GROUP":"KX001","QUERY_RANGE_IND":"01"}}}}] using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@2e3c5ecc]
DEBUG c.s.foreign.feign.QueryClient - [QueryClient#getQueryData] ---> POST http://29.23.35.3:31006/nmsRpcNonfinService/call HTTP/1.1
DEBUG c.s.foreign.feign.QueryClient - [QueryClient#getQueryData] Content-Length: 409
DEBUG c.s.foreign.feign.QueryClient - [QueryClient#getQueryData] Content-Type: application/json;charset=UTF-8
DEBUG c.s.foreign.feign.QueryClient - [QueryClient#getQueryData] X-CMSP-ApiRsskey: OGY5MDQwZmZjNzdhNDQ1N2FhYWZkNWEzNjcyYjZlZjUxNTcwNTg1NzgzMzc3
DEBUG c.s.foreign.feign.QueryClient - [QueryClient#getQueryData] X-CMSP-ApplicantCode: T134505761.NMS001.S00001
DEBUG c.s.foreign.feign.QueryClient - [QueryClient#getQueryData] X-CMSP-ClientServiceCode: aas-foreign-1
DEBUG c.s.foreign.feign.QueryClient - [QueryClient#getQueryData] X-CMSP-ClientServiceVersion: v1.0
DEBUG c.s.foreign.feign.QueryClient - [QueryClient#getQueryData] 
DEBUG c.s.foreign.feign.QueryClient - [QueryClient#getQueryData] {"SERVICE":{"SERVICE_HEADER":{"SUB_TERMINAL_TYPE":"Android","VERSION_ID":"01","CHANNEL_ID":"BANK","ORG":"15601","SERVICESN":"APP2020052116583861818","OP_ID":"001","SERVICE_ID":"LoanQueryByCust","ACQ_ID":"10000000","REQUEST_TIME":"20200521165838","MAC":""},"SERVICE_BODY":{"REQUEST":{"query_RANGE_IND":"01","product_CODE":"6001","cust_NAME":"王大大3","product_GROUP":"KX001","id_NO":"340602198512141876"}}}}
DEBUG c.s.foreign.feign.QueryClient - [QueryClient#getQueryData] ---> END HTTP (409-byte body)

可以看到,我用代码发送的报文内容并不是对方日志所收到的null,在这里推测一下,对方日志打印的并不是接收到的原始报文而是经过各种判断处理后的报文内容。可能我发送的报文格式不对导致对面处理报文时判断出报文内容不正确,于是对面就草草的打印了一个接收到的报文内容为null的日志。同时对面不会处理异常,按理说即使我的报文内容有误,也不应该返回一个500错误过来而是返回一个类似于“报文内容不正确”的信息给我。哎,对面的代码编写不规范啊。

言归正传,经过仔细查看这个段日志,我发现了这段日志的第一行和倒数第二行的报文内容不一样了,有部分的大写变成小写了

{"CUST_NAME":"王大大3","ID_NO":"340602198512141876","PRODUCT_CODE":"6001","PRODUCT_GROUP":"KX001","QUERY_RANGE_IND":"01"}

{"query_RANGE_IND":"01","product_CODE":"6001","cust_NAME":"王大大3","product_GROUP":"KX001","id_NO":"340602198512141876"}

那么为什么会这样呢,我分析是因为这部分内容导致的

using [org.springframework.http.converter.json.MappingJackson2HttpMessageConverter@2e3c5ecc]

即我的报文又经过了MappingJackson2HttpMessageConverter它的重新编码,导致了部分大写变成小写了

报文出错原因分析

那么为什么就只有这一部分的报文内容大写变成了小写而且是下划线的前段部分?是不是因为这部分的报文内容是通过查询数据库把数据放经javabean,然后再把javabean转换为JsonObject之后导致的?

于是便不用javabean转换为JsonObject的方式,而是把字段值一个一个put进去的方式,结果把这部分代码改了之后,发现,有结果返回了!

总结

1.首先报文的内容最好不要用大写字母,对方要求报文内容全部是大写,这就很离谱

2.作为服务方,首先需要把接收到的原始报文打印出来

3.异常处理要规范,像这种报文内容不正确的情况,不应该直接抛出异常而是需要返回一个错误结果给调用方

4.要是报文内容有大写的,最好是手动put字段值

5.可以开启debug级别的日志查看我们自己到底发送了什么报文过去

 

你可能感兴趣的:(编程方法)