在和第三方对接开发接口的时候,出现了一个问题,即使用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级别的日志查看我们自己到底发送了什么报文过去

1. 新建接口 1.1 创建Collection集合 在刚开始一个项目时,为了后续便于组织和管理,把同属该项目的多个 API,放在一组。所以要先去新建一个 Collection: New -> Collection 1.2 创建请求 1.3 设置HTTP请求 设置 HTTP 的 Method 方法和输入 api 的地址以及请求参数或请求体 以下为获取微信公众号为案例所设计的HTTP请求 GET是请求方法,请求方法是HTTP请求的必要要素,常见的请求方法有GET和PO
问题来自于生产的一个批量处理提交操作,当POST请求提交的数据量过大时,就会产生错误,发生例如:超时、504等等现象。惊讶之余,并不着急解决BUG,更想弄清楚为什么POST请求会出现这种情况,第一反应就是打开Apache Tomcat官网去找参数。因为之前有做过容器定制,所以在面改过不少东西大致清楚在哪限制了。 下面也不墨迹了直接发链接:http://tomcat.apache.org/to...
根据提供的引用内容,可以得出以下结论和建议: Postman是一个常用的API测试工具,可以用来发送HTTP请求并查看响应。如果使用Postman发送报文能够得到正确的响应,但使用代码发送报文却返回500错误,那么问题可能出现在代码中。可以尝试检查代码中的报文发送方式、报文内容、请求头等方面,确保与Postman中的设置一致。如果还是无法解决问题,可以考虑使用其他工具或者联系对方进行协助。 另外,如果在使用Ajax请求时遇到问题,可以检查请求头中的content-type是否正确设置。如果设置了application/json,但是后端没有正确处理这种请求类型,就会导致请求失败。可以尝试将content-type设置为其他类型或者不设置,看看是否能够解决问题